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

问题描述 投票:0回答:3

我使用 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?

kubernetes-helm
3个回答
9
投票

Chart.yaml
values.yaml
不会解析为模板。
参见https://helm.sh/docs/topics/charts/#templates-and-values -

所有模板文件都存储在图表的 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 图表中设置字段应用程序版本?”

不要。

使用运行时值。


1
投票
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

(或在构建图表之前

替换文件中的任何其他工具)来说也是微不足道的,这就是我们在引入此插件之前所做的事情。


0
投票

以上是官方文档的内容,可以通过helm初始化一个chart项目,然后在

Chart.yaml

看到

	

© www.soinside.com 2019 - 2024. All rights reserved.