覆盖kubernetes helm子图中的值

时间:2018-04-21 17:51:01

标签: kubernetes kubernetes-helm

我正在为我的应用程序构建一个头盔图,我正在使用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,但结果注释不执行变量插值,而是导致类似< / p>

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

我使用helm fetch安装了子图,我受到了(错误的?)印象,最好将获取的内容保持原样,并覆盖其中的值 - 但是,如果变量插值不适用于该方法,我必须将我的值放在子图的values.yaml中。

这是最好的做法吗?可以将自己的值放在提取的子图表values.yaml中吗?如果有一天我再次helm fetch这个子图,我将不得不手动将这些值放回去,而不是将它们保留在未触及的覆盖文件中......

提前感谢您的任何反馈!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

Helm 3.x(2019年第四季度)现在包括有关此内容的更多信息,但仅用于图表而非子图表(请参阅TBBlecomment

Milan Masek 添加为a comment

感谢latest Helm manual says how to achieve this

诀窍是:

  • "或yaml块|-中包含变量,并且
  • 然后在模板中以{{ tpl .Values.variable . }}引用它

这似乎使赫尔姆开心。

示例:

$ 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)}

对于头盔子图TBBle添加到issue 2133

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

恰好在为此票证打开的特定示例中有效,因为.Release.Name在所有子图中都应该相同。
.Chart.AppVersion示例中,它不适用于tpl

有人提出了在#3252中支持tval以便在值文件中插入模板的建议,但被取而代之的是针对Helm v3提出的基于lua的Hook系统:#2492 (comment) < / p>

最后一期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文件,这会中断,但是我正在考虑编写一个小的头盔包装,该包装实际上运行时会为每个values.yaml文件运行bash脚本。

fsniper再次说明了the issue

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

例如,我正在尝试为Zookeeper设置podAffinity。我有一个应用程序头盔图,将Zookeeper设置为依赖项。

在这种情况下,我正在通过值将容器antiaffinity传递给Zookeeper。因此,在我的应用values.yaml文件中,我有一个zookeeper.affinity部分。
如果我有能力在yaml值中获取发布名称,则只需将其设置为默认值即可。

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