我使用 helm 在 k8s 中升级了 spring 应用程序。我有默认图表并使用命令
upgrade my-app my-app-chart --atomic --set image.tag=123
在 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 }}"
我希望 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
如何正确设置字段appVersion?
Chart.yaml
和 values.yaml
不会解析为模板。所有模板文件都存储在图表的 templates/ 文件夹中。当 Helm 渲染图表时,它将通过模板引擎传递该目录中的每个文件。
Chart.yaml
和 values.yaml
明确地 not 设计在该目录中,因此不能在其中有效嵌入模板操作 ({{...}}
)。
因此,虽然您可以在
Chart.yaml
中提供appVersion,它将充当后备/默认基值,但appVersion仅在helm create foo
中使用一次(在由templates/deployment.yaml
生成的默认图表中) -
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
(有趣的是,它被用作带有大写 A 的
AppVersion
,但在 Chart.yaml
中列为带有小写 A 的 appVersion
。)
当然,您可以只使用
sed
在运行时编辑图表,但是您必须先下载并解开软件包,这会打开另一罐蠕虫。如果可以避免,就不要这样做 - 而且由于您似乎能够编辑图表,因此您可以避免它。
根据文档,
该字段仅供参考,对图表版本计算没有影响。
事实上,完全可选 -
appVersion:包含的应用程序版本(可选)。不必是 SemVer。推荐报价。
所以,我的建议是完全删除它。根本不要依赖它。
如果您有一个在任何地方都可以的正常默认值,请将其设置为
values.yaml
,不过最好将其留空并要求它在部署时使用 --set
语句和/或
--values
文件进行设置。图表不需要从部署更改到部署,除非模型本身需要重构......假设您将其放在格式正确的存储库中。
helm upgrade "$name" "$chartRepo/$appName"
或者更有可能(在运行时设置变量)类似
helm upgrade -i -n "$targetEnv" "$appName" "$chartRepo/$appName" \
--set "image.repository=$dockerRepo/$appName,image.tag=$appVersion"
或
helm upgrade -i -n "$targetEnv" "$appName" "$chartRepo/$appName" -f run.yaml
(我知道这似乎很明显,但我看到很多人将 appVersion
硬编码到应用程序的每个版本的图表中,并将图表版本固定到应用程序发布版本,即使图表没有以其他方式改变了。) 总结 - “如何在 helm3 图表中设置字段应用程序版本?”
不要。
使用运行时值。Chart.yaml
中使用模板,看来你正在反向执行此操作。
我们使用 helm-gradle 插件,通过其 expansions
可以很容易地说“图表版本是项目版本”:
// expansions are replaced in the chart files if found in the form ${path.to.value}
expansions = [
helm: [
chartName:'my-chart',
chartVersion: project.version
],
anotherParam: project.version,
path: [
to: [
value: 'foobar'
]
]
]
在
Chart.yaml
:
appVersion: ${helm.chartVersion}
在使用
maven
的项目中,相同的 maven 插件将来不支持此扩展,但使用不同的 maven 插件来做到这一点很简单。
这对于sed
(或在构建图表之前
替换文件中的任何其他工具)来说也是微不足道的,这就是我们在引入此插件之前所做的事情。
以上是官方文档的内容,可以通过helm初始化一个chart项目,然后在
Chart.yaml
看到