4

我目前正在使用 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

这将不起作用,因为 Helm 需要一个values.yamlin 子图表。

我现在的解决方法是在 subchart/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

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

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

4

3 回答 3

4

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

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

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

...
spec:
  replicas: {{ .Values.replicas }}
...
  1. 然后,在主图表的值文件中:

    • 值-local.yaml

foochart:
  replicas: 1
  • 值-prod.yaml

foochart:
  replicas: 2
于 2018-02-02T19:23:44.197 回答
0

只是一个想法,需要进一步充实...

在 KubeCon 我看到一个演讲,他们介绍了一个名为Lostromos的 Kubernetes Operator 。这个想法是为了简化部署以支持多种不同的环境,并使维护这些东西更容易。它使用自定义资源定义。我想知道在这种情况下你是否可以利用 Lostromos。您的子图表将只有一个values.yaml,但使用lostromos 和一个 CRD 来输入您需要的属性。因此,您将改为部署 CRD,而 CRD 将触发 Lostromos 部署您的 Helm 图表。

只是为了让想法继续下去,但似乎值得探索。

于 2018-01-17T19:28:37.830 回答
-2

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

于 2019-01-28T21:19:50.443 回答