软件从开发到生产的全流程实践
1. 将软件转化为可运行的形式
1.1 始终使用摘要
在将源代码转换为容器镜像时,常见做法是使用 Dockerfile 并依赖最新标签,但这种方式存在问题。容器镜像本质上是由 tarball 和 JSON 组合而成,当将服务交给 Knative 运行时,会经过一系列委托,最终由容器运行时执行。容器运行时的重要输入是容器镜像的引用,然而普通的镜像名称缺乏精确稳定的含义。
例如, example/foo 这个名称在不同时刻、不同系统中可能指向不同的镜像,不同的容器运行时对 example/foo:latest 的理解也可能不同,而且不同名称还可能指向相同的镜像,但运行时却认为它们不同。这就导致了在使用容器运行时的本地缓存时,无法保证缓存中的镜像与注册表中的一致。
Kubernetes 引入了 imagePullPolicy 配置项,包括 Never 、 IfNotPresent 和 Always ,但这些都不能完全解决问题。 IfNotPresent 会导致集群中出现多个版本的镜像,而 Always 虽然在容器启动时拉取镜像,但仍可能出现版本不一致的情况,且无法利用缓存。
解决这个问题的唯一方法是使用完全限定(带摘要)的镜像引用,如 @sha256:abcdef123… 。这种引用是不可变且精确的,基于镜像本身的字节计算得出,不会依赖注册表的定义
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



