我正在为我的应用程序构建一个头盔图,我正在使用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
这个子图,我将不得不手动将这些值放回去,而不是将它们保留在未触及的覆盖文件中......
提前感谢您的任何反馈!
答案 0 :(得分:1)
我在github上发现了这个问题 - 它还不支持: https://github.com/kubernetes/helm/issues/2133
答案 1 :(得分:1)
Helm 3.x(2019年第四季度)现在包括有关此内容的更多信息,但仅用于图表而非子图表(请参阅TBBle的comment)
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脚本。
在一个用例中,您需要将部署名称传递给您无法控制的依赖关系图。
例如,我正在尝试为Zookeeper设置
podAffinity
。我有一个应用程序头盔图,将Zookeeper设置为依赖项。在这种情况下,我正在通过值将容器
antiaffinity
传递给Zookeeper。因此,在我的应用values.yaml
文件中,我有一个zookeeper.affinity
部分。
如果我有能力在yaml值中获取发布名称,则只需将其设置为默认值即可。但是现在对于每个部署,我都必须重写此值,这是一个大问题。