软件从开发到运行的全流程实践
1. 将软件转换为可运行形式
1.1 始终使用摘要
在容器化的世界里,将源代码转换为容器镜像时,使用摘要(digest)至关重要。容器镜像本质上是一堆用 JSON 粘合在一起的 tarball。当将服务交给 Knative 运行时,它会委托给 Kubernetes,Kubernetes 再委托给 kubelet 代理,最终由容器运行时(如 containerd)来真正运行软件。
容器运行时最重要的输入是要运行的容器镜像的引用。然而,传统的镜像引用(如标签)存在诸多问题。例如,标签是可变的,不同的容器运行时对同一标签可能指向不同的镜像,而且不同的名称可能指向相同的镜像,但容器运行时会认为它们不同。这就导致了在缓存和拉取镜像时出现不一致的情况。
Kubernetes 引入了 imagePullPolicy 配置项,包括 Never 、 IfNotPresent 和 Always ,但这些都不能完全解决问题。 IfNotPresent 会导致集群中存在同一镜像的多个版本,而 Always 虽然每次都会拉取镜像,但在容器长时间运行和不同节点启动时仍可能出现版本不一致的问题,并且无法利用缓存。
解决这个问题的唯一方法是使用完全限定(即包含摘要)的镜像引用,如 @sha256:abcdef123… 。这种引用是不可变且精确的,基于镜像本身的字节内容,无论何时都指向同一个容器镜像。
对于使用原生
软件全生命周期部署实践
超级会员免费看
订阅专栏 解锁全文

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



