← 中文资源

简体中文版本

apply 之前先 diff 渲染后的 Helm 清单

本地 helm template 渲染清单,与集群实况 diff,在变更发生前评审将要改变的确切 YAML。

阅读英文原文

目标

一行 values 改动经模板逻辑可以级联成几十处清单变更。先本地渲染图表、再与集群实况做 diff,把“希望发生的升级”变成“评审过的升级”:你会看到副本数按意图变了,也会看到配置校验和注解让所有 Pod 重启的副作用,从而决定这个时间点是否可接受。

步骤要点

  1. 用与生产完全相同的 values 文件与命名空间执行 helm template,把渲染结果落盘成静态工件并统计资源数。
  2. 用 kubectl diff 对比渲染清单与集群实况,逐条审视增删改,特别是配置校验和注解这类会触发重启风暴的变更。
  3. 对渲染产物做插值健全性检查,搜未渲染的模板花括号与 null 空值,避免把空字符串部署上去。
  4. 聚焦查看触发本次变更的资源,确认 replicas、image、resources 正是预期的那一处改动。
  5. 评审通过后再用 –atomic –timeout 执行 upgrade,失败自动回滚,并把评审过的渲染工件按日期归档备查。

排错提示

template 输出与实际 apply 不一致,多半是 hook 或 capabilities 差异,给 template 传相同命名空间与参数,并对照 helm get manifest 验证运行中版本;kubectl diff 对 CRD 报错就把自定义资源拆出来人工评审,先 apply CRD 再上工作负载;Secret 渲染成空串是本地缺外部密钥,改成 apply 时查库或仅在真实升级时用 –set-file 注入。

适用边界

渲染 diff 只展示期望态与实况的差异,hook 在 apply 时执行的副作用 template 看不到;大图表的完整 diff 噪音很大,按 values 触碰的资源类型过滤评审范围更高效。

代码示例

# Render with the exact production inputs
helm template web ./charts/web \
  -f values.yaml -f values-prod.yaml \
  --namespace prod > /tmp/rendered.yaml

# What would actually change?
kubectl diff -f /tmp/rendered.yaml | head -40
# -  replicas: 3
# +  replicas: 5        <-- intended
# +  annotations: {"checksum/config": "b7c1..."}  <-- restart storm

# Then apply with a safety net
helm upgrade --install web ./charts/web \
  -f values.yaml -f values-prod.yaml \
  -n prod --atomic --timeout 5m