命令定位
kubectl patch 对集群里已存在的资源做最小化字段修改:只提交要变的那部分,不用整份清单覆盖。适用平台是 Kubernetes(kubectl 1.14 以后一直可用),需要对目标资源所在命名空间的 patch 权限。它与 edit 的区别是不开编辑器、可脚本化;与 apply 的区别是不读本地文件,因此不会顺手改动清单里的其他字段,适合临时调参、补标签、加注解这类小改动。
基本信息
| 适用平台 | Kubernetes(kubectl 客户端,版本与集群差异不超过一个次版本) |
|---|---|
| 作用对象 | 任意 API 资源:Deployment、Service、Node、CRD 自定义资源 |
| 权限要求 | 目标资源上的 patch 权限(RBAC verbs 含 patch) |
| 默认补丁类型 | strategic(对象合并),另有 merge 与 json |
典型使用场景
- 临时扩容验证容量:把 Deployment 副本数从 2 调到 3 观察稳定性,稳定后再回写清单
- 灰度开关:给现网工作负载补一个注解或环境变量,快速试探新参数
- 给节点补调度标签:为专用机器补上 disktype=ssd 之类的键值
- 批量维护:配合 -l 选择器给一批 Pod 统一加注解、去掉过期标记
- 修改自定义资源的单个 spec 字段,而不重写整个 CR 对象
常用示例
常用示例
kubectl patch deploy web -p '{"spec":{"replicas":3}}' # 默认 strategic 合并,只改副本数
kubectl patch svc web --type=json -p='[{"op":"replace","path":"/spec/sessionAffinity","value":"ClientIP"}]'
kubectl patch node node-1 --type=merge -p '{"metadata":{"labels":{"disktype":"ssd"}}}'
kubectl patch deploy web -p '{"spec":{"template":{"metadata":{"annotations":{"reload":"2026-10-13"}}}}}' # 触发滚动更新
kubectl get deploy web -o yaml | grep -A3 replicas # 改完先核对结果,再决定是否回写清单三种补丁类型
| 类型 | 合并语义 | 数组字段如何处理 |
|---|---|---|
| strategic(默认) | 按字段语义递归合并,只影响写到的键 | 按 name 键匹配合并,同名元素合并、不同名追加 |
| json(RFC 6902) | 显式 op 序列:add/remove/replace/test | 按下标精确定位,越界直接失败 |
| merge(RFC 7386) | 简单覆盖式合并,整体替换同名键 | 整个数组被替换,未列出的元素会丢失 |
JSON patch 里 replace 要求路径已存在,新增字段要用 add;写路径前先 kubectl get -o yaml 看清层级,路径写错是硬报错,不会静默忽略。
patch 只改服务端对象,不写回 Git。若集群由 CD 工具持续 apply,下一次同步可能覆盖掉临时修改,验证完记得把最终配置补进清单。