【问题标题】:Best practice for setting the fqin in a Helm chart在 Helm 图表中设置 fqin 的最佳实践
【发布时间】:2022-01-10 12:55:33
【问题描述】:

我想要一个 CI 管道来构建图像和 Helm 图表。其中一部分当然是在发布之前设置 Helm 图表的 FQIN。

有很多关于如何在安装期间执行此操作的示例,但在打包期间没有。我很惊讶在https://helm.sh 上找不到这个常见用例的示例。 手动编辑图表的值文件不是一种选择,因为它是一个 CI 管道。

在不引入复杂 CICD 工具的情况下执行此操作的最佳做​​法是什么。

【问题讨论】:

  • 什么是“FQIN”?在您的 CD 管道中,您应该能够创建额外的 YAML(或等效的 JSON)文件并使用 helm install -f 选项传递它们;这可能是提供部署时设置的最可靠方式。
  • FQIN=完全限定图像名称 (repo/name:tag)。映像名称并不是真正的部署时间设置,它们在安装之间共享。我可以看到它会起作用,在安装时传递它,但你需要一个侧通道将图像名称传递给安装程序。

标签: kubernetes continuous-integration kubernetes-helm helm3


【解决方案1】:

您的“完全限定的映像名称”由三部分组成:注册表主机名、映像名称本身和映像的标记。我建议将所有三个作为 Helm 值传递,即使它们中只有一些会改变。

image: '{{ .Values.registry }}/{{ .Values.image }}:{{ .Values.tag }}'
registry: docker.io
image: my/image
tag: latest

(当 Docker Hub 开始限速时,我开始非常感谢您可以将注册表地址配置为指向本地镜像的图表。)

那么当你去实际部署镜像的时候,你需要指定标签。在 Kubernetes 中,您几乎都需要为每个构建使用唯一的标签。

docker build -t my/image:20211206 .
docker push my/image:20211206
helm upgrade --install --namespace myapp myapp ./charts/myapp \
  --set-string tag=20211206

如果您的 CI 系统可以写出 JSON 文件,请考虑将标签和其他部署时设置放入 JSON 文件,并将其作为 helm install -f 选项传递,而不是 --set--set-string。语法更加熟悉,您可以在需要时更好地控制对象类型。

还有一种替代方法,即在构建过程中实际编辑图表。您可能有一个“GitOps”风格的工作流程,其中您的构建系统的一部分实际上提交给源代码控制,并且由此产生的推送触发下一步。这有一些优点,因为它很容易验证一个阶段的文件输出,并且很容易看到确切部署的历史(因为部署历史是源代码控制历史)。

为此,您的 CI 系统本身需要更改 values.yaml 中的 tag:Chart.yaml 有一个 appVersion: 设置可以匹配此设置,此外,如果您要对图表本身进行自动更改,增加图表的 version: 是个好主意。 CI 系统将进行这些更改、提交和推送,然后推送将触发自身进行下一步部署。因为现在正确的设置在 values.yaml 你不需要--set-string 选项。

【讨论】:

  • 第一个可选的,让 helm 在安装时设置值是不令人满意的,因为它破坏了封装并且没有工具支持传递这些值。如果您有几个不共享版本的服务,那将非常麻烦。但是它确实有掌舵支持。第二种解决方案是我正在使用的解决方案,但我想知道为什么在打包期间没有对它的掌舵支持。
  • 您想到的解决方案的一个变体是有一个自动生成的伞舵图,它具有子图作为依赖项,并在值文件中包含特定的图像版本。这让您可以一次性安装完整的 ci 环境。
猜你喜欢
  • 1970-01-01
  • 2019-01-14
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 2018-10-04
  • 2011-12-08
相关资源
最近更新 更多