我正在寻找一种更好的方法来使用 GitOps 更新在 HelmRelease 中定义的 docker 图像,因为我当前的方法会产生噪音。
在将 Helm 引入我使用 GitOps 管理的集群后,我发现了一些关于如何正确声明要在集群中使用的新 docker 映像构建的困难。
在部署中,我可以使用简单的 Kustomization 资源来替换图像元素,例如:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: my-namespace
resources:
- namespace.yaml
- my-deployment.yaml
images:
- name: my/image
newName: my/image
newTag: updated-tag
对于每个新版本,我只需修改文件
kustomize edit set image my/image=my/image:updated-tag
现在使用 Helm 我不能使用相同的技巧,因为我需要更新spec.values.image
HelmRelease 中的标签,而 Kustomize 似乎没有它的简写形式。所以选择是创建一个补丁:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: my-namespace
resources:
- namespace.yaml
- my-helm-release.yaml
patches:
- patch: '[{"op": "replace", "path": "/spec/values/image", "value": "my/image:updated-tag"}]'
target:
kind: HelmRelease
name: my-helm-release
namespace: my-namespace
通过使用类似的命令:
kustomize edit add patch \
--kind HelmRelease \
--name my-helm-release \
--namespace my-namespace --patch "[{\"op\": \"replace\", \"path\": \"/spec/values/image\", \"value\": \"my/image:updated-tag\"}]"
(不要介意引用的报价,请耐心等待)
多次运行此命令时会出现问题。虽然kustomize edit set image
覆盖了以前的值,但在后一种情况下,一个新patch
的附加到列表中,带有more-updated-tag
.
patches:
- patch: '[{"op": "replace", "path": "/spec/values/image", "value": "my/image:updated-tag"}]'
target:
kind: HelmRelease
name: my-helm-release
namespace: my-namespace
- patch: '[{"op": "replace", "path": "/spec/values/image", "value": "my/image:more-updated-tag"}]'
target:
kind: HelmRelease
name: my-helm-release
namespace: my-namespace
我怎样才能避免这种重复并为我的文件添加越来越多的噪音?
谢谢!
找到了一种更简洁的方法来使用yq。