輪替客戶代管控制層的 CA 和金鑰


聯絡。

本頁說明叢集管理員和安全防護工程師如何輪替為 GKE 控制層授權設定的憑證授權單位 (CA) 和服務帳戶簽署金鑰。

您必須熟悉下列概念:

規劃憑證輪替

本頁說明如何輪替控制層中的下列憑證元件:

  • 叢集根 CA、匯總根 CA、etcd API 根 CA 和 etcd 對等互連根 CA。
  • Kubernetes ServiceAccount 簽署和驗證金鑰。

您也可以輪替用於加密控制平面開機磁碟、etcd 磁碟和 etcd 內部備份的客戶管理加密金鑰,以供災難復原使用。 Google Cloud 詳情請參閱「輪替 etcd 和控制層開機磁碟加密金鑰」。

輪替憑證可避免 CA 過期、降低金鑰版本遭盜用的風險,並符合貴機構的安全性做法。如要規劃特定 GKE 控制層授權資源的輪替頻率,請考量下列事項:

  • 根據預設,憑證授權單位服務 (CA 服務) 中由根 CA 簽署的 GKE 憑證,會在建立日期後一年失效。
  • Cloud Key Management Service (Cloud KMS) 中的金鑰不會過期。只有在貴機構有金鑰輪替需求時,才需要手動輪替金鑰。為盡量減少執行中工作負載的中斷情形,請勿為這些金鑰設定自動金鑰輪替。

事前準備

開始之前,請確認您已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。
  • 現有叢集使用自行管理的 CA 和服務帳戶金鑰

  • 找出下列 Google Cloud 專案的專案 ID:

    • 金鑰專案:包含 Cloud KMS 和 CA Service 資源的專案。
    • 叢集專案:包含 GKE 叢集的專案。
  • 如要在這個頁面執行驗證工作,請確認已啟用下列資料存取稽核記錄:

    • Cloud Key Management Service (KMS) API:DATA_READ
    • 憑證授權單位服務:ADMIN_READ

    如要啟用這些記錄類型,請參閱「啟用資料存取稽核記錄」。

必要角色和權限

如要取得輪替客戶管理 CA 和金鑰所需的權限,請要求管理員授予下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

限制

用於服務帳戶簽署和驗證的非對稱 Cloud KMS 金鑰,不支援自動金鑰輪替。

輪替服務帳戶簽署和驗證金鑰

設定 GKE 控制平面授權時,請將服務帳戶簽署金鑰和服務帳戶驗證金鑰新增至叢集。GKE 會使用這些金鑰簽署及驗證 Kubernetes ServiceAccount 的不記名權杖。輪替期間,您會將新金鑰新增至服務帳戶驗證金鑰清單,等待變更傳播,然後以新金鑰取代服務帳戶簽署金鑰。

如要輪替服務帳戶金鑰,請按照下列步驟操作:

  1. 取得服務帳戶簽署金鑰原始金鑰版本的完整資源名稱:

    gcloud container clusters describe CLUSTER_NAME \
        --project=CLUSTER_PROJECT_ID \
        --location=CONTROL_PLANE_LOCATION \
        --format="value(userManagedKeysConfig.serviceAccountSigningKeys)"
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • CONTROL_PLANE_LOCATION:叢集位置。
    • CLUSTER_PROJECT_ID:叢集專案的專案 ID。

    輸出結果會與下列內容相似:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/SIGNING_KEY_NAME/cryptoKeyVersions/ORIGINAL_SIGNING_KEY_VERSION
    

    在這個輸出內容中,SIGNING_KEY_NAME 是金鑰的名稱,ORIGINAL_SIGNING_KEY_VERSION 則是原始簽署金鑰版本的編號。

  2. 為服務帳戶簽署金鑰建立新的金鑰版本:

    gcloud kms keys versions create \
        --key=SIGNING_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    更改下列內容:

    • SIGNING_KEY_NAME:服務帳戶簽署金鑰的名稱。
    • KEYRING_NAME:金鑰所屬金鑰環的名稱。
    • CONTROL_PLANE_LOCATION:金鑰環的 Google Cloud 位置。
    • KEY_PROJECT_ID主要專案的專案 ID。
  3. 取得新金鑰版本的完整資源名稱:

    gcloud kms keys versions list \
        --key=SIGNING_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
        --filter="STATE=ENABLED" --sort-by=~ \
        --format="value(name)" | sed 1q
    

    輸出結果會與下列內容相似:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/SIGNING_KEY_NAME/cryptoKeyVersions/NEW_SIGNING_KEY_VERSION
    

    在這個輸出內容中,SIGNING_KEY_NAME 是金鑰的名稱,NEW_SIGNING_KEY_VERSION 則是新簽署金鑰版本的編號。

  4. 將新金鑰版本新增至叢集的服務帳戶驗證金鑰集:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --service-account-verification-keys=ORIGINAL_KEY_VERSION_PATH,NEW_KEY_VERSION_PATH
    

    更改下列內容:

    • ORIGINAL_KEY_VERSION_PATH:原始簽署金鑰版本的完整資源名稱,來自本節第一個步驟的輸出內容。例如:projects/example-key-project/locations/us-central1/keyRings/example-keyring/cryptokeys/example-signing-key/cryptoKeyVersions/1
    • NEW_KEY_VERSION_PATH:上一步輸出內容中新簽署金鑰版本的完整資源名稱。例如: projects/example-key-project/locations/us-central1/keyRings/example-keyring/cryptokeys/example-signing-key/cryptoKeyVersions/2

    叢集更新作業完成後,新的金鑰版本路徑最多可能需要 10 分鐘,才會傳播至 Kubernetes API 伺服器和每個 GKE API 端點。

  5. 如要確認新金鑰版本路徑已完全傳播,請執行下列操作:

    1. 從 GKE API 取得叢集簽署金鑰的公開元件,做為 JSON Web Key Set (JWKS):

      curl https://container.googleapis.com/v1/projects/CLUSTER_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/clusters/CLUSTER_NAME/jwks
      

      輸出結果會與下列內容相似:

      {
        "keys": [
          {
            "kty": "RSA",
            "alg": "RS256",
            "use": "sig",
            "kid": "KEY1_ID",
            "n": "KEY1_MODULUS",
            "e": "KEY1_EXPONENT"
          },
          {
            "kty": "RSA",
            "alg": "RS256",
            "use": "sig",
            "kid": "KEY2_ID",
            "n": "KEY2_MODULUS",
            "e": "KEY2_EXPONENT"
          }
        ]
      }
      

      這項輸出內容必須有兩個金鑰項目,表示兩個金鑰版本都可在 GKE API 中使用。如果只看到一個金鑰項目,請等待 10 分鐘,然後重試該指令。

    2. 連線至叢集,以便執行 kubectl 指令:

      gcloud container clusters get-credentials CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION
      
    3. 從 Kubernetes API 伺服器取得叢集簽署金鑰的公開元件,做為 JWKS:

      kubectl get --raw /openid/v1/jwks | jq
      

      輸出結果會與下列內容相似:

      {
        "keys": [
          {
            "kty": "RSA",
            "alg": "RS256",
            "use": "sig",
            "kid": "KEY1_ID",
            "n": "KEY1_MODULUS",
            "e": "KEY1_EXPONENT"
          },
          {
            "kty": "RSA",
            "alg": "RS256",
            "use": "sig",
            "kid": "KEY2_ID",
            "n": "KEY2_MODULUS",
            "e": "KEY2_EXPONENT"
          }
        ]
      }
      

      這項輸出內容必須有兩個主要項目,表示 Kubernetes API 伺服器提供這兩個主要版本。如果只看到一個金鑰項目,請等待 10 分鐘,然後重試該指令。

  6. 更新叢集,將新版金鑰做為服務帳戶簽署金鑰:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --service-account-signing-key=NEW_KEY_VERSION_PATH
    
  7. 確認新服務帳戶權杖使用新版金鑰:

    1. 建立 ServiceAccount:

      kubectl create serviceaccount test-sa-1
      
    2. 為 ServiceAccount 建立權杖:

      kubectl create token test-sa-1
      
    3. 從 Logging 擷取最近簽署的摘要:

      export SIGNED_DIGEST=$(gcloud logging read \
          'resource.type="gke_cluster" '\
          'AND resource.labels.cluster_name="' CLUSTER_NAME '" '\
          'AND protoPayload.methodName="google.cloud.gkeauth.v1.Auth.SignServiceAccountJWT" '\
          'AND protoPayload.metadata.subject="system:serviceaccount:default:test-sa-1"' \
          --freshness=1h \
          --bucket=_Required \
          --location=global \
          --view=_AllLogs \
          --order=DESC \
          --limit=1 \
          --format="value(protoPayload.metadata.toBeSignedDigest)")
      
      1. 確認系統正在使用新的簽署金鑰版本:
        gcloud logging read \
            'resource.type="cloudkms_cryptokeyversion" '\
            'AND protoPayload.methodName="AsymmetricSign" '\
            'AND protoPayload.request.digest.sha256="'${SIGNED_DIGEST}'"' \
            --freshness=1h \
            --bucket=_Default \
            --location=global \
            --view=_AllLogs \
            --order=DESC \
            --limit=1 \
            --format="value(protoPayload.resourceName)"
        ```
      The output is the resource path of the new signing key version.
      
  8. 等待叢集中使用原始服務帳戶簽署金鑰版本的每個權杖到期。根據預設,權杖生命週期為一小時, 可設定的上限為 24 小時。如要檢查叢集中設定的權杖生命週期,請執行下列指令:

    kubectl get pods -A -o json | jq -r '.items[]?.spec?.volumes[]?.projected?.sources[]?.serviceAccountToken?.expirationSeconds | select(. != null)' | sort -nr | head -n 1
    
  9. 請等待上一步輸出內容中設定的權杖存留時間結束。這段時間過後,叢集中的所有繫結權杖都會使用新的服務帳戶簽署金鑰版本。

  10. 從叢集的驗證金鑰清單中移除原始金鑰版本:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --service-account-verification-keys=NEW_KEY_VERSION_PATH
    
  11. 選用:停用原始金鑰版本。確認原始金鑰版本未在使用中,且叢集運作正常後,即可刪除該金鑰版本。

    除非您是為了回應重大事件而輪替金鑰,否則建議您等待幾天,再刪除原始金鑰版本。詳情請參閱「刪除及還原金鑰版本」。

完成這些步驟後,叢集中的所有新舊服務帳戶權杖都會以新版金鑰簽署。API 伺服器會拒絕使用原始金鑰版本的持有人權杖提出的任何要求,因為叢集設定中沒有原始金鑰版本。

輪替 GKE 控制層授權單位 CA

以下各節說明如何輪替叢集用於 GKE 控制平面授權的根 CA。

為 CA 建立新金鑰版本

  1. 為叢集根 CA 金鑰建立新的金鑰版本:

    gcloud kms keys versions create \
        --key=CLUSTER_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    更改下列內容:

    • CLUSTER_CA_KEY_NAME:叢集根 CA 金鑰的叢集名稱。
    • KEYRING_NAME:金鑰所屬金鑰環的名稱。
    • CONTROL_PLANE_LOCATION:金鑰環的 Google Cloud 位置。這與叢集位置相同。
    • KEY_PROJECT_ID主要專案的專案 ID。
  2. 為匯總根 CA 金鑰建立新金鑰版本:

    gcloud kms keys versions create \
        --key=AGGREGATION_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    AGGREGATION_CA_KEY_NAME 替換為叢集的匯總根 CA 金鑰名稱。

  3. 為 etcd API 根 CA 金鑰建立新的金鑰版本:

    gcloud kms keys versions create \
        --key=ETCD_API_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ETCD_API_CA_KEY_NAME 替換為叢集的 etcd API 根 CA 金鑰名稱。

  4. 為 etcd 對等互連根 CA 金鑰建立新金鑰版本:

    gcloud kms keys versions create \
        --key=ETCD_PEER_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ETCD_PEER_CA_KEY_NAME 替換為叢集的 etcd 對等互連根 CA 金鑰名稱。

建立新的根 CA

  1. 取得新叢集根 CA 金鑰版本的完整資源名稱:

    gcloud kms keys versions list \
        --key=CLUSTER_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
        --filter="STATE=ENABLED" --sort-by=~ \
        --format="value(name)" | sed 1q
    

    輸出結果會與下列內容相似:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/CLUSTER_CA_KEY_NAME/cryptoKeyVersions/VERSION
    

    在這個輸出內容中,VERSION 是新金鑰版本的編號。

  2. 在叢集 CA 集區中建立新的叢集根 CA:

    gcloud privateca roots create CLUSTER_ROOT_CA_NAME \
        --pool=CLUSTER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --kms-key-version=CLUSTER_CA_KEY_PATH \
        --subject="CN=cluster-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID
    

    更改下列內容:

    • CLUSTER_ROOT_CA_NAME:新根 CA 的名稱。
    • CLUSTER_CA_POOL_NAME:叢集 CA 集區的名稱。
    • CLUSTER_CA_KEY_PATH:上一步輸出內容中新金鑰版本的完整資源名稱。
    • ORGANIZATION:貴機構名稱。
  3. 取得新匯總根 CA 金鑰版本的完整資源名稱:

    gcloud kms keys versions list \
        --key=AGGREGATION_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
        --filter="STATE=ENABLED" --sort-by=~ \
        --format="value(name)" | sed 1q
    

    輸出結果會與下列內容相似:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/AGGREGATION_CA_KEY_NAME/cryptoKeyVersions/VERSION
    
  4. 在匯總 CA 集區中建立新的匯總根 CA:

    gcloud privateca roots create AGGREGATION_ROOT_CA_NAME \
        --pool=AGGREGATION_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --kms-key-version=AGGREGATION_CA_KEY_PATH \
        --subject="CN=aggregation-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID
    

    更改下列內容:

    • AGGREGATION_ROOT_CA_NAME:新匯總根 CA 的名稱。
    • AGGREGATION_CA_POOL_NAME:匯總 CA 集區的名稱。
    • AGGREGATION_CA_KEY_PATH:上一步輸出內容中新金鑰版本的完整資源名稱。
  5. 取得新 etcd API 根 CA 金鑰版本的完整資源名稱:

    gcloud kms keys versions list \
        --key=ETCD_API_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
        --filter="STATE=ENABLED" --sort-by=~ \
        --format="value(name)" | sed 1q
    

    輸出結果會與下列內容相似:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/ETCD_API_CA_KEY_NAME/cryptoKeyVersions/VERSION
    
  6. 在 etcd API CA 集區中建立新的 etcd API 根 CA:

    gcloud privateca roots create ETCD_API_ROOT_CA_NAME \
        --pool=ETCD_API_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --kms-key-version=ETCD_API_CA_KEY_PATH \
        --subject="CN=etcd-api-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID
    

    更改下列內容:

    • ETCD_API_ROOT_CA_NAME:新 etcd API 根 CA 的名稱。
    • ETCD_API_CA_POOL_NAME:etcd API CA 集區的名稱。
    • ETCD_API_CA_KEY_PATH:上一步輸出內容中新金鑰版本的完整資源名稱。
  7. 取得新 etcd 對等互連根 CA 金鑰版本的完整資源名稱:

    gcloud kms keys versions list \
        --key=ETCD_PEER_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
        --filter="STATE=ENABLED" --sort-by=~ \
        --format="value(name)" | sed 1q
    

    輸出結果會與下列內容相似:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/ETCD_PEER_CA_KEY_NAME/cryptoKeyVersions/VERSION
    
  8. 在 etcd 對等互連 CA 集區中建立新的 etcd 對等互連根 CA:

    gcloud privateca roots create ETCD_PEER_ROOT_CA_NAME \
        --pool=ETCD_PEER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --kms-key-version=ETCD_PEER_CA_KEY_PATH \
        --subject="CN=etcd-peer-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID
    

    更改下列內容:

    • ETCD_PEER_ROOT_CA_NAME:新 etcd 對等互連根 CA 的名稱。
    • ETCD_PEER_CA_POOL_NAME:etcd 對等互連 CA 集區的名稱。
    • ETCD_PEER_CA_KEY_PATH:上一步輸出內容中新金鑰版本的完整資源名稱。
  9. 繼續操作前,請按照「重新啟動控制層和節點」一節的說明,將根 CA 變更傳播至叢集信任套件。

以新的根 CA 取代原始根 CA

重新啟動控制層和節點後,請按照下列步驟操作:

  1. 啟用新的叢集根 CA:

    gcloud privateca roots enable CLUSTER_ROOT_CA_NAME \
        --pool=CLUSTER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    
  2. 啟用新的匯總根 CA:

    gcloud privateca roots enable AGGREGATION_ROOT_CA_NAME \
        --pool=AGGREGATION_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    
  3. 啟用新的 etcd API 根 CA:

    gcloud privateca roots enable ETCD_API_ROOT_CA_NAME \
        --pool=ETCD_API_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    
  4. 啟用新的 etcd 對等互連根 CA:

    gcloud privateca roots enable ETCD_PEER_ROOT_CA_NAME \
        --pool=ETCD_PEER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    
  5. 停用原始叢集根 CA:

    gcloud privateca roots disable ORIGINAL_CLUSTER_ROOT_CA \
        --pool=CLUSTER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ORIGINAL_CLUSTER_ROOT_CA 替換為要輪替的原始叢集根 CA 名稱。

  6. 停用原始匯總根 CA:

    gcloud privateca roots disable ORIGINAL_AGGREGATION_ROOT_CA \
        --pool=AGGREGATION_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ORIGINAL_AGGREGATION_ROOT_CA 替換為要輪替的原始匯總根 CA 名稱。

  7. 停用原始 etcd API 根 CA:

    gcloud privateca roots disable ORIGINAL_ETCD_API_ROOT_CA \
        --pool=ETCD_API_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ORIGINAL_ETCD_API_ROOT_CA 替換為要輪替的原始 etcd API 根 CA 名稱。

  8. 停用原始 etcd 對等互連根 CA:

    gcloud privateca roots disable ORIGINAL_ETCD_PEER_ROOT_CA \
        --pool=ETCD_PEER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ORIGINAL_ETCD_PEER_ROOT_CA 替換為要輪替的原始 etcd 對等互連根 CA 名稱。

  9. 此時,叢集中的所有新憑證都會由新的根 CA 核發。如要為每個節點上的 kubelet 簽發新憑證,請重新啟動控制層和節點。由於kubelet憑證的效期很長,因此必須執行這個步驟。

如果叢集連續多天保持正常狀態,即可刪除原始根 CA,詳情請參閱下一節。

刪除原始根 CA

本節說明如何刪除原始根 CA。請先確認下列事項,再按照這些步驟操作:

  • 以新的根 CA 取代原始根 CA 後,叢集仍維持健康狀態多日。
  • 您已將原始根 CA 核發的所有憑證換成新憑證。

如要刪除原始根 CA,請使用 gcloud privateca roots delete 指令,如以下步驟所述。在這些指令中,即使 CA 具有未撤銷或未過期的憑證,--ignore-active-certificates 旗標也會在寬限期過後刪除 CA。

  1. 刪除原始叢集根 CA:

    gcloud privateca roots delete ORIGINAL_CLUSTER_ROOT_CA \
        --pool=CLUSTER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
          --ignore-active-certificates
    

    ORIGINAL_CLUSTER_ROOT_CA 替換為要輪替的原始叢集根 CA 名稱。

  2. 刪除原始匯總根 CA:

    gcloud privateca roots delete ORIGINAL_AGGREGATION_ROOT_CA \
        --pool=AGGREGATION_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
          --ignore-active-certificates
    

    ORIGINAL_AGGREGATION_ROOT_CA 替換為要輪替的原始匯總根 CA 名稱。

  3. 刪除原始 etcd API 根 CA:

    gcloud privateca roots delete ORIGINAL_ETCD_API_ROOT_CA \
        --pool=ETCD_API_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
          --ignore-active-certificates
    

    ORIGINAL_ETCD_API_ROOT_CA 替換為要輪替的原始 etcd API 根 CA 名稱。

  4. 刪除原始 etcd 對等互連根 CA:

    gcloud privateca roots delete ORIGINAL_ETCD_PEER_ROOT_CA \
        --pool=ETCD_PEER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
          --ignore-active-certificates
    

    ORIGINAL_ETCD_PEER_ROOT_CA 替換為要輪替的原始 etcd 對等互連根 CA 名稱。

  5. 選用:將根 CA 的變更傳播至叢集信任組合。 如需操作說明,請參閱「重新啟動控制層和節點」一節。如果略過這個步驟,系統會在下次升級控制層和節點版本時,移除原始根 CA。

重新啟動控制層和節點

變更叢集的根 CA 設定 (例如啟用/停用根 CA 或撤銷憑證) 時,必須將這些變更傳播至叢集的信任組合。如要將變更傳播至叢集的信任憑證組合,請重新啟動控制層和節點 (在某些情況下)。

  1. 將叢集控制層升級至目前使用的版本。

    1. 找出控制層已使用的 GKE 版本:

      gcloud container clusters describe CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --project=CLUSTER_PROJECT_ID \
          --format="value(currentMasterVersion)"
      

      更改下列內容:

      • CLUSTER_NAME:GKE 叢集名稱。
      • CLUSTER_VERSION:叢集目前執行的 GKE 版本。
      • CLUSTER_PROJECT_ID叢集專案的專案 ID。
    2. 升級控制層:

      gcloud container clusters upgrade CLUSTER_NAME \
          --master \
          --location=CONTROL_PLANE_LOCATION \
          --cluster-version=CLUSTER_VERSION \
          --project=CLUSTER_PROJECT_ID
      
  2. 如果您使用 Kubernetes CertificateSigningRequests 手動產生憑證,請重新核發所有憑證,並將新憑證提供給 API 用戶端。

  3. 如要進行叢集根 CA 輪替,請將每個節點集區升級至目前使用的版本,藉此觸發節點重建作業。

    1. 找出節點集區使用的 GKE 版本:

      gcloud container node-pools describe NODE_POOL_NAME \
          --cluster=CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --project=CLUSTER_PROJECT_ID \
          --format="value(version)"
      

      NODE_POOL_NAME 替換為要升級的節點集區名稱。

    2. 升級節點集區:

      gcloud container clusters upgrade CLUSTER_NAME \
          --node-pool=NODE_POOL_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --cluster-version=CLUSTER_VERSION \
          --project=CLUSTER_PROJECT_ID
      

如果您在 CA 輪替期間執行本節中的步驟,請繼續進行輪替的下一個階段,也就是這個頁面上的下列其中一節:

後續步驟