本文发布已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

registry.k8s.io:更快、更便宜且正式发布 (GA)

从 Kubernetes 1.25 开始,我们的容器镜像注册表已从 k8s.gcr.io 更改为 registry.k8s.io。这个新的注册表将负载分散到多个云提供商和区域,充当 Kubernetes 容器镜像的内容分发网络 (CDN)。此更改减少了项目对单个实体的依赖,并为大量用户提供了更快的下载体验。

TL;DR:您需要了解的有关此更改的信息

  • 1.25 1.27 开始,Kubernetes 版本的容器镜像不再发布到 k8s.gcr.io,而是仅发布到 registry.k8s.io。
  • 在即将到来的 12 月补丁版本中,新的注册表域默认值将向后移植到所有仍在支持的分支(1.22、1.23、1.24)。
  • 如果您在受限制的环境中运行,并应用严格的域/IP 地址访问策略(仅限于 k8s.gcr.io),则在迁移到此新注册表后,镜像拉取将无法正常工作。对于这些用户,推荐的方法是将发布镜像镜像到私有注册表。

如果您想了解更多关于我们进行此更改的原因,或您可能遇到的一些潜在问题,请继续阅读。

为什么 Kubernetes 更改为不同的镜像注册表?

k8s.gcr.io 托管在专门为 Kubernetes 项目设置的自定义 Google Container Registry (GCR) 域上。自项目启动以来,这种方式运作良好,我们感谢 Google 提供这些资源,但如今,还有其他云提供商和供应商希望托管镜像,以便为他们平台上的用户提供更好的体验。除了 Google 再次承诺捐赠 300 万美元来支持该项目的基础设施外,亚马逊还在底特律举行的 Kubecon NA 2022 主题演讲中宣布了匹配的捐款。这将为用户提供更好的体验(更近的服务器 = 更快的下载速度),同时将减少 GCR 的出口带宽和成本。registry.k8s.io 将在 Google 和亚马逊之间分摊负载,未来还将有其他提供商加入。

为什么没有稳定的域/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) 的镜像可以通过配置您的容器运行时或根据您使用的 Kubernetes 版本设置 --pod-infra-container-image 标志来覆盖。

其他运行时: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。还要感谢我们与云提供商合作伙伴充当联络人的朋友:来自亚马逊的 Jay Pipes 和来自 Google 的 Jon Johnson Jr.

本文于 2023 年 2 月 28 日更新。