目标
标签是可变的指针:任何有推送权限的人都能给不同内容重打同一标签,于是两个自称同版本的环境可能跑着不同的字节。内容摘要是对制品本身的密码学事实。按摘要部署让所有环境可证明地一致、让回滚变成对已记录摘要的精确操作、让“到底跑着什么”从考古变成查注解。
步骤要点
- CI 构建后立即用 docker manifest inspect 解析出镜像的 sha256 摘要。
- 所有环境的部署清单统一用 registry/app@sha256:… 引用,逐字节一致才是真一致。
- 给 Deployment 打上 artifact.sha256 / build-id / git-sha 注解,形成可查询的部署台账。
- kubectl 跨命名空间核对 image 列,确认没有环境在同名标签下漂移到不同内容。
- CI 加“禁止可变标签引用”检查,任何 k8s 清单里出现 app:tag 形式即构建失败。
排错提示
回滚脚本因摘要失效是因为它还在找“上一个 tag”,应改为从注解台账读取上一版摘要;多架构镜像要钉 manifest list 摘要而非单架构摘要,才能在各架构节点正确解析;本地开发想用标签就保留,把“标签→摘要”的解析收敛到 CI 这一个边界点。
适用边界
摘要对人不友好,需要注解等工具把它翻译回构建元数据;钉住摘要防的是漂移不是漏洞,基础镜像有安全更新时仍要重新构建。
代码示例
image: registry.example.com/app@sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
# Provenance on the deployment itself
metadata:
annotations:
artifact.sha256: 9f86d081884c7d65
artifact.git-sha: 4c2f9e1