使用引導令牌進行認證

特性狀態: Kubernetes v1.18 [stable]

引導令牌是一種簡單的持有者令牌,旨在用於建立新叢集或將新節點加入現有叢集。它旨在支援 kubeadm,但也適用於希望在不使用 kubeadm 的情況下啟動叢集的使用者。它還可以透過 RBAC 策略與 kubelet TLS 引導系統協同工作。

引導令牌概述

引導令牌透過駐留在 kube-system 名稱空間中的特定型別的 Secret(bootstrap.kubernetes.io/token)進行定義。這些 Secret 隨後由 API 伺服器中的引導認證器讀取。過期令牌由 Controller Manager 中的 TokenCleaner 控制器刪除。這些令牌還用於透過 BootstrapSigner 控制器為“發現”過程中使用的特定 ConfigMap 建立簽名。

令牌格式

引導令牌的形式為 abcdef.0123456789abcdef。更正式地說,它們必須匹配正則表示式 [a-z0-9]{6}\.[a-z0-9]{16}

令牌的第一部分是“令牌 ID”,被視為公共資訊。它用於在不洩露用於認證的秘密部分的情況下引用令牌。第二部分是“令牌秘密”,應僅與受信任方共享。

啟用引導令牌認證

可以透過在 API 伺服器上使用以下標誌來啟用引導令牌認證器

--enable-bootstrap-token-auth

啟用後,引導令牌可用作持有者令牌憑據,以對 API 伺服器進行認證請求。

Authorization: Bearer 07401b.f395accd246ae52d

令牌以使用者名稱 system:bootstrap:<token id> 進行認證,並且是 system:bootstrappers 組的成員。可以在令牌的 Secret 中指定額外的組。

透過在控制器管理器上啟用 tokencleaner 控制器,可以自動刪除過期令牌。

--controllers=*,tokencleaner

引導令牌 Secret 格式

每個有效令牌都由 kube-system 名稱空間中的 Secret 支援。你可以在這裡找到完整的詳細設計文件。

Secret 的示例如下:

apiVersion: v1
kind: Secret
metadata:
  # Name MUST be of form "bootstrap-token-<token id>"
  name: bootstrap-token-07401b
  namespace: kube-system

# Type MUST be 'bootstrap.kubernetes.io/token'
type: bootstrap.kubernetes.io/token
stringData:
  # Human readable description. Optional.
  description: "The default bootstrap token generated by 'kubeadm init'."

  # Token ID and secret. Required.
  token-id: 07401b
  token-secret: f395accd246ae52d

  # Expiration. Optional.
  expiration: 2017-03-10T03:22:11Z

  # Allowed usages.
  usage-bootstrap-authentication: "true"
  usage-bootstrap-signing: "true"

  # Extra groups to authenticate the token as. Must start with "system:bootstrappers:"
  auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress

Secret 的型別必須是 bootstrap.kubernetes.io/token,名稱必須是 bootstrap-token-<token id>。它也必須存在於 kube-system 名稱空間中。

usage-bootstrap-* 成員表示此 Secret 的預期用途。必須將其值設定為 true 才能啟用。

  • usage-bootstrap-authentication 表示令牌可以用作持有者令牌以向 API 伺服器進行認證。
  • usage-bootstrap-signing 表示令牌可用於簽署 cluster-info ConfigMap,如下所述。

expiration 欄位控制令牌的過期時間。過期令牌在使用時會被拒絕認證,並在 ConfigMap 簽名期間被忽略。過期值以 RFC3339 格式的絕對 UTC 時間編碼。啟用 tokencleaner 控制器以自動刪除過期令牌。

使用 kubeadm 進行令牌管理

你可以使用 kubeadm 工具來管理執行中的叢集上的令牌。有關詳細資訊,請參閱 kubeadm 令牌文件

ConfigMap 簽名

除了認證,令牌還可用於簽署 ConfigMap。這在客戶端信任 API 伺服器之前,在叢集引導過程的早期使用。已簽名的 ConfigMap 可透過共享令牌進行認證。

透過在控制器管理器上啟用 bootstrapsigner 控制器來啟用 ConfigMap 簽名。

--controllers=*,bootstrapsigner

已簽名的 ConfigMap 是 kube-public 名稱空間中的 cluster-info。典型的流程是,客戶端在未認證且忽略 TLS 錯誤的情況下讀取此 ConfigMap。然後,它透過檢視 ConfigMap 中嵌入的簽名來驗證 ConfigMap 的負載。

ConfigMap 可能如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-info
  namespace: kube-public
data:
  jws-kubeconfig-07401b: eyJhbGciOiJIUzI1NiIsImtpZCI6IjA3NDAxYiJ9..tYEfbo6zDNo40MQE07aZcQX2m3EB2rO3NuXtxVMYm9U
  kubeconfig: |
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: <really long certificate data>
        server: https://10.138.0.2:6443
      name: ""
    contexts: []
    current-context: ""
    kind: Config
    preferences: {}
    users: []    

ConfigMap 的 kubeconfig 成員是一個僅填充了叢集資訊的配置檔案。這裡傳遞的關鍵資訊是 certificate-authority-data。將來可能會擴充套件此欄位。

簽名是使用“分離”模式的 JWS 簽名。要驗證簽名,使用者應根據 JWS 規則編碼 kubeconfig 負載(base64 編碼並丟棄任何尾隨的 =)。然後使用該編碼的負載,透過將其插入到兩個點之間來形成一個完整的 JWS。你可以使用 HS256 方案(HMAC-SHA256)和完整的令牌(例如 07401b.f395accd246ae52d)作為共享秘密來驗證 JWS。使用者**必須**驗證是否使用了 HS256。

有關更多資訊,請查閱 kubeadm 實現細節部分。

最後修改時間:2024 年 9 月 11 日上午 11:29(太平洋標準時間):在 bootstrap-tokens.md 中新增 RFC3339 的超連結 (2e7c1d4935)