roboll / helmfile

Deploy Kubernetes Helm Charts
MIT License
4.04k stars 566 forks source link

Subtree values with helmfile. #1126

Closed Vad1mo closed 4 years ago

Vad1mo commented 4 years ago

The Treafik helm chart requires a yaml sub-tree value for affinity: -> https://github.com/helm/charts/blob/master/stable/traefik/templates/deployment.yaml#L68

I would like to set that sub-tree value in the helmfile:

I tried to following options, non of them worked

    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
          - key: kubernetes.io/hostname
        operator: In
        values:
          - kubernetes-dev-master
    affinity: |
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
          - key: kubernetes.io/hostname
        operator: In
        values:
          - kubernetes-dev-master
    affinity: >
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
          - key: kubernetes.io/hostname
        operator: In
        values:
          - kubernetes-dev-master

There is an answer on SO https://stackoverflow.com/questions/51815600/how-to-include-nested-value-in-helm-template/51817009#51817009 on how to write a chart but not how to set the value.

Full YAML File

here is the full helmfile

repositories:
  - name: stable
    url: https://kubernetes-charts.storage.googleapis.com
releases:
  - name: traefik
    namespace: kube-system
    chart: stable/traefik
    values:
      - rbac.enabled: "true"
      - metrics.prometheus.enabled: "true"
      - kubernetes.ingressEndpoint.useDefaultPublishedService: "true"
      - affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
              - key: "kubernetes.io/hostname"
            operator: "In"
            values:
              - "kubernetes-dev-master"
      - replicas: "1"
      - dashboard.enabled: "true"
mumoshu commented 4 years ago

@Vad1mo affinity seems syntactically ok. if it doesn't work, i believe there's other errors.

also, you cant use dotted notations for keys under values:. "true" should be just true as you would do for regular helm values files. Same for "1", where it should be 1.

So, try

repositories:
  - name: stable
    url: https://kubernetes-charts.storage.googleapis.com
releases:
  - name: traefik
    namespace: kube-system
    chart: stable/traefik
    values:
      - rbac:
          enabled: true
        metrics:
          prometheus:
            enabled: true
        kubernetes:
          ingressEndpoint:
            useDefaultPublishedService: true
        affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
              - key: "kubernetes.io/hostname"
            operator: "In"
            values:
              - "kubernetes-dev-master"
        replicas: 1
        dashboard:
          enabled: true
Vad1mo commented 4 years ago

awesome, I finally got it working. Here is the working example, If you wan't you can dump it in the KB or examples forlder.

repositories:
  - name: stable
    url: https://kubernetes-charts.storage.googleapis.com
releases:
  - name: traefik
    namespace: kube-system
    chart: stable/traefik
    values:
      - rbac:
          enabled: true
      - metrics:
          prometheus:
            enabled: true
      - kubernetes:
          ingressEndpoint:
            useDefaultPublishedService: true
      - affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
                - matchExpressions:
                    - key: "kubernetes.io/hostname"
                      operator: In
                      values:
                        - "kubernetes-dev-master"
      - replicas: 1
      - dashboard:
          enabled: true
          domain: "traefik.example.com"
      - ssl:
          enabled: true
      - acme:
          enabled: true
          keyType: "EC256"
          email: "user@example.com"
      # service.nodePorts.http: "80"
      # service.nodePorts.https: "443"