本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kubernetes API 和功能移除 (1.22 版本):您需要知道的資訊
隨著 Kubernetes API 的演進,API 會定期重新組織或升級。當 API 演進時,它們取代的舊 API 會被棄用,並最終移除。請參閱 Kubernetes API 移除 以閱讀更多關於 Kubernetes 移除 API 的政策。
我們希望確保您了解一些即將進行的移除。這些是您可以在當前支援的 Kubernetes 版本中使用的 Beta 版 API,並且它們已經被棄用。所有這些移除的原因是它們已被更新、更穩定的(「GA」)API 取代。
Kubernetes 1.22 預計於 2021 年 8 月發布,將移除許多已棄用的 API。更新:Kubernetes 1.22:達到新的高峰 提供了關於 v1.22 版本的詳細資訊。
Kubernetes v1.22 的 API 移除
v1.22 版本將立即停止提供我們在下面列出的 API 版本。這些都是 Beta 版 API,先前已被棄用,轉而支持更新且更穩定的 API 版本。
ValidatingWebhookConfiguration
和MutatingWebhookConfiguration
API 的 Beta 版本(admissionregistration.k8s.io/v1beta1 API 版本)- Beta 版
CustomResourceDefinition
API (apiextensions.k8s.io/v1beta1) - Beta 版
APIService
API (apiregistration.k8s.io/v1beta1) - Beta 版
TokenReview
API (authentication.k8s.io/v1beta1) SubjectAccessReview
、LocalSubjectAccessReview
、SelfSubjectAccessReview
的 Beta 版 API 版本(來自 authorization.k8s.io/v1beta1 的 API 版本)- Beta 版
CertificateSigningRequest
API (certificates.k8s.io/v1beta1) - Beta 版
Lease
API (coordination.k8s.io/v1beta1) - 所有 Beta 版
Ingress
API(extensions/v1beta1 和 networking.k8s.io/v1beta1 API 版本)
Kubernetes 文件涵蓋了 v1.22 的 API 移除,並說明了這些 API 在 Beta 版和穩定版之間的變更。
該怎麼辦
我們將逐一介紹受這些移除影響的每個資源,並說明您需要採取的步驟。
Ingress
- 遷移至使用 networking.k8s.io/v1 Ingress API,自 v1.19 版本以來可用。
相關的 API IngressClass 旨在補充 Ingress 概念,讓您在一個叢集中配置多種類型的 Ingress。如果您目前正在使用已棄用的kubernetes.io/ingress.class
註解,請計劃切換為使用.spec.ingressClassName
欄位。
在任何運行 Kubernetes v1.19 或更高版本的叢集上,您都可以使用 v1 API 來檢索或更新現有的 Ingress 物件,即使它們是使用較舊的 API 版本建立的。當您將 Ingress 轉換為 v1 API 時,您應該檢閱該 Ingress 中的每個規則。較舊的 Ingress 使用舊版的
ImplementationSpecific
路徑類型。請將 路徑匹配 從ImplementationSpecific
切換為Prefix
或Exact
。改用這些替代路徑類型的優點之一是,它使得在不同的 Ingress 類別之間遷移變得更容易。ⓘ 除了升級您自己作為用戶端使用的 Ingress API 之外,請確保您使用的每個 Ingress 控制器都與 v1 Ingress API 相容。請閱讀 Ingress 先決條件 以取得更多關於 Ingress 和 Ingress 控制器的背景資訊。
ValidatingWebhookConfiguration
和MutatingWebhookConfiguration
- 遷移至使用 admissionregistration.k8s.io/v1 API 版本的 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration,自 v1.16 版本以來可用。
您可以使用 v1 API 來檢索或更新現有的物件,即使它們是使用較舊的 API 版本建立的。 CustomResourceDefinition
- 遷移至使用 CustomResourceDefinition apiextensions.k8s.io/v1 API,自 v1.16 版本以來可用。
您可以使用 v1 API 來檢索或更新現有的物件,即使它們是使用較舊的 API 版本建立的。如果您在叢集中定義了任何自訂資源,這些資源在您升級後仍然會提供服務。如果您正在使用外部 CustomResourceDefinition,您可以使用
kubectl convert
來轉換現有的 manifest 以使用較新的 API。由於 Beta 版和穩定版 CustomResourceDefinition 之間存在一些功能上的差異,我們的建議是測試每個 CustomResourceDefinition,以確保升級後它能如您預期般運作。 APIService
- 遷移至使用 apiregistration.k8s.io/v1 APIService API,自 v1.10 版本以來可用。
您可以使用 v1 API 來檢索或更新現有的物件,即使它們是使用較舊的 API 版本建立的。如果您已經使用 APIService 物件進行 API 聚合,則此聚合在您升級後會繼續運作。 TokenReview
- 遷移至使用 authentication.k8s.io/v1 TokenReview API,自 v1.10 版本以來可用。
除了透過 HTTP 提供此 API 外,Kubernetes API 伺服器也使用相同的格式來 傳送 TokenReview 到 webhook。v1.22 版本預設會繼續使用 v1beta1 API 來處理傳送到 webhook 的 TokenReview。請參閱 展望未來,以取得關於切換到穩定版 API 的一些具體提示。
SubjectAccessReview
、SelfSubjectAccessReview
和LocalSubjectAccessReview
- 遷移至使用 authorization.k8s.io/v1 版本的這些 授權 API,自 v1.6 版本以來可用。
CertificateSigningRequest
- 遷移至使用 certificates.k8s.io/v1 CertificateSigningRequest API,自 v1.19 版本以來可用。
您可以使用 v1 API 來檢索或更新現有的物件,即使它們是使用較舊的 API 版本建立的。現有已頒發的憑證在您升級時會保留其有效性。 Lease
- 遷移至使用 coordination.k8s.io/v1 Lease API,自 v1.14 版本以來可用。
您可以使用 v1 API 來檢索或更新現有的物件,即使它們是使用較舊的 API 版本建立的。
kubectl convert
有一個 kubectl
的外掛程式提供了 kubectl convert
子命令。這是一個官方外掛程式,您可以從 Kubernetes 下載。請參閱 下載 Kubernetes 以取得更多詳細資訊。
您可以使用 kubectl convert
來更新 manifest 檔案,以使用不同的 API 版本。例如,如果您的原始碼控制中有一個 manifest 使用了 Beta 版 Ingress API,您可以簽出該定義,並運行 kubectl convert -f <manifest> --output-version <group>/<version>
。您可以使用 kubectl convert
命令來自動轉換現有的 manifest。
例如,若要將較舊的 Ingress 定義轉換為 networking.k8s.io/v1
,您可以運行
kubectl convert -f ./legacy-ingress.yaml --output-version networking.k8s.io/v1
自動轉換使用的技術與 Kubernetes 控制平面更新最初使用較舊 API 版本建立的物件類似。由於它是機械式的轉換,您可能需要進入並更改 manifest 以調整預設值等。
預演升級
如果您管理叢集的 API 伺服器元件,您可以在升級到 Kubernetes v1.22 之前嘗試這些 API 移除。
若要執行此操作,請將以下內容新增至 kube-apiserver 命令列引數
--runtime-config=admissionregistration.k8s.io/v1beta1=false,apiextensions.k8s.io/v1beta1=false,apiregistration.k8s.io/v1beta1=false,authentication.k8s.io/v1beta1=false,authorization.k8s.io/v1beta1=false,certificates.k8s.io/v1beta1=false,coordination.k8s.io/v1beta1=false,extensions/v1beta1/ingresses=false,networking.k8s.io/v1beta1=false
(副作用是,這也會關閉 EndpointSlice 的 v1beta1 版本 - 在您測試時請注意這一點)。
一旦您將叢集中所有的 kube-apiserver 都切換為使用該設定,這些 Beta API 就會被移除。您可以測試 API 用戶端 (kubectl
、部署工具、自訂控制器等) 是否仍然如您預期般運作,並且如果需要,您可以還原,而無需規劃更具破壞性的降級。
給軟體作者的建議
也許您正在閱讀本文是因為您是與 Kubernetes 整合的附加元件或其他組件的開發人員?
如果您開發 Ingress 控制器、Webhook 身份驗證器、API 聚合或其他任何依賴這些已棄用 API 的工具,您應該已經開始將您的軟體切換過來。
您可以使用為升級預演中的提示來執行您自己的僅使用新 API 的 Kubernetes 叢集,並確保您的程式碼運作良好。對於您的文件,請確保讀者了解他們應為 Kubernetes v1.22 升級採取的任何步驟。
在可能的情況下,協助您的使用者儘早採用新的 API(也許在測試環境中)- 這樣他們就可以向您提供有關任何問題的回饋。
Kubernetes v1.25 中還有一些更多棄用即將到來,因此請計劃將這些也涵蓋在內。
Kubernetes API 移除
以下是一些關於 Kubernetes 為何移除某些 API 的背景資訊,以及關於 Kubernetes 中穩定 API 的承諾。
Kubernetes 遵循已定義的棄用政策來處理其功能,包括 Kubernetes API。該政策允許替換 Kubernetes 中的穩定 (“GA”) API。重要的是,此政策意味著只有在有更新的穩定版本 API 可用時,才會棄用穩定的 API。
這種穩定性保證非常重要:如果您正在使用穩定的 Kubernetes API,則永遠不會發布迫使您切換到 Alpha 或 Beta 功能的新版本。
早期階段有所不同。Alpha 功能正在測試中,可能不完整。幾乎總是,Alpha 功能預設為停用。Kubernetes 版本可以並且確實會移除未成功實現的 Alpha 功能。
在 Alpha 之後,是 Beta。這些功能通常預設為啟用;如果測試成功,該功能可以升級為穩定版。如果沒有,則可能需要重新設計。
去年,Kubernetes 正式採用了一項針對已達到 Beta 階段的 API 的政策
對於 Kubernetes REST API,當新功能的 API 達到 Beta 版時,倒數計時就開始了。Beta 品質的 API 現在有三個版本 … 要么
- 達到 GA 並棄用 Beta 版,要么
- 有一個新的 Beta 版本 (並棄用之前的 Beta 版本)。
在該文章發布時,三個 Kubernetes 版本相當於大約九個日曆月。同月稍晚,Kubernetes 採用了每年三個版本的新發布節奏,因此倒數計時週期現在大約為十二個日曆月。
無論 API 移除是因為 Beta 功能升級為穩定版,還是因為該 API 未被證明是成功的,Kubernetes 都將繼續遵循其棄用政策並確保遷移選項已記錄在案,從而移除 API。
展望未來
如果您使用 Webhook 身份驗證檢查,則有一個設定與您相關。未來的 Kubernetes 版本將預設切換為使用 authentication.k8s.io/v1
API 將 TokenReview 物件發送到 Webhook。目前,預設是將 authentication.k8s.io/v1beta1
TokenReview 發送到 Webhook,這仍然是 Kubernetes v1.22 的預設設定。但是,如果您願意,您可以立即切換到穩定的 API:將 --authentication-token-webhook-version=v1
新增到 kube-apiserver 的命令列選項中,並檢查 Webhook 的身份驗證是否仍然如您預期般運作。
一旦您確定它運作良好,您可以將 --authentication-token-webhook-version=v1
選項設定在您的控制平面中。
計劃於明年發布的 v1.25 版本將停止提供幾個目前穩定且已穩定一段時間的 Kubernetes API 的 Beta 版本。相同的 v1.25 版本將移除 PodSecurityPolicy,該功能已被棄用且不會升級為穩定版。有關更多資訊,請參閱PodSecurityPolicy 棄用:過去、現在和未來。
計劃在 Kubernetes 1.25 中移除的 API 的官方列表是
- Beta 版
CronJob
API (batch/v1beta1) - Beta 版
EndpointSlice
API (networking.k8s.io/v1beta1) - Beta 版
PodDisruptionBudget
API (policy/v1beta1) - Beta 版
PodSecurityPolicy
API (policy/v1beta1)
想了解更多資訊嗎?
棄用會在 Kubernetes 版本說明中宣布。您可以在 1.19、1.20 和 1.21 的版本說明中查看待處理棄用的公告。
有關棄用和移除過程的資訊,請查看官方 Kubernetes 棄用政策文件。