如何用Kustomize为Deployment的所有容器批量添加卷及挂载点?
批量为Deployment所有容器添加卷及挂载点的Kustomize方案
推荐方案:使用Go模板补丁
这种方式无需指定容器名称或索引,自动遍历所有容器,还能处理容器原本没有volumeMounts字段的情况。
1. 创建卷添加补丁
新建add-shared-volume.yaml文件,用于给所有Deployment添加目标卷:
apiVersion: apps/v1 kind: Deployment metadata: name: placeholder # 占位符,会匹配所有目标Deployment spec: template: spec: volumes: - name: shared-data emptyDir: {} # 替换成你实际的卷配置(比如hostPath、PersistentVolumeClaim等)
2. 创建容器挂载点的Go模板补丁
新建add-volume-mounts.yaml文件,用Go模板遍历所有容器并追加挂载点:
apiVersion: apps/v1 kind: Deployment metadata: name: placeholder spec: template: spec: containers: {{- range .spec.template.spec.containers }} - name: {{ .name }} volumeMounts: {{- if .volumeMounts }} {{ toYaml .volumeMounts | indent 10 }} {{- end }} - name: shared-data mountPath: /mnt/shared # 替换成你需要的挂载路径 {{- end }}
这个模板会保留容器原有的volumeMounts(如果有),再追加新的挂载点;如果没有volumeMounts字段,会自动创建并添加。
3. 在kustomization.yaml中配置补丁
把两个补丁应用到所有8个Deployment:
resources: - deployment-1.yaml - deployment-2.yaml # ... 这里列出剩下的6个Deployment文件 patches: # 给所有Deployment添加卷 - path: add-shared-volume.yaml target: kind: Deployment name: "*" # 通配符匹配所有Deployment # 给每个Deployment的所有容器添加挂载点 - path: add-volume-mounts.yaml target: kind: Deployment name: "*" patchType: go-template # 声明使用Go模板类型的补丁
为什么原始方案不行?
- 用
containers/0只会修改第一个容器,且如果有多个容器,索引可能不符合预期; - 当容器没有
volumeMounts字段时,JSON Patch的add操作会因路径不存在报错,而Go模板补丁会自动创建该字段。
内容的提问来源于stack exchange,提问作者Yohan Courbe
相关产品推荐
相关产品推荐

