简体   繁体   中英

How to set environment related values.yaml in Helm subcharts?

I am currently deploying my applications in a Kubernetes cluster using Helm. Now I also need to be able to modify some parameter in the values.yaml file for different environments.

For simple charts with only one level this is easy by having different values-local.yaml and values-prod.yaml and add this to the helm install flag, eg helm install --values values-local.yaml .

But if I have a second layer of subcharts, which also need to distinguish the values between multiple environments, I cannot set a custom values.yaml.

Assuming following structure:

| chart
   | Chart.yaml
   | values-local.yaml
   | values-prod.yaml
   | charts
      | foo-app
         | Chart.yaml
         | values-local.yaml
         | values-prod.yaml
         | templates
            | deployments.yaml
            | services.yaml

This will not work since Helm is expecting a values.yaml in subcharts.

My workaround right now is to have an if-else-construct in the subchart/values.yaml and set this in as a global variable in the parent values.yaml.

*foo-app/values.yaml*
    {{ - if .Values.global.env.local }}
        foo-app:
          replicas: 1
    {{ else if .Values.global.env.dev}}
        foo-app:
          replicas: 2
    {{ end }}

parent/values-local.yaml
global:
  env:
   local: true

parent/values-prod.yaml
global:
  env:
   prod: true

But I hope there is a better approach around so I do not need to rely on these custom flags.

I hope you can help me out on this.

Here is how I would do it (for reference overriding values ):

  1. In your child charts (foochart) define the number of replicas as a variable:
    • foochart/values.yaml

...
replicas: 1
...
  • foochart/templates/deployment.yaml

...
spec:
  replicas: {{ .Values.replicas }}
...
  1. Then, in your main chart's values files:

    • values-local.yaml

foochart:
  replicas: 1
  • values-prod.yaml

foochart:
  replicas: 2

Just an idea, needs to be fleshed out a bit more...

At KubeCon I saw a talk where they introduced a Kubernetes Operator called Lostromos . The idea was to simplify deployments to support multiple different environments and make maintaining these kinds of things easier. It uses Custom Resource definitions . I wonder if you can leverage Lostromos in this case. Your sub-charts would have a single values.yaml but use lostromos and a CRD to feed in the properties you need . So you would deploy the CRD instead and the CRD would trigger Lostromos to deploy your Helm chart.

Just something to get the ideas going but seemed like it might be worth exploring.

I'm currently getting my chart from stable/jenkins and am trying to set my values.yaml file. I have made the appropriate changes and try to run 'helm install -n --values= stable/jenkins but it continues to install the default values instead of the modified yaml file i created. To be more specific, I commented out the plug-in requirements in the yaml file since it has been causing my pod status to stay on 'Init:0/1' on Kubernetes.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM