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

Kubernetes v1.26:Kubelet 憑證供應商的 GA 支援

Kubernetes v1.26 引入了普遍可用的 (GA) kubelet 憑證提供者外掛程式 支援,提供可擴展的外掛程式框架,可動態獲取任何容器映像登錄檔的憑證。

背景

Kubernetes 支援動態獲取容器登錄檔服務憑證的功能。在 Kubernetes v1.20 之前,此功能已編譯到 kubelet 中,並且僅適用於 Amazon Elastic Container Registry、Azure Container Registry 和 Google Cloud Container Registry。

Figure 1: Kubelet built-in credential provider support for Amazon Elastic Container Registry, Azure Container Registry, and Google Cloud Container Registry.

圖 1:Kubelet 內建憑證提供者支援 Amazon Elastic Container Registry、Azure Container Registry 和 Google Cloud Container Registry。

Kubernetes v1.20 引入了 kubelet 憑證提供者外掛程式的 Alpha 支援,這為 kubelet 提供了一種機制,可以動態驗證和提取任意容器登錄檔的映像 - 無論這些是公用登錄檔、託管服務,甚至是自我託管的登錄檔。在 Kubernetes v1.26 中,此功能現在已正式 GA

Figure 2: Kubelet credential provider overview

圖 2:Kubelet 憑證提供者概述

為什麼它很重要?

在 Kubernetes v1.20 之前,如果您想要動態獲取 ACR(Azure Container Registry)、ECR(Elastic Container Registry)或 GCR(Google Container Registry)以外的映像登錄檔的憑證,則需要修改 kubelet 程式碼。新的外掛程式機制可用於任何叢集,並讓您無需對 Kubernetes 本身進行任何更改即可驗證新登錄檔。任何雲端供應商或供應商都可以發布一個外掛程式,讓您可以使用其映像登錄檔進行驗證。

運作方式

kubelet 和 exec 外掛程式二進制檔案透過 stdio(stdin、stdout 和 stderr)進行通訊,方法是傳送和接收 json 序列化的 API 版本類型。如果啟用了 exec 外掛程式,並且 kubelet 需要與外掛程式匹配的映像的驗證資訊,則 kubelet 將執行外掛程式二進制檔案,透過 stdin 傳遞 CredentialProviderRequest API。然後,exec 外掛程式與容器登錄檔通訊以動態獲取憑證,並在編碼後的 CredentialProviderResponse API 回應中透過 stdout 將憑證傳回給 kubelet。

Figure 3: Kubelet credential provider plugin flow

圖 3:Kubelet 憑證提供者外掛程式流程

在從 kubelet 接收憑證後,外掛程式還可以指示憑證可以快取多久,以防止 kubelet 為後續對同一登錄檔的映像提取請求不必要地執行外掛程式。如果外掛程式未指定快取持續時間,則 kubelet 可以指定預設快取持續時間(更多詳細資訊如下)。

{
  "apiVersion": "kubelet.k8s.io/v1",
  "kind": "CredentialProviderResponse",
  "auth": {
    "cacheDuration": "6h",
    "private-registry.io/my-app": {
      "username": "exampleuser",
      "password": "token12345"
    }
  }
}

此外,外掛程式可以指定快取憑證有效的範圍。這是透過 CredentialProviderResponse 中的 cacheKeyType 欄位指定的。當值為 Image 時,kubelet 將僅針對與第一個請求的映像完全匹配的未來映像提取使用快取憑證。當值為 Registry 時,kubelet 將針對任何後續映像提取使用快取憑證,這些提取目標是相同的登錄檔主機,但使用不同的路徑(例如,gcr.io/foo/bargcr.io/bar/foo 指的是來自同一登錄檔的不同映像)。最後,當值為 Global 時,kubelet 將針對與外掛程式匹配的所有映像使用傳回的憑證,包括可以映射到不同登錄檔主機的映像(例如,gcr.io 與 registry.k8s.io(先前為 k8s.gcr.io))。cacheKeyType 欄位是外掛程式實作所必需的。

{
  "apiVersion": "kubelet.k8s.io/v1",
  "kind": "CredentialProviderResponse",
  "auth": {
    "cacheKeyType": "Registry",
    "private-registry.io/my-app": {
      "username": "exampleuser",
      "password": "token12345"
    }
  }
}

使用 kubelet 憑證提供者

您可以透過將 exec 外掛程式安裝到每個節點上 kubelet 可存取的本機目錄中來配置憑證提供者。然後,您為 kubelet 設定兩個命令列引數

  • --image-credential-provider-config:憑證提供者外掛程式配置檔案的路徑。
  • --image-credential-provider-bin-dir:憑證提供者外掛程式二進制檔案所在目錄的路徑。

kubelet 讀取傳遞到 --image-credential-provider-config 中的配置檔案,以確定應為 Pod 使用的容器映像調用哪些 exec 外掛程式。請注意,每個提供者的名稱都必須與位於 --image-credential-provider-bin-dir 中指定的本機目錄中的二進制檔案的名稱相符,否則 kubelet 無法找到要調用的外掛程式的路徑。

kind: CredentialProviderConfig
apiVersion: kubelet.config.k8s.io/v1
providers:
- name: auth-provider-gcp
  apiVersion: credentialprovider.kubelet.k8s.io/v1
  matchImages:
  - "container.cloud.google.com"
  - "gcr.io"
  - "*.gcr.io"
  - "*.pkg.dev"
  args:
  - get-credentials
  - --v=3
  defaultCacheDuration: 1m

以下概述了 Kubernetes 專案如何使用 kubelet 憑證提供者進行端對端測試。

Figure 4: Kubelet credential provider configuration used for Kubernetes e2e testing

圖 4:用於 Kubernetes e2e 測試的 Kubelet 憑證提供者配置

有關更多配置詳細資訊,請參閱Kubelet 憑證提供者

參與其中

如果您想報告錯誤或對 Kubelet 憑證提供者有功能請求,請加入 SIG Node。您可以透過以下方式與我們聯繫