如何编辑 Kustomization 文件中的补丁项以使用 Helm 执行 gitops(并避免补丁堆积)

如何编辑 Kustomization 文件中的补丁项以使用 Helm 执行 gitops(并避免补丁堆积)

我正在寻找一种更好的方法来使用 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

相关内容