首页/云/Kubernetes 速查/kubectl diff 对比清单与现网
kubectl 基础56 条

kubectl diff 对比清单与现网

把本地清单与集群现状做服务器端对比,发布前确认「将要发生什么变化」,输出风格类似 git diff。

Kubernetes 速查云更新于 2026-10-13

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 的语义。

易错点

  • 把退出码 1 当成执行失败:1 表示存在差异,是正常结果,流水线里误判会阻断合法发布
  • 以为 diff 会给出完整对象差异:它只显示清单参与管理的字段变化,SSA 语义下更保守
  • 差异很大时逐行肉眼读:配合 grep 只看增删行并重点核对副本数、镜像、标签与注解
  • 在无写权限的身份下运行:部分实现需要相应权限才能完成对比,报错后误以为是清单问题

数据来源与参考

  • Kubernetes 官方文档 · kubectl diff
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌