命令定位
--dry-run 让请求走完整流程但不写库:client 模式在本地推导对象,不出网;server 模式把请求真实提交给 API 服务,经过准入控制、默认值填充与 RBAC 校验,只是最后不持久化。适用平台为 Kubernetes(kubectl 1.18 起 server 模式正式可用,早期版本另有 --dry-run 布尔写法)。它是改清单前后最省事的预检手段。
基本信息
| 适用平台 | Kubernetes,kubectl 1.18+ 推荐使用 --dry-run=client|server |
|---|---|
| client 模式 | 纯本地推导,速度最快,不校验配额、命名冲突与 webhook |
| server 模式 | 走真实 API 与准入链,校验 RBAC、配额、默认值,但不落库 |
| 组合用法 | --dry-run=client -o yaml 常用于生成初始清单模板 |
典型使用场景
- 上线前预检:把新版本的清单先 server 试跑一遍,看准入与配额是否放行
- 生成清单模板:用命令式 create 配 dry-run 导出 YAML,再改造成正式清单
- 回归验证:发布前确认对象定义合法,避免把语法错误带到流水线中途才炸
- 对比差异:dry-run 输出与现网对象做 diff,评估这次变更到底动了哪些字段
- 演练删除:确认待删对象与依赖关系,避免误删命名空间里的关键资源
常用示例
常用示例
kubectl apply -f deploy.yaml --dry-run=server # 走真实准入校验但不落库
kubectl apply -f deploy.yaml --dry-run=client -o yaml > out.yaml # 本地展开成完整清单
kubectl create deployment web --image=nginx --dry-run=client -o yaml # 生成模板骨架
kubectl delete pod web-x --dry-run=server # 删除前演练匹配范围
kubectl diff -f deploy.yaml # 与现网对象对比,配合 dry-run 判读两种模式差异
| 校验项 | client | server |
|---|---|---|
| 对象内部语法与必填字段 | 校验 | 校验 |
| RBAC 权限 | 不校验 | 校验 |
| ResourceQuota 与 LimitRange | 不校验 | 由准入插件校验 |
| 准入 webhook(如注入 sidecar) | 不校验 | 会真实调用 |
| 默认值填充结果 | 仅少量本地推导 | 与真实提交一致 |
server 模式不会产生副作用,但 webhook 的实现有差异:个别 mutating webhook 未适配 dry-run 时可能报错,此时可退回 client 模式并手动核对差异。
kubectl diff 与 server 侧 dry-run 组合使用效果最好:既能确认变更能否被接受,也能看到字段级的实际差异。