本頁面說明叢集管理員和資安工程師如何輪替為 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
如要啟用這些記錄類型,請參閱「啟用資料存取稽核記錄」。
- Cloud Key Management Service (KMS) API:
必要角色和權限
如要取得輪替客戶自行管理的 CA 和金鑰所需的權限,請要求管理員授予您下列 IAM 角色:
-
管理金鑰或金鑰版本:金鑰專案的 Cloud KMS 管理員 (
roles/cloudkms.admin) -
管理根 CA:金鑰專案的 CA 服務管理員 (
roles/privateca.admin) -
設定叢集,以便使用新的憑證:叢集專案的 Kubernetes Engine 叢集管理員 (
roles/container.clusterAdmin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
限制
用於服務帳戶簽署和驗證的非對稱 Cloud KMS 金鑰不支援自動金鑰輪替。
輪替服務帳戶簽署和驗證金鑰
設定 GKE control plane authority 時,您會將服務帳戶簽署金鑰和服務帳戶驗證金鑰新增至叢集。GKE 會使用這些金鑰,簽署及驗證 Kubernetes ServiceAccount 的不記名權杖。輪替時,您需要將新金鑰新增至服務帳戶驗證金鑰清單,等待變更生效,然後將服務帳戶簽署金鑰替換為新金鑰。
如要輪替服務帳戶金鑰,請按照下列步驟操作:
取得服務帳戶簽署金鑰原始金鑰版本的完整資源名稱:
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則是原始簽署金鑰版本的編號。為服務帳戶簽署金鑰建立新的金鑰版本:
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。
取得新金鑰版本的完整資源名稱:
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則是新簽署金鑰版本的編號。將新的金鑰版本新增至叢集的服務帳戶驗證金鑰組:
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 端點。
如要確認新的金鑰版本路徑已完全傳播,請按照下列步驟操作:
從 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 分鐘,然後重新執行指令。
連線至叢集,以便執行
kubectl指令:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION從 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 分鐘,然後重試指令。
更新叢集,使用新的金鑰版本做為服務帳戶簽署金鑰:
gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=CLUSTER_PROJECT_ID \ --service-account-signing-keys=NEW_KEY_VERSION_PATH確認新的服務帳戶權杖使用新的金鑰版本:
建立 ServiceAccount:
kubectl create serviceaccount test-sa-1為 ServiceAccount 建立權杖:
kubectl create token test-sa-1從 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)")確認是否正在使用新的簽署金鑰版本:
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)"輸出內容是新簽署金鑰版本的資源路徑。
等待叢集中使用原始服務帳戶簽署金鑰版本的所有權杖到期。權杖生命週期預設為一小時,最長可設為 24 小時。如要檢查叢集中設定的權杖生命週期,請執行下列指令:
kubectl get pods -A -o json | jq -r '.items[]?.spec?.volumes[]?.projected?.sources[]?.serviceAccountToken?.expirationSeconds | select(. != null)' | sort -nr | head -n 1等待上一個步驟輸出內容中設定的權杖生命週期結束。這段時間過後,叢集中的所有繫結權杖都會使用新的服務帳戶簽署金鑰版本。
從叢集的驗證金鑰清單中移除原始金鑰版本:
gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=CLUSTER_PROJECT_ID \ --service-account-verification-keys=NEW_KEY_VERSION_PATH選用:停用原始金鑰版本。確認原始金鑰版本未在使用中,且叢集運作正常後,請刪除金鑰版本。
除非您是為了因應重大事件而輪替金鑰,否則建議您等待幾天,再刪除原始金鑰版本。詳情請參閱「刪除與還原金鑰版本」。
完成這些步驟後,叢集中所有新的和現有服務帳戶權杖都會由新的金鑰版本簽署。API 伺服器會拒絕任何使用原始金鑰版本不記名權杖的要求,因為叢集設定中不存在原始金鑰版本。
輪替 GKE control plane authority CA
以下各節說明如何輪替叢集用於 GKE control plane authority 的根 CA。
為 CA 建立新的金鑰版本
為叢集根 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。
為匯總根 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 金鑰名稱。為 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 金鑰名稱。為 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
取得新叢集根 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是新金鑰版本的編號。在叢集 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:組織名稱。
取得新匯總根 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在匯總 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:上一個步驟輸出內容中新金鑰版本的完整資源名稱。
取得新 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在 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:上一個步驟輸出內容中新金鑰版本的完整資源名稱。
取得新 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在 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:上一個步驟輸出內容中新金鑰版本的完整資源名稱。
繼續操作前,請按照「重新啟動控制層和節點」一節的操作說明,將根 CA 變更傳播至叢集信任套件。
以新的根 CA 取代原始根 CA
重新啟動控制層和節點後,請按照下列步驟操作:
啟用新的叢集根 CA:
gcloud privateca roots enable CLUSTER_ROOT_CA_NAME \ --pool=CLUSTER_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_ID啟用新的匯總根 CA:
gcloud privateca roots enable AGGREGATION_ROOT_CA_NAME \ --pool=AGGREGATION_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_ID啟用新的 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啟用新的 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停用原始叢集根 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 名稱。停用原始匯總根 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替換為要輪替的原始匯總根憑證授權單位名稱。停用原始 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 名稱。停用原始 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 名稱。此時,新的根 CA 會在叢集中核發所有新憑證。如要為每個節點上的
kubelet核發新憑證,請重新啟動控制層和節點。kubelet憑證的效期很長,因此必須執行這個步驟。
叢集維持健康狀態數天後,您可以刪除原始根 CA,如下一節所述。
刪除原始根 CA
本節說明如何刪除原始根憑證授權單位。執行這些步驟前,請先確認下列事項:
- 將原始根 CA 替換為新的根 CA 後,叢集在多天內仍保持健康狀態。
- 您已將原始根 CA 核發的所有憑證替換為新憑證。
如要刪除原始根憑證授權單位,請使用 gcloud privateca roots delete 指令,如以下步驟所述。在這些指令中,--ignore-active-certificates 旗標會在寬限期過後刪除 CA,即使 CA 有未撤銷或未過期的憑證也一樣。
刪除原始叢集根 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 名稱。刪除原始匯總根 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替換為要輪替的原始匯總根憑證授權單位名稱。刪除原始 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 名稱。刪除原始 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 名稱。選用:將根 CA 的變更套用至叢集信任套件。如需操作說明,請參閱「重新啟動控制層和節點」一節。如果略過這個步驟,系統會在下次升級控制層和節點版本時,移除原始根 CA。
重新啟動控制層和節點
變更叢集的根 CA 設定時 (例如啟用根 CA、停用根 CA 或撤銷憑證),必須將這些變更套用至叢集的信任套件。如要將變更套用至叢集的信任套件,請重新啟動控制層和節點 (在某些情況下)。
將叢集控制層升級至目前使用的版本。
找出控制層目前使用的 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。
升級控制層:
gcloud container clusters upgrade CLUSTER_NAME \ --master \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=CLUSTER_VERSION \ --project=CLUSTER_PROJECT_ID
如果只要輪替叢集根 CA,請將每個節點集區升級至目前使用的版本,觸發節點重新建立作業。
找出節點集區使用的 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替換為要升級的節點集區名稱。升級節點集區:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=NODE_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=CLUSTER_VERSION \ --project=CLUSTER_PROJECT_ID
控制層和節點升級完畢後,請更新所有 Kubernetes API 用戶端 (例如 kubectl CLI),以便使用更新後的信任套件。如果您使用 Kubernetes CertificateSigningRequests 手動產生憑證,請重新核發所有憑證,並將新憑證提供給 API 用戶端。
如果您在 CA 輪替期間執行本節中的步驟,請繼續進行輪替的下一個階段,也就是本文件中的下列其中一節: