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

聯絡。

本頁面說明叢集管理員和資安工程師如何輪替為 GKE control plane authority 設定的憑證授權單位 (CA) 和服務帳戶簽署金鑰。

您應熟悉下列概念:

規劃憑證輪換

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

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

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

請輪替憑證,避免 CA 到期、降低金鑰版本遭盜用的風險,並做為貴組織安全性做法的一環。如要規劃特定 GKE control plane authority 資源的輪替頻率,請考量下列事項:

  • 根據預設,由憑證授權單位服務 (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 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
  • 現有叢集使用自行管理的 CA 和服務帳戶金鑰,並執行 GKE 1.35.2-gke.1842000 以上版本。

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

    • 金鑰專案:包含 Cloud KMS 和 CA 服務資源的專案。
    • 叢集專案:含有 GKE 叢集的專案。
  • 如要執行本文件中的驗證工作,請確認已啟用下列資料存取稽核記錄:

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

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

必要角色和權限

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

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

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

限制

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

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

設定 GKE control plane authority 時,您會將服務帳戶簽署金鑰和服務帳戶驗證金鑰新增至叢集。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-keys=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)")
      
    4. 確認是否正在使用新的簽署金鑰版本:

      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)"
      

      輸出內容是新簽署金鑰版本的資源路徑。

  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 control plane authority CA

以下各節說明如何輪替叢集用於 GKE control plane authority 的根 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 替換為要輪替的原始匯總根憑證授權單位名稱。

  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 核發的所有憑證替換為新憑證。

如要刪除原始根憑證授權單位,請使用 gcloud privateca roots delete 指令,如以下步驟所述。在這些指令中,--ignore-active-certificates 旗標會在寬限期過後刪除 CA,即使 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 替換為要輪替的原始匯總根憑證授權單位名稱。

  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、停用根 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. 如果只要輪替叢集根 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
      
  3. 控制層和節點升級完畢後,請更新所有 Kubernetes API 用戶端 (例如 kubectl CLI),以便使用更新後的信任套件。如果您使用 Kubernetes CertificateSigningRequests 手動產生憑證,請重新核發所有憑證,並將新憑證提供給 API 用戶端。

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

後續步驟