我正在寻找一种更好的方法来使用 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,我无法使用相同的技巧,因为我需要在 HelmRelease 中更新标签spec.values.image
,而 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
我怎样才能避免这种重复并避免在我的文件中添加越来越多的噪音?
谢谢!
答案1
找到了一个更干净的方法yq。
yq -ei '.spec.values.image.tag = "YOURTAG"' yourfile.yaml