latest 标签的坑
latest 只是最近推送的别名:不表达版本、可被覆盖、容易造成环境漂移,生产部署应避免依赖它。本质:docker push 未指定标签时默认打 latest,含义是最近而不是稳定。Kubernetes 行为:imagePullPolicy 未显式指定时,latest 标签默认按 Always 拉取,其他标签默认策略不同。替代方案:版本标签或按摘要锁定;确有追踪用途时改名 stable 并把更新规则写进文档。判断信号:同一部署描述在不同时间拉到了不同内容。
基本信息
| 本质 | push 未指定标签时默认打 latest;含义是最近,不是稳定 |
|---|---|
| K8s 行为 | imagePullPolicy 未显式指定时,latest 默认 Always 拉取 |
| 替代 | 版本标签或摘要锁定;追踪用途用明确命名的标签 |
| 回滚问题 | 回滚目标是哪个内容不可确定,依据必须落在不可变引用上 |
| 排查信号 | 同一部署描述在不同时间拉到不同内容 |
典型使用场景
- 症状排查:部署行为忽好忽坏、无法复现时先检查是否引用了 latest。
- 策略整改:把 latest 替换为版本标签或摘要,并纳入模板评审。
- 演示与临时环境:短命环境可临时使用,但写明不适用于正式环境。
- 拉取策略:显式配置 imagePullPolicy,避免依赖默认值造成团队认知偏差。
- 缓存干扰排查:节点本地已有同名镜像时拉取行为依策略而异,先确认策略与缓存状态。
- 规范落地:把禁用 latest 写进规范与模板默认值,从源头减少。
改掉引用
改掉引用
# 反例:
kubectl set image deploy/app app=registry/app:latest
# 推荐:
kubectl set image deploy/app app=registry/app:1.8.0
# 或直接锁摘要:
kubectl set image deploy/app app=registry/app@sha256:<digest>用 latest 的部署回滚时回滚到哪个内容不可确定:回滚依据必须落在不可变引用上。
问题不在标签本身:任何可被覆盖的标签都有同样风险,规范要求标签不可变即可覆盖大多数场景。
本地拉取成功不代表集群行为一致:缓存与拉取策略差异会让两者看到不同内容。