=== 背景:同类问题已经出现三次 ===
1) Docker Hub 502 导致 latest 推失败,Pod 仍跑旧镜像
2) 并发构建互相覆盖 latest(谁后完成谁生效)
3) 中断的构建后来完成,把 latest 推回旧代码(本次差点中招)
第 2 类已由 flock 独占锁解决;但前两类还有一个共同的后半段:
**没有人核对"部署后 Pod 到底跑的是不是刚推的那版"**。
=== 本次新增 ===
1) 部署后自愈:rollout 完成即核对 Pod digest 与远端 latest;
不一致自动 `kubectl delete po` 强制重拉(节点缓存了旧 latest 映射是常见原因),
最多等 4 分钟,仍不一致才 exit 1 —— 不再"报个 ❌ 就结束"。
2) 版本戳:核对通过后给 Deployment 打三个 annotation
lokistack.io/release-image = <digest>
lokistack.io/release-tag = <版本-日期-commit>
lokistack.io/release-time = <ISO8601>
以后排查"线上跑哪版"直接 `kubectl -n log get deploy lokistack -o yaml | grep release-`,
不用再在 docker images / Hub API / Pod 之间来回比对。
=== 用法 ===
以后发版统一走 `bash scripts/release.sh`(build+push+deploy+自愈+打戳一次完成)
不要再手敲 docker build + docker push —— 那样会绕过 flock 锁,回到互相覆盖。
bash scripts/release.sh --dry-run 只做前置检查
bash scripts/release.sh --no-deploy 只发镜像不动集群