0

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

upgrade my-app my-app-chart --atomic --set image.tag=123

在 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 }}"

我希望 helm 评估字段 appVersion 并且在 helm history 我看到 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?

4

3 回答 3

1

您不能在Chart.yamlafaik 中使用模板,似乎您正在反向执行此操作。

我们使用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 的相同插件将来不支持此扩展,但使用不同的 maven 插件来做到这一点很简单。

这也是微不足道的(或在构建图表之前sed替换文件中文本的任何其他工具),这也是我们在引入此插件之前所做的。

于 2021-11-03T14:50:07.463 回答
0

这是正在部署的应用程序的版本号。每次更改应用程序时,此版本号都应增加。版本不应遵循语义版本控制。它们应该反映应用程序正在使用的版本。

以上是官方文档的内容,可以通过helm初始化一个chart项目,然后在里面看到Chart.yaml

于 2021-11-03T03:12:51.843 回答
0

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

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

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

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

image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"

(有趣的是,它AppVersion与大写 A 一起使用,vutChart.yamlappVersion小写 A 一起使用。)

当然,您也可以只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 图表中设置字段应用程序版本?”

不。使用运行时值。

于 2022-02-21T22:02:32.343 回答