如何使用 Helm 一次升级同一个图表的多个版本
How to upgrade at once multiple releases with Helm for the same chart
我有多个基于使用 Helm 部署的同一个图表的应用程序。假设您使用不同的配置多次部署您的应用程序:
helm install myapp-01 mycharts/myapp
helm install myapp-02 mycharts/myapp
helm install myapp-03 mycharts/myapp
更新图表文件后,我想更新所有版本,或者更新特定范围的版本。我设法创建了一个这样的 PoC 脚本:
helm list -f myapp -o json | jq -r '.[].name' | while read i; do helm upgrade ${i} mycharts/myapp; done
虽然这可行,但我需要做很多事情才能拥有完整的功能和错误控制。
是否有任何 CLI 工具或我可以在 CI/CD 环境中使用的东西来更新大量版本(比如数百个)?我一直在研究 Rancher 和 Autohelm,但找不到这样的功能。
感谢 @Jonas 提供的提示,我已经成功地创建了一个简单的结构来部署和更新大量具有相同图像基础的 pods。
我创建了这样的文件夹结构:
├── kustomization.yaml
├── base
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ ├── namespace.yaml
│ └── service.yaml
└── overlays
├── one
│ ├── deployment.yaml
│ └── kustomization.yaml
└── two
├── deployment.yaml
└── kustomization.yaml
所以这里的主要技巧是在主文件夹中有一个指向每个应用程序的 kustomization.yaml
文件:
resources:
- overlays/one
- overlays/two
namePrefix: winnp-
然后在 base/kustomization.yaml
中指向基础文件:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- service.yaml
- deployment.yaml
- namespace.yaml
然后在每个应用程序中,我为部署和服务使用命名空间、后缀和通用标签,以及重命名基本命名空间的补丁:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ns-one
nameSuffix: "-one"
commonLabels:
app: vbserver-one
bases:
- ../../base
patchesStrategicMerge:
- deployment.yaml
patches:
- target:
version: v1 # apiVersion
kind: Namespace
name: base
patch: |-
- op: replace
path: /metadata/name
value: ns-one
现在,只需一个简单的命令,我就可以部署或修改所有应用程序:
kubectl apply -k .
所以要更新图像,我只需用新图像更改 deployment.yaml
文件并再次 运行 命令。
我上传了我在此 GitHub repo
中所做的完整示例
我有多个基于使用 Helm 部署的同一个图表的应用程序。假设您使用不同的配置多次部署您的应用程序:
helm install myapp-01 mycharts/myapp
helm install myapp-02 mycharts/myapp
helm install myapp-03 mycharts/myapp
更新图表文件后,我想更新所有版本,或者更新特定范围的版本。我设法创建了一个这样的 PoC 脚本:
helm list -f myapp -o json | jq -r '.[].name' | while read i; do helm upgrade ${i} mycharts/myapp; done
虽然这可行,但我需要做很多事情才能拥有完整的功能和错误控制。 是否有任何 CLI 工具或我可以在 CI/CD 环境中使用的东西来更新大量版本(比如数百个)?我一直在研究 Rancher 和 Autohelm,但找不到这样的功能。
感谢 @Jonas 提供的提示,我已经成功地创建了一个简单的结构来部署和更新大量具有相同图像基础的 pods。
我创建了这样的文件夹结构:
├── kustomization.yaml
├── base
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ ├── namespace.yaml
│ └── service.yaml
└── overlays
├── one
│ ├── deployment.yaml
│ └── kustomization.yaml
└── two
├── deployment.yaml
└── kustomization.yaml
所以这里的主要技巧是在主文件夹中有一个指向每个应用程序的 kustomization.yaml
文件:
resources:
- overlays/one
- overlays/two
namePrefix: winnp-
然后在 base/kustomization.yaml
中指向基础文件:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- service.yaml
- deployment.yaml
- namespace.yaml
然后在每个应用程序中,我为部署和服务使用命名空间、后缀和通用标签,以及重命名基本命名空间的补丁:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ns-one
nameSuffix: "-one"
commonLabels:
app: vbserver-one
bases:
- ../../base
patchesStrategicMerge:
- deployment.yaml
patches:
- target:
version: v1 # apiVersion
kind: Namespace
name: base
patch: |-
- op: replace
path: /metadata/name
value: ns-one
现在,只需一个简单的命令,我就可以部署或修改所有应用程序:
kubectl apply -k .
所以要更新图像,我只需用新图像更改 deployment.yaml
文件并再次 运行 命令。
我上传了我在此 GitHub repo
中所做的完整示例