如何在Helm子图中设置环境相关的values.yaml?

Tob*_*obi 4 go-templates kubernetes kubernetes-helm

我目前正在使用 Helm 在 Kubernetes 集群中部署我的应用程序。现在我还需要能够针对不同的环境修改values.yaml 文件中的一些参数。

对于只有一个级别的简单图表,通过使用不同的values-local.yaml 和values-prod.yaml 并将其添加到标志中很容易helm install,例如helm install --values values-local.yaml

但是如果我有第二层子图,也需要区分多个环境之间的值,我就无法设置自定义的values.yaml。

假设以下结构:

| 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
Run Code Online (Sandbox Code Playgroud)

这不会起作用,因为 Helm 期望values.yaml在子图中出现。

我现在的解决方法是在 subchart/values.yaml 中使用 if-else-construct 并将其设置为父 value.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 }}
Run Code Online (Sandbox Code Playgroud)
parent/values-local.yaml
global:
  env:
   local: true

parent/values-prod.yaml
global:
  env:
   prod: true
Run Code Online (Sandbox Code Playgroud)

但我希望有更好的方法,这样我就不需要依赖这些自定义标志。

我希望你能帮我解决这个问题。

Bos*_*ker 5

这是我的做法(作为参考覆盖值):

  1. 在您的子图表 (foochart) 中,将副本数定义为变量:
    • foochart/values.yaml

...
replicas: 1
...
Run Code Online (Sandbox Code Playgroud)
  • foochart/templates/deployment.yaml

...
spec:
  replicas: {{ .Values.replicas }}
...
Run Code Online (Sandbox Code Playgroud)
  1. 然后,在主图表的值文件中:

    • 值-local.yaml

foochart:
  replicas: 1
Run Code Online (Sandbox Code Playgroud)
  • 值-prod.yaml

foochart:
  replicas: 2
Run Code Online (Sandbox Code Playgroud)