本文发布已超过一年。较旧的文章可能包含过时内容。请检查页面信息自发布以来是否已不再正确。
registry.k8s.io: 更快、更便宜且正式发布 (GA)
从 Kubernetes 1.25 开始,我们的容器镜像仓库已从 k8s.gcr.io 更改为 registry.k8s.io。这个新仓库将负载分散到多个云提供商和区域,充当 Kubernetes 容器镜像的内容分发网络 (CDN)。这一变更降低了项目对单一实体的依赖,并为大量用户提供了更快的下载体验。
TL;DR:您需要了解的关于此变更的内容
- Kubernetes 版本
1.251.27 及更高版本的容器镜像不再发布到 k8s.gcr.io,仅发布到 registry.k8s.io。 - 在即将于 12 月发布的补丁版本中,新的仓库域名默认设置将被回溯到所有仍在支持的分支 (1.22、1.23、1.24)。
- 如果您在受限环境中运行,并且应用了严格的域名/IP 地址访问策略(仅限于 k8s.gcr.io),则迁移到新仓库后,镜像拉取将无法进行。对于这些用户,建议的方法是将发布镜像镜像到您拥有严格控制的私有仓库。
如果您想了解更多关于我们为何进行此变更,或您可能遇到的潜在问题,请继续阅读。
为什么 Kubernetes 改用了不同的镜像仓库?
k8s.gcr.io 托管在自定义的 Google Container Registry (GCR) 域名上,该域名专为 Kubernetes 项目设置。自项目成立以来,这一直运行良好,我们感谢 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 sandbox (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,来自 Security Response Committee 的 Tim Allclair。还要特别感谢与我们云提供商合作伙伴联系的各位朋友:来自 Amazon 的 Jay Pipes 和来自 Google 的 Jon Johnson Jr。
本文于 2023 年 2 月 28 日更新。