如何在 helm3 图表中设置字段应用程序版本?

Tim*_*Tim 1 kubernetes-helm helm3

我使用 helm 在 k8s 中升级了 spring 应用程序。我有默认图表并使用命令

upgrade my-app my-app-chart --atomic --set image.tag=123
Run Code Online (Sandbox Code Playgroud)

在 dir my-app-chart 中我有文件 Chart.yaml

apiVersion: v1
name: my-app-chart
description: A Helm chart for spring application my-app-chart
version: "1"
appVersion: "{{ .Values.image.tag }}"
Run Code Online (Sandbox Code Playgroud)

我希望 helm 评估字段 appVersion 并且在 helm 历史记录中我看到 123,但现在我看到

C:\git\ci\top-ci-example-project-multi-module>helm history -n top-ci my-app
REVISION        UPDATED                         STATUS          CHART                  APP VERSION             DESCRIPTION

150             Wed Nov  3 00:30:09 2021        superseded      my-app-chart-0.1.0     0.1.0                   Rollback to 148

151             Wed Nov  3 00:38:38 2021        failed          my-app-chart-1         {{ .Values.image.tag }} Upgrade "top-ci-example-mul
ti-module-one" failed: timed out waiting for the condition
152             Wed Nov  3 00:38:49 2021        deployed        my-app-chart-0.1.0     0.1.0                   Rollback to 150
Run Code Online (Sandbox Code Playgroud)

如何正确设置字段appVersion?

Pau*_*ges 8

Chart.yaml&values.yaml不被解析为模板。
cf https://helm.sh/docs/topics/charts/#templates-and-values -

所有模板文件都存储在图表的 templates/ 文件夹中。当 Helm 渲染图表时,它将通过模板引擎传递该目录中的每个文件。

Chart.yaml&按照设计values.yaml明确不在该目录中,因此不能将模板操作 ( {{...}}) 有效地嵌入其中。

因此,虽然您可以提供一个 appVersionChart.yaml作为后备/默认基值,但appVersion仅在(在由 生成的默认图表中helm create foo)使用一次,即templates/deployment.yaml-

image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
Run Code Online (Sandbox Code Playgroud)

(有趣的是,它的使用方式AppVersion与大写 A 相同,但列出时与小写 AChart.yaml相同。)appVersion

当然,您可以只sed在运行时编辑图表,但是您必须先下载并解开软件包,这会打开另一罐蠕虫。如果可以避免,就不要这样做 - 而且由于您似乎能够编辑图表,因此您可以避免它。

根据文档,

该字段仅供参考,对图表版本计算没有影响。

事实上,完全是可选的-

appVersion:其中包含的应用程序的版本(可选)。不必是 SemVer。报价推荐。

所以,我的建议是完全删除它。根本不要依赖它。
如果您有一个在任何地方都可以的正常默认值,请将其设置为values.yaml,但最好将其留空并要求在部署时使用--set语句和/或--values文件进行设置。

图表不需要在部署之间进行更改,除非模型本身需要重构......假设您将其放在格式正确的存储库中。

helm upgrade "$name" "$chartRepo/$appName"
Run Code Online (Sandbox Code Playgroud)

或者更有可能(在运行时设置变量)类似

helm upgrade -i -n "$targetEnv" "$appName" "$chartRepo/$appName" \
   --set "image.repository=$dockerRepo/$appName,image.tag=$appVersion"    
Run Code Online (Sandbox Code Playgroud)

或者

helm upgrade -i -n "$targetEnv" "$appName" "$chartRepo/$appName" -f run.yaml
Run Code Online (Sandbox Code Playgroud)

(我知道这似乎很明显,但我看到很多人为应用程序的每个appVersion版本都硬编码到图表中,并将图表版本固定到应用程序发布版本,即使图表没有以其他方式更改。)

总结 - “如何在 helm3 图表中设置字段应用程序版本?”

不。使用运行时值。