作者:Adolfo García Veytia(Chainguard),Bob Killen(Google)
从 Kubernetes 1.25 开始,我们的容器镜像注册中心已经从 k8s.gcr.io 更改为 registry.k8s.io。这个新的注册中心将负载分散到多个云提供商和地区,充当 Kubernetes 容器镜像的一种内容交付网络(CDN,content delivery network)。这一改变减少了项目对单个实体的依赖,并为大量用户提供了更快的下载体验。
TL;DR(长话短说):你需要知道什么
- 从 1.25 开始,Kubernetes 版本的容器镜像不再发布到 k8s.gcr.io,而只发布到 registry.k8s.io。
- 在即将到来的 12 月补丁发布中,新的注册域默认值将被反向移植到所有仍受支持的分支(1.22、1.23、1.24)。
- 如果在受限环境中运行,并应用仅限于 k8s.gcr.io 的严格域/IP 地址访问策略,则在迁移到这个新的注册中心后,镜像提取将不起作用。对于这些用户,推荐的方法,是将发布镜像镜像到一个私有注册中心。
如果你想知道更多关于我们为什么做这个改变,或者你可能遇到的一些潜在问题,请继续阅读。
为什么 Kubernetes 更改为不同的镜像注册中心?
k8s.gcr.io 托管在专门为 Kubernetes 项目设置的自定义 Google 容器注册中心(GCR)域上。自项目开始以来,这一点一直很好,我们感谢谷歌提供这些资源,但今天有其他云提供商和供应商希望托管镜像,为他们平台上的人们提供更好的体验。除了谷歌再次承诺捐赠 300 万美元支持该项目的基础设施,亚马逊在底特律举行的 Kubecon NA 2022 主题演讲中也宣布了相应的捐赠。这将为用户提供更好的体验(更近的服务器=更快的下载),同时将减少 GCR 的出口带宽和成本。registry.k8s.io 将在谷歌和亚马逊之间分担负载,其他提供商将在未来跟进。
为什么没有稳定的域名/IP 列表?为什么我不能限制镜像提取?
registry.k8s.io 是一个安全的 blob 重定向器[1],将客户端连接到最近的云提供商。这种变化的本质,意味着提取镜像的客户端,可以被重定向到大量后端中的任何一个。我们预计后端的设置会不断变化,并且只会随着越来越多的云提供商和供应商加入进来,帮助镜像发布镜像而增加。
限制访问特定 IP/域列表的限制性控制机制(如中间人代理或网络策略)将随着这一变化而被打破。对于这些场景,我们鼓励你将发布镜像镜像到你严格控制的本地注册中心。
有关此策略的更多信息,请参见registry.k8s.io 文档的稳定性部分[2]。
我会看到什么样的错误?我如何知道我是否还在使用旧地址?
错误可能取决于你使用的容器运行时的类型,以及你路由到的端点,但它应该显示为容器创建失败,并显示警告 FailedCreatePodSandBox。
下面是一个错误消息示例,显示由于未知证书,代理部署无法获取:
代码语言:javascript复制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 标志。
代码语言:javascript复制kubeadm init --image-repository=k8s.gcr.io
或者在kubeadm 配置[3]ClusterConfiguration 中:
代码语言:javascript复制apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
imageRepository: "k8s.gcr.io"
在 kubelet 中恢复注册中心名称
通过设置--pod-infra-container-image 标志,可以覆盖 kubelet 用于 pod 沙箱(pasue)的镜像。例如:
代码语言:javascript复制kubelet --pod-infra-container-image=k8s.gcr.io/pause:3.5
鸣谢
改变是困难的,为了确保项目的永续发展,需要改进我们的镜像服务平台。我们努力让每个使用 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 和来自谷歌的 Jon Johnson Jr.。
参考资料
[1]
安全的 blob 重定向器: https://github.com/kubernetes/registry.k8s.io/blob/main/cmd/archeio/docs/request-handling.md
[2]
registry.k8s.io 文档的稳定性部分: https://github.com/kubernetes/registry.k8s.io#stability
[3]
kubeadm 配置: https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta3/