replace 的语义
kubectl replace 用清单整体替换一个已存在的对象,属于「以提供的内容为准」的更新方式:清单里没写的字段会回到默认值或空值,而不是保留现网设置。它适合 apply 难以覆盖的场景,例如字段语义冲突、需要严格按清单重写;配合 --force 还能通过删除重建处理不可变字段。要注意 --force 是删除后立即重建,重建期间对象短暂不存在。
基本信息
| 用途 | 用清单整体替换现网对象 |
|---|---|
| 语法 | kubectl replace -f <文件>;kubectl replace --force -f <文件> |
| 前置要求 | 对象必须已存在,否则直接报找不到资源 |
| --force 语义 | 删除后立即重建,用于不可变字段的处理 |
| 与 apply 的差别 | replace 不做三方合并,不保留现网中被别人改过的字段 |
典型使用场景
- 需要严格以清单为准:不接受现网残留字段的受控环境
- 处理不可变字段:借助 --force 重建对象完成变更
- 修复被手工改乱的对象:用干净清单整体覆盖回标准状态
- 演练与恢复:保留标准清单作为唯一真相来源
- 配合导出排查:先看现网对象,再决定用清单覆盖还是局部修正
常用示例
常用示例
kubectl replace -f svc.yaml # 整体替换已存在的对象
kubectl replace --force -f svc.yaml # 删除后重建,用于不可变字段
kubectl get svc web -o yaml > web.yaml && vi web.yaml && kubectl replace -f web.yaml
kubectl diff -f svc.yaml # 执行前先看差异
kubectl replace -f svc.yaml --dry-run=server # 服务端校验一遍几种更新方式对照
| 方式 | 行为 | 风险点 |
|---|---|---|
| replace -f | 按清单整体覆盖 | 清单未写的字段可能被重置 |
| replace --force -f | 删除后立即重建 | 对象短暂不存在,外部依赖可能重新分配 |
| 导出再 replace | 基于现网修改后写回 | 容易把状态字段一起写回,引发新漂移 |
| apply -f | 三方合并更新 | 会保留别人改过的字段,不满足严格覆盖需求 |
replace 只处理「已经存在」的对象;对象不存在时会直接报错,此时应使用 create 或 apply,不要在一次操作里混合创建与替换两种意图。
对负载均衡型 Service 使用 --force 会触发删除重建,外部地址与底层负载均衡器可能重新分配,安排在维护窗口并提前通知相关方更稳妥。