本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

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

從 Kubernetes 1.25 開始,我們的容器映象倉庫已從 k8s.gcr.io 變更為 registry.k8s.io。這個新的映象倉庫將負載分散到多個雲服務提供商和區域,其功能類似於 Kubernetes 容器映象的內容分發網路(CDN)。這一變化減少了專案對單一實體的依賴,併為廣大使用者提供了更快的下載體驗。

長話短說:關於此變更您需要了解什麼

  • Kubernetes 1.25 1.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 configClusterConfiguration 中設定:

apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
imageRepository: "k8s.gcr.io"

在 kubelet 中恢復映象倉庫名稱

kubelet 用於 Pod 沙箱 (pause) 的映象可以透過配置您的容器執行時或設定 --pod-infra-container-image 標誌來覆蓋,具體取決於您使用的 Kubernetes 版本。

其他執行時:containerdCRI-Ocri-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 日更新。