本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
registry.k8s.io:更快、更便宜且正式可用(GA)
从 Kubernetes 1.25 开始,我们的容器镜像仓库已从 k8s.gcr.io 变更为 registry.k8s.io。这个新的镜像仓库将负载分散到多个云服务提供商和区域,其功能类似于 Kubernetes 容器镜像的内容分发网络(CDN)。这一变化减少了项目对单一实体的依赖,并为广大用户提供了更快的下载体验。
长话短说:关于此变更您需要了解什么
- Kubernetes
1.251.27 及以后版本的容器镜像将不再发布到 k8s.gcr.io,仅发布到 registry.k8s.io。 - 在即将到来的 12 月补丁版本中,新的默认镜像仓库域名将向后移植到所有仍在支持的版本分支(1.22、1.23、1.24)。
- 如果您在受限环境中运行,并且应用了严格的、仅限于 k8s.gcr.io 的域名/IP 地址访问策略,那么在迁移到这个新的镜像仓库后,镜像拉取将无法正常工作。对于这些用户,推荐的方法是将发布的镜像同步到私有镜像仓库中。
如果您想了解更多关于我们做出这一改变的原因,或者您可能遇到的一些潜在问题,请继续阅读。
为什么 Kubernetes 要更换镜像仓库?
k8s.gcr.io 托管在一个专门为 Kubernetes 项目设置的自定义 Google Container Registry (GCR) 域上。自项目成立以来,这种方式一直运行良好,我们感谢 Google 提供了这些资源。但如今,其他云服务提供商和供应商也希望托管镜像,以便为他们平台上的用户提供更好的体验。除了 Google 再次承诺捐赠 300 万美元支持项目基础设施外,Amazon 在底特律举行的 Kubecon NA 2022 主题演讲中也宣布了同等金额的捐赠。这将为用户带来更好的体验(服务器更近 = 下载更快),同时减少 GCR 的出口带宽和成本。registry.k8s.io 将在 Google 和 Amazon 之间分摊负载,未来还会有其他提供商加入。
为什么没有一个稳定的域名/IP 列表?为什么我不能限制镜像拉取?
registry.k8s.io 是一个安全的 Blob 重定向器,它将客户端连接到最近的云服务提供商。这一变更的性质意味着,拉取镜像的客户端可能会被重定向到众多后端中的任何一个。我们预计后端集合会不断变化,并且随着越来越多的云服务提供商和供应商加入镜像发布的行列,后端数量只会增加。
像中间人代理或将访问限制在特定 IP/域名列表的网络策略等限制性控制机制,将会因这一变更而失效。对于这些场景,我们鼓励您将发布的镜像同步到您能严格控制的本地镜像仓库。
有关此策略的更多信息,请参阅 registry.k8s.io 文档的稳定性部分。
我会看到什么样的错误?我怎么知道自己是否仍在使用旧地址?
错误可能取决于您使用的容器运行时以及您被路由到的端点,但它应该表现为容器创建失败,并显示 FailedCreatePodSandBox
警告。
以下是一个示例错误消息,显示一个代理部署由于证书未知而拉取失败
FailedCreatePodSandBox: Failed to create pod sandbox: rpc error: code = Unknown desc = Error response from daemon: Head “https://us-west1-docker.pkg.dev/v2/k8s-artifacts-prod/images/pause/manifests/3.8”: x509: certificate signed by unknown authority
我受到了此变更的影响,如何恢复到旧的镜像仓库地址?
如果使用新的镜像仓库域名不可行,对于低于 1.25 的集群版本,您可以恢复到旧的域名。请记住,最终您将不得不切换到新的镜像仓库,因为新的镜像标签将不再推送到 GCR。
在 kubeadm 中恢复镜像仓库名称
kubeadm 用来拉取镜像的镜像仓库可以通过两种方法控制:
设置 --image-repository
标志。
kubeadm init --image-repository=k8s.gcr.io
或者在 kubeadm config 的 ClusterConfiguration
中设置:
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
imageRepository: "k8s.gcr.io"
在 kubelet 中恢复镜像仓库名称
kubelet 用于 Pod 沙箱 (pause
) 的镜像可以通过配置您的容器运行时或设置 --pod-infra-container-image
标志来覆盖,具体取决于您使用的 Kubernetes 版本。
其他运行时:containerd、CRI-O、cri-dockerd。
在使用 v1.23 之前的 dockershim 时
kubelet --pod-infra-container-image=k8s.gcr.io/pause:3.5
旧容器镜像仓库冻结
k8s.gcr.io 镜像仓库将于 2023 年 4 月 3 日起冻结 一文宣布了旧 k8s.gcr.io 镜像仓库的冻结。请阅读该文章以获取更多详情。
致谢
改变是艰难的,但发展我们的镜像服务平台对于确保项目的可持续未来是必要的。我们努力为所有使用 Kubernetes 的人提供更好的体验。我们社区各个角落的许多贡献者都付出了长期而艰辛的努力,以确保我们做出最佳决策、执行计划,并尽最大努力传达这些计划。
感谢来自 SIG K8s Infra 的 Aaron Crickenberger、Arnaud Meukam、Benjamin Elder、Caleb Woodbine、Davanum Srinivas、Mahamed Ali 和 Tim Hockin;来自 SIG Node 的 Brian McQueen 和 Sergey Kanzhelev;来自 SIG Cluster Lifecycle 的 Lubomir Ivanov;来自 SIG Release 的 Adolfo García Veytia、Jeremy Rickard、Sascha Grunert 和 Stephen Augustus;来自 SIG Contribex 的 Bob Killen 和 Kaslin Fields;来自安全响应委员会的 Tim Allclair。同时非常感谢我们作为与云提供商合作伙伴联络人的朋友们:来自 Amazon 的 Jay Pipes 和来自 Google 的 Jon Johnson Jr.。
本文于 2023 年 2 月 28 日更新。