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

k8s.gcr.io 重定向到 registry.k8s.io - 您需要了解的信息

在 3 月 20 日星期一,k8s.gcr.io 注册表将被重定向到社区拥有的注册表registry.k8s.io

TL;DR:你需要了解的关于此更改的信息

  • 在 3 月 20 日星期一,来自旧的 k8s.gcr.io 注册表的流量将被重定向到 registry.k8s.io,最终目标是停止使用 k8s.gcr.io。
  • 如果你在受限环境中运行,并应用严格的域名或 IP 地址访问策略,该策略仅限于 k8s.gcr.io,则在 k8s.gcr.io 开始重定向到新注册表后,镜像拉取将无法运行
  • 一小部分非标准客户端无法处理镜像注册表的 HTTP 重定向,需要直接指向 registry.k8s.io。
  • 重定向是一个权宜之计,以帮助用户进行切换。已弃用的 k8s.gcr.io 注册表将在某个时间点逐步淘汰。请尽快更新你的清单以指向 registry.k8s.io
  • 如果你托管自己的镜像注册表,你也可以将需要的镜像复制到那里,以减少到社区拥有的注册表的流量。

如果你认为你可能会受到影响,或者想了解更多关于此更改的信息,请继续阅读。

如何检查我是否受到影响?

要测试到 registry.k8s.io 的连接并能够从那里拉取镜像,这是一个可以在你选择的命名空间中执行的示例命令

kubectl run hello-world -ti --rm --image=registry.k8s.io/busybox:latest --restart=Never -- date

当你运行上面的命令时,如果一切正常,你应该会看到以下结果

$ kubectl run hello-world -ti --rm --image=registry.k8s.io/busybox:latest --restart=Never -- date
Fri Feb 31 07:07:07 UTC 2023
pod "hello-world" deleted

如果我受到影响,我会看到什么样的错误?

错误可能取决于你使用的容器运行时类型,以及你路由到的端点,但它应显示为 ErrImagePullImagePullBackOff,或者容器无法创建并出现警告 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

哪些镜像会受到影响?

k8s.gcr.io 上的所有镜像都将受到此更改的影响。k8s.gcr.io 托管了许多超出 Kubernetes 发布的镜像。许多 Kubernetes 子项目也在那里托管他们的镜像。一些示例包括 dns/k8s-dns-node-cacheingress-nginx/controllernode-problem-detector/node-problem-detector 镜像。

我受到了影响。我该怎么办?

对于在受限环境中运行的受影响用户,最好的选择是将所需的镜像复制到私有注册表,或者在其注册表中配置拉取式缓存。

有几种工具可以在注册表之间复制镜像;crane 是其中一种工具,可以使用 crane copy SRC DST 将镜像复制到私有注册表。也有特定于供应商的工具,例如 Google 的 gcrane,它执行类似的功能,但针对其平台进行了优化。

我如何找到哪些镜像正在使用旧版注册表,并修复它们?

选项 1:请参阅我们之前的博客文章中的单行 kubectl 命令

kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c

选项 2:已经开发了一个名为community-imageskubectl krew 插件,它将扫描并报告任何使用 k8s.gcr.io 端点的镜像。

如果你安装了 krew,你可以使用以下命令安装它

kubectl krew install community-images

并使用以下命令生成报告

kubectl community-images

有关替代安装方法和示例输出,请查看存储库:kubernetes-sigs/community-images

选项 3:如果你没有直接访问集群的权限,或者管理多个集群 - 最好的方法是在你的清单和图表中搜索“k8s.gcr.io”

选项 4:如果你希望阻止基于 k8s.gcr.io 的镜像在你的集群中运行,GatekeeperKyverno 的示例策略可在 AWS EKS 最佳实践存储库中找到,这将阻止它们被拉取。你可以将这些第三方策略与任何 Kubernetes 集群一起使用。

选项 5:作为最后的可能选项,你可以使用突变准入 Webhook 动态更改镜像地址。这应该仅被视为一个权宜之计,直到你的清单更新为止。你可以在 k8s-gcr-quickfix 中找到一个(第三方)突变 Webhook 和 Kyverno 策略。

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

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

有关此更改的更多详细信息,请查看 registry.k8s.io:更快、更便宜且正式可用 (GA)

为什么实施重定向?

该项目在去年通过 1.25 版本切换到 registry.k8s.io;但是,大多数镜像拉取流量仍然指向旧端点 k8s.gcr.io。作为项目,这对我们来说是不可持续的,因为它没有利用其他提供商向项目捐赠的资源,而且由于服务此流量的成本,我们面临着资金耗尽的危险。

重定向将使该项目能够利用这些新资源,从而显著降低我们的出口带宽成本。我们只期望此更改会影响在受限环境中运行或使用无法正确识别重定向的非常旧的客户端的一小部分用户。

k8s.gcr.io 将会发生什么?

与重定向分开,k8s.gcr.io 将被冻结 并且在 2023 年 4 月 3 日之后不会更新新的镜像k8s.gcr.io 将不会获得任何新的版本、补丁或安全更新。它将继续可用以帮助人们进行迁移,但它在未来完全淘汰。

我还有问题,我应该去哪里?

有关 registry.k8s.io 及其开发原因的更多信息,请参阅registry.k8s.io:更快、更便宜且正式可用

如果你想了解有关镜像冻结以及将在那里提供的最后镜像的更多信息,请参阅博客文章:k8s.gcr.io 镜像注册表将于 2023 年 4 月 3 日起冻结

有关 registry.k8s.io 的架构及其请求处理决策树的信息可以在 kubernetes/registry.k8s.io 存储库中找到。

如果你认为你在新注册表或重定向中遇到了错误,请在 kubernetes/registry.k8s.io 存储库中打开一个问题。在创建新问题之前,请检查是否已经存在与你看到的情况类似的问题