You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在kustomization.yaml中补丁修改Deployment的selector与标签的service名称

报错根因

  1. 若报错出现在kubectl apply部署阶段:Kubernetes API原生规定Deployment的spec.selector.matchLabels字段创建后为不可变字段,无法通过补丁更新存量资源,和Kustomize工具本身无关。
  2. 若报错出现在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:36:11