首页/云/云与容器速查/kubectl diff 预览变更
Kubernetes68 条

kubectl diff 预览变更

在执行前预览 apply 会改什么:输出服务端现状与文件的差异(类 UNIX diff),有差异时退出码为 1;上线前审查变更的主流手段,配合 CI 使用。

云与容器速查云更新于 2026-10-13

kubectl diff 是什么

diff 用来在执行 apply 之前回答“这次会改什么”:它把本地文件用服务端试运行(server-side dry-run)提交给 API Server,再把返回结果与集群中现存对象比较,输出类似 UNIX diff 的差异行。它不写入任何数据,适合放在发布流程里当人工审查或自动化卡点。需要 API Server 支持试运行,集群过旧时只能退化成人工比对。

基本信息

语法kubectl diff -f 文件.yaml | kubectl diff -k 目录
适用平台kubectl 1.13 起提供;试运行需 API Server 支持
输出以 +/- 行给出差异,按对象分段,段首是资源类型与名称
退出码0 表示无差异,1 表示有差异,大于 1 表示命令或连接出错
外部工具环境变量 KUBECTL_EXTERNAL_DIFF 可换成 colordiff 等,便于并排阅读
权限需要目标资源的 get 与 patch 权限(试运行同样走鉴权)

典型使用场景

  • 上线前确认这次发布到底动了哪些字段
  • CI 里把差异作为审查输出,附在合并请求里
  • 排查“配置改了但集群没变”的原因,确认对象是否被别的控制器改回
  • 迁移目录结构或多环境时对比渲染结果与集群现状
  • 核对 Kustomize 渲染后的最终结果是否符合预期

使用示例

使用示例
kubectl diff -f deploy.yaml   # 预览单个文件的变更
kubectl diff -f k8s/prod/   # 目录批量预览
kubectl diff -k overlays/prod/   # Kustomize 渲染后再比
KUBECTL_EXTERNAL_DIFF='diff -u' kubectl diff -f deploy.yaml   # 换外部 diff 工具
echo "exit=$?"   # 1 表示存在差异,不是失败
kubectl diff -f deploy.yaml | head -60   # 差异很长时先看前几十行

退出码读法

退出码含义使用方式
0文件与集群一致可跳过 apply,或继续走幂等流程
1存在差异视为“有变更待发布”,不应判为失败
大于 1命令、连接或鉴权出错这才是真正的错误,应中断流水线
试运行被拒集群不支持 dry-run 或权限不足看错误信息,必要时改用 get -o yaml 人工比对
差异里会混进 API Server 补的默认值与控制器写入的 status、managedFields:阅读时聚焦 spec 与 metadata 上的实质变更。
diff 只做比较,不做校验之外的写入:确认无误后仍需自己执行 apply,它不会替你发布。

易错点

  • 把退出码 1 当成失败:CI 里正常差异被误判为错误,流水线红一片
  • 以为 diff 通过就万无一失:它只比字段,不校验镜像是否存在、配额是否足够
  • 集群不支持试运行时硬用:老版本 API Server 直接报错,需改用渲染结果人工比对
  • 本地 kubectl 版本与集群差异过大:字段解释不一致,输出噪声多、结论不可靠

数据来源与参考

  • Kubernetes Docs:kubectl diff

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌