diff 是干什么的
kubectl diff 把本地清单与集群中的现状做服务器端对比,输出形似 git diff 的增删行,用来在真正执行之前确认「这次应用会改变什么」。它按服务端应用(SSA)语义计算差异,因此结果偏保守:展示的是本清单会导致的变化,而不是两个完整对象的逐字段对照。发布前跑一次,能提前发现意外改动,例如副本数被改回、注解被清掉。
基本信息
| 用途 | 预览 apply 会产生哪些字段差异 |
|---|---|
| 语法 | kubectl diff -f <文件|目录> | -k <kustomize 目录> |
| 退出码 | 0 无差异、1 有差异、大于 1 出错 |
| 计算语义 | 按服务端应用的合并语义,属于保守估计 |
| 依赖 | 需要服务端支持 dry-run 相关能力 |
典型使用场景
- 发布前预检:确认本次改动只影响预期字段,避免误改副本数或标签
- 漂移检测:定期对同一份清单跑 diff,判断线上是否被手工改过
- CI 门禁:把有差异视为需要人工确认的信号,或作为告警条件
- 排查「改了没生效」:对比清单与现状,确认字段是否真的写入
- 审计变更范围:发布评审前贴出 diff 结果,让评审看到真实影响面
常用命令
常用命令
kubectl diff -f deploy.yaml # 单文件差异
kubectl diff -f ./manifests/ -n prod # 整个目录
kubectl diff -k ./overlays/prod # kustomize 渲染后再比较
kubectl diff -f deploy.yaml; echo "exit=$?" # 0 无差异、1 有差异、大于 1 出错
kubectl diff -f deploy.yaml | grep '^[+-]' # 只看增删行,长输出时更清爽退出码与输出读法
| 观察点 | 含义 | 处置 |
|---|---|---|
| 退出码 0 | 本地与集群无差异 | 可直接应用,或说明已收敛 |
| 退出码 1 | 存在差异 | 逐行确认差异是否都是预期改动 |
| 退出码大于 1 | 执行本身出错 | 看报错原文,多为连接、权限或清单渲染问题 |
| - 开头行 | 集群现状中的内容 | 删除行出现时确认是否真的要去掉该字段 |
| + 开头行 | 应用后将会出现的内容 | 新增行是本次要落地的变化 |
diff 只反映本清单参与管理的字段,控制器动态写入的状态字段不会出现在差异中。因此「diff 无差异」不等于「线上一切正常」,它只说明这份清单与集群在该范围内已收敛。
在 CI 中使用时要显式处理退出码:多数流水线把非 0 视为失败,而 diff 返回 1 表示「有差异」这一正常情况。用脚本判断时先区分 1 与大于 1 的语义。