如何在kustomization.yaml中补丁修改Deployment的selector与标签的service名称
报错根因
- 若报错出现在
kubectl apply部署阶段:Kubernetes API原生规定Deployment的spec.selector.matchLabels字段创建后为不可变字段,无法通过补丁更新存量资源,和Kustomize工具本身无关。 - 若报错出现在
kustomize build构建阶段:你当前使用的JSON Patch语法缩进错误,导致Kustomize无法正确解析补丁规则。
可行实现方案
你按国家拆分独立环境目录的架构可以直接生成不同环境的独立Deployment,规避存量资源不可变字段限制,操作步骤如下:
步骤1:编写环境专属补丁文件
以country1环境为例,在env-country1目录下新建deployment-patch.yaml,修正缩进后的补丁内容如下:
- op: replace path: /metadata/name value: <serviceName>-country1 - op: replace path: /spec/selector/matchLabels/service value: <serviceName>-country1 - op: replace path: /spec/template/metadata/labels/service value: <serviceName>-country1
步骤2:配置环境层kustomization.yaml引用补丁
编辑env-country1/kustomization.yaml,内容参考如下:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization # 引用公共基础配置 resources: - ../base # 绑定Deployment补丁 patchesJson6902: - target: group: apps version: v1 kind: Deployment name: <base层Deployment的原始名称> # 替换为base目录下deployment.yaml里的metadata.name值 path: deployment-patch.yaml
步骤3:同步修改Service配置
Deployment的匹配标签修改后,需要同步修改同环境下Service的selector字段,新增Service补丁service-patch.yaml放入对应环境目录即可,示例内容:
- op: replace path: /spec/selector/service value: <serviceName>-country1
存量环境更新操作
如果对应环境已经部署过旧版本Deployment,直接apply会触发不可变字段报错,执行以下命令更新即可:
# 删除旧Deployment,保留存量Pod避免业务中断,新Deployment创建后会逐步滚动替换 kubectl delete deployment <旧Deployment名称> -n <目标命名空间> --cascade=orphan # 部署新配置 kustomize build env-country1 | kubectl apply -f -
内容的提问来源于stack exchange,提问作者Prabhat Mishra
相关产品推荐
相关产品推荐

