我正在尋找一種更好的方法來使用 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