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

时间:2017-12-01 09:56:24

标签: kubernetes go-templates kubernetes-helm

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

对于只有一个级别的简单图表,通过使用不同的值-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

这是行不通的,因为Helm期望子图中有values.yaml

我现在的解决方法是在子图/ values.yaml中创建一个if-else-construct,并将其设置为父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

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

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

3 个答案:

答案 0 :(得分:1)

我将如何做(参考overriding values):

  1. 在您的子图表(foochart)中将副本数量定义为变量:
    • foochart / values.yaml
  2. 
    ...
    replicas: 1
    ...
    
    • foochart /模板/ deployment.yaml
    
    ...
    spec:
      replicas: {{ .Values.replicas }}
    ...
    
    1. 然后,在主图表的值文件中:

      • 值-local.yaml
    2. 
      foochart:
        replicas: 1
      
      • 值-prod.yaml
      
      foochart:
        replicas: 2
      

答案 1 :(得分:0)

只是一个想法,需要更多地充实......

在KubeCon,我看到了a talk,他们在那里引入了名为Lostromos的Kubernetes运算符。我们的想法是简化部署以支持多种不同的环境,并使维护这些事情变得更容易。它使用Custom Resource definitions。我想知道你是否可以在这种情况下利用Lostromos。您的子图表只有一个$?|,但使用lostromos and a CRD to feed in the properties you need。因此,您将部署CRD而CRD将触发Lostromos部署您的Helm图表。

只是为了让想法得以实现,但似乎值得探索。

答案 2 :(得分:-1)

我目前正在从稳定/詹金斯获得图表,并正在尝试设置values.yaml文件。我进行了适当的更改,然后尝试运行'helm install -n --values = stable / jenkins,但是它将继续安装默认值,而不是我创建的修改后的yaml文件。更具体地说,我注释了yaml文件中的插件要求,因为它导致我的pod状态保持在Kubernetes上的“ Init:0/1”上。