混合版本代理

功能狀態: Kubernetes v1.28 [alpha] (預設啟用: false)

Kubernetes 1.32 包含一個 Alpha 功能,可讓 API 伺服器 將資源請求代理到其他同級 API 伺服器。當一個叢集中有多個執行不同 Kubernetes 版本的 API 伺服器時(例如,在長期發布到新版本的 Kubernetes 期間),這非常有用。

這使叢集管理員能夠配置高可用性叢集,這些叢集可以更安全地升級,方法是將資源請求(在升級期間發出)導向到正確的 kube-apiserver。這種代理可防止使用者看到因升級過程而產生的意外 404 Not Found 錯誤。

此機制稱為混合版本代理

啟用混合版本代理

啟動 API 伺服器 時,請確保已啟用 UnknownVersionInteroperabilityProxy 功能閘道

kube-apiserver \
--feature-gates=UnknownVersionInteroperabilityProxy=true \
# required command line arguments for this feature
--peer-ca-file=<path to kube-apiserver CA cert>
--proxy-client-cert-file=<path to aggregator proxy cert>,
--proxy-client-key-file=<path to aggregator proxy key>,
--requestheader-client-ca-file=<path to aggregator CA cert>,
# requestheader-allowed-names can be set to blank to allow any Common Name
--requestheader-allowed-names=<valid Common Names to verify proxy client cert against>,

# optional flags for this feature
--peer-advertise-ip=`IP of this kube-apiserver that should be used by peers to proxy requests`
--peer-advertise-port=`port of this kube-apiserver that should be used by peers to proxy requests`

# …and other flags as usual

API 伺服器之間的代理傳輸與身份驗證

  • 來源 kube-apiserver 重複使用 現有的 APIserver 用戶端身份驗證標誌 --proxy-client-cert-file--proxy-client-key-file 來呈現其身份,該身份將由其同級伺服器(目的地 kube-apiserver)驗證。目的地 API 伺服器根據您使用 --requestheader-client-ca-file 命令列引數指定的組態,驗證同級連線。

  • 若要驗證目的地伺服器的服務憑證,您必須透過指定 --peer-ca-file 命令列引數給來源 API 伺服器來設定憑證授權單位套件。

同級 API 伺服器連線的組態

若要設定 kube-apiserver 的網路位置,同級伺服器將使用該位置來代理請求,請使用 kube-apiserver 的 --peer-advertise-ip--peer-advertise-port 命令列引數,或在 API 伺服器組態檔中指定這些欄位。如果未指定這些標誌,同級伺服器將使用 --advertise-address--bind-address 命令列引數中的值給 kube-apiserver。如果這些也未設定,則會使用主機的預設介面。

混合版本代理

當您啟用混合版本代理時,聚合層 會載入一個特殊的篩選器,該篩選器執行以下操作

  • 當資源請求到達無法服務該 API 的 API 伺服器時(因為它處於早於 API 引入的版本,或 API 在 API 伺服器上已關閉),API 伺服器會嘗試將請求傳送到可以服務所請求 API 的同級 API 伺服器。它透過識別本機伺服器無法辨識的 API 群組/版本/資源來執行此操作,並嘗試將這些請求代理到能夠處理請求的同級 API 伺服器。
  • 如果同級 API 伺服器無法回應,來源 API 伺服器會以 503 ("Service Unavailable") 錯誤回應。

底層運作方式

當 API 伺服器收到資源請求時,它會先檢查哪些 API 伺服器可以服務所請求的資源。此檢查使用內部 StorageVersion API 進行。

  • 如果 API 伺服器知道該資源(例如,GET /api/v1/pods/some-pod),則會在本機處理該請求。

  • 如果找不到所請求資源的內部 StorageVersion 物件(例如,GET /my-api/v1/my-resource),且設定的 APIService 指定代理到擴充 API 伺服器,則會依照擴充 API 的一般 流程 進行代理。

  • 如果為所請求的資源找到有效的內部 StorageVersion 物件(例如,GET /batch/v1/jobs),且嘗試處理請求的 API 伺服器(處理 API 伺服器)已停用 batch API,則處理 API 伺服器會擷取服務相關 API 群組/版本/資源的同級 API 伺服器(在本例中為 api/v1/batch),方法是使用擷取的 StorageVersion 物件中的資訊。然後,處理 API 伺服器會將請求代理到其中一個知道所請求資源的相符同級 kube-apiserver。

    • 如果沒有已知該 API 群組/版本/資源的同級伺服器,則處理 API 伺服器會將請求傳遞給其自己的處理程序鏈,該鏈最終應傳回 404 ("Not Found") 回應。

    • 如果處理 API 伺服器已識別並選取同級 API 伺服器,但該同級伺服器無法回應(原因例如網路連線問題,或在接收到請求與控制器將同級伺服器的資訊註冊到控制平面之間發生資料競爭),則處理 API 伺服器會以 503 ("Service Unavailable") 錯誤回應。

上次修改時間為 2024 年 2 月 6 日 12:29 AM PST:Use new feature_gate_name option (a3f297bc80)