【问题标题】:overriding values in kubernetes helm subchartsKubernetes helm 子图中的覆盖值
【发布时间】:2020-03-13 19:45:33
【问题描述】:

我正在为我的应用程序构建一个舵图,并且我使用stable/nginx-ingress 作为子图。我有一个 overrides.yml 文件,其中包含(以及其他覆盖):

nginx-ingress:
  controller:
    annotations:
      external-dns.alpha.kubernetes.io/hostname: "*.{{ .Release.Name }}.mydomain.com"

所以,我尝试在覆盖文件中使用发布名称,我的命令类似于:helm install mychart --values overrides.yml,但生成的注释不会进行变量插值,而是会产生类似

Annotations: external-dns.alpha.kubernetes.io/hostname=*.{{ .Release.Name }}.mydomain.com

我使用helm fetch 安装了子图表,我有一种(被误导?)的印象,即最好将获取的东西保持原样,并覆盖其中的值 - 但是,如果变量插值是'该方法不可用,我必须将我的值放入子图表的values.yaml

对此有最佳实践吗?可以将我自己的值放在获取的子图表的values.yaml 中吗?如果有一天我再次helm fetch 这个子图表,我将不得不手动将这些值放回原处,而不是将它们留在未触及的覆盖文件中......

提前感谢您的任何反馈!

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    我在 github 上发现了这个问题——目前还不支持: https://github.com/kubernetes/helm/issues/2133

    【讨论】:

      【解决方案2】:

      Helm 3.x(2019 年第四季度)现在包含更多相关信息,但仅适用于图表,不适用于子图表(参见 TBBle's comment

      Milan Masek 添加为a comment

      谢天谢地,latest Helm manual says how to achieve this

      诀窍是:

      • " 或 yaml 块|- 中的封闭变量,以及
      • 然后在模板中将其引用为{{ tpl .Values.variable . }}

      这似乎让 Helm 很高兴。

      例子:

      $ cat Chart.yaml | grep appVersion
      appVersion: 0.0.1-SNAPSHOT-d2e2f42
      
      
      $ cat platform/shared/t/values.yaml | grep -A2 image:
      image: 
        tag: |-
          {{ .Chart.AppVersion }}
      
      
      $ cat templates/deployment.yaml | grep image:
                image: "{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }}"
      
      
      $ helm template . --values platform/shared/t/values.betradar.yaml | grep image
                image: "docker-registry.default.svc:5000/namespace/service:0.0.1-SNAPSHOT-d2e2f42"
                imagePullPolicy: Always
            image: busybox
      

      否则会抛出错误..

      $ cat platform/shared/t/values.yaml | grep -A1 image:
      image: 
        tag: {{ .Chart.AppVersion }}
      
      1 $ helm template . --values platform/shared/t/values.yaml | grep image
      Error: failed to parse platform/shared/t/values.yaml: error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Chart.AppVersion":interface {}(nil)}
      

      对于 Helm subchartTBBle 添加到 issue 2133

      @MilanMasek 的解决方案通常不适用于子图表,因为传递给 tpl 的上下文 . 将具有子图表的值,而不是父图表的值。

      它恰好在此票证打开的特定示例中起作用,因为.Release.Name 在所有子图表中应该是相同的。
      它不适用于.Chart.AppVersion,就像在tpl 示例中一样。

      #3252 中有一个支持 tval 的提议,用于在值文件中插入模板,但该提议被放弃,取而代之的是已为 Helm v3 提议的基于 lua 的 Hook 系统:#2492 (comment)

      最后一期 2492 包含类似this one 的解决方法:

      您可以在要模板化的文本中放置一个占位符,然后将该占位符替换为您希望在模板中的 yaml 文件中使用的模板。

      目前,我在 CI 工作中所做的是在 values.yaml 文件上运行 helm 模板。
      它在 atm 上运行良好。

      cp values.yaml templates/
      helm template $CI_BUILD_REF_NAME ./ | sed -ne '/^# Source: 
      templates\/values.yaml/,/^---/p' > values.yaml
      rm templates/values.yaml
      
      helm upgrade --install ...
      

      如果您有多个 -f values.yml 文件,这会中断,但我正在考虑编写一个小型 helm 包装器,它基本上运行每个 values.yaml 文件的 bash 脚本。

      fsniper再次说明the issue

      有一个用例,您需要将部署名称传递给您无法控制的依赖关系图表。

      例如,我正在尝试为 zookeeper 设置 podAffinity。我有一个应用程序掌舵图,它将 zookeeper 设置为依赖项。

      在这种情况下,我通过值将 pod antiaffinity 传递给 zookeeper。所以在我的应用程序 values.yaml 文件中,我有一个 zookeeper.affinity 部分。
      如果我能够在值 yaml 中获取发布名称,我只需将其设置为默认值并完成它。

      但是现在对于每个部署我都必须覆盖这个值,这是一个大问题。

      【讨论】:

      • 这不会像原始问题那样在子图表中起作用,因为当调用tpl 时,它会在子图表的上下文中评估.Chart.AppVersion,而不是在父图表的上下文中。
      • @TBBle 好的,感谢您的反馈。我已经相应地更新了答案,并将监控这些问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2018-08-19
      • 2020-12-29
      • 1970-01-01
      相关资源
      最近更新 更多