kubectl patch 是什么
patch 用一条命令做局部更新,不必准备完整 YAML:默认的合并补丁按字段合并,适合改单个值;JSON 补丁按操作路径精确增删改,适合处理数组元素;简单合并补丁则以对象为单位替换,数组会被整体覆盖。它比在线编辑更适合脚本与流水线,在 CI 里临时改镜像标签、应急扩缩容都用得上;代价是改动同样只存在于集群里,需要回写或交给声明式工具收敛。
基本信息
| 默认类型 | 合并补丁(strategic),按字段与列表键合并 |
|---|---|
| JSON 补丁 | --type=json,用 op、path、value 精确控制,遵循 JSON Patch 规范 |
| 简单合并 | --type=merge,数组会被整体替换,容易误删元素 |
| 从文件读取 | --patch-file 指定补丁文件,避免命令行转义地狱 |
| 适用版本 | 所有受支持的 kubectl 版本,行为差异主要体现在合并语义 |
| 注意 | 对不可变字段打补丁会被拒绝,需要改写对象结构或重建 |
典型使用场景
- 应急扩缩容:临时把副本数从 2 调到 4 顶住流量
- 流水线里更新镜像标签,完成一次简单发布
- 精确修改数组中的某一项,如服务端口的某个字段
- 临时加注解触发滚动更新,验证变更链路是否可用
- 脚本里做条件更新:先判断再打补丁,避免整文件重写
使用示例
使用示例
kubectl patch deploy web -p '{"spec":{"replicas":4}}' # 默认合并补丁改副本数
kubectl patch deploy web -p '{"spec":{"template":{"metadata":{"annotations":{"restartedAt":"2026-10-13"}}}}}' # 触发滚动更新
kubectl patch svc web --type=json -p '[{"op":"replace","path":"/spec/ports/0/port","value":8080}]' # 精确改数组元素
kubectl get svc web -o json | head -40 # 先看结构,确认路径下标
kubectl patch deploy web --patch-file patch.yaml # 补丁较复杂时写到文件里三种补丁对照
| 类型 | 语义 | 适合场景 | 风险 |
|---|---|---|---|
| 合并补丁(默认) | 按字段与列表键合并 | 常规字段修改 | 列表键写错会作用到错误对象 |
| 简单合并 | 数组整体替换 | 简单字段设置 | 数组元素会被清空 |
| JSON 补丁 | 按路径精确操作 | 增删改数组元素 | 路径写错时定位困难 |
JSON 补丁的数组下标会随位置变化:执行前先看对象结构确认路径,不要凭记忆写下标。
补丁常用于流水线临时改动,这类操作同样会让集群状态与仓库脱节:发布完成后记得回写或由声明式工具接手。