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

Kubernetes v1.26:Kubelet 憑據提供程式的 GA 支援

Kubernetes v1.26 引入了對 Kubelet 憑證提供程式外掛的正式釋出(GA)支援,提供了一個可擴充套件的外掛框架,用於為任何容器映象倉庫動態獲取憑證。

背景

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 中,此功能現已正式釋出。

Figure 2: Kubelet credential provider overview

圖 2:Kubelet 憑證提供程式概述

為什麼它很重要?

在 Kubernetes v1.20 之前,如果你想為除 ACR(Azure 容器倉庫)、ECR(彈性容器倉庫)或 GCR(Google 容器倉庫)之外的映象倉庫動態獲取憑證,你需要修改 kubelet 程式碼。新的外掛機制可以在任何叢集中使用,並讓你在無需對 Kubernetes 本身進行任何更改的情況下對新倉庫進行身份驗證。任何雲提供商或供應商都可以釋出一個外掛,讓你透過其映象倉庫進行身份驗證。

工作原理

kubelet 和 exec 外掛二進位制檔案透過 stdio(標準輸入、標準輸出和標準錯誤)進行通訊,傳送和接收 json 序列化的、帶 API 版本的型別。如果啟用了 exec 外掛,並且 kubelet 需要為與外掛匹配的映象獲取身份驗證資訊,kubelet 將執行外掛二進位制檔案,透過標準輸入傳遞 CredentialProviderRequest API。然後,exec 外掛與容器倉庫通訊以動態獲取憑證,並透過標準輸出將憑證以 CredentialProviderResponse API 的編碼響應形式返回給 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 vs 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 外掛。請注意,每個 *provider* 的名稱必須與 --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。你可以透過以下方式聯絡我們: