輪替叢集憑證


本頁說明如何輪替 GKE 叢集憑證。規劃並定期輪替叢集憑證,對於維持叢集健康狀態至關重要。本頁面說明如何執行憑證輪替。此外,您也會瞭解如何規劃定期輪替的最佳做法。

本頁面適用於負責管理 GKE 叢集憑證生命週期的安全專家。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱常見的 GKE Enterprise 使用者角色和工作

關於 GKE 中的憑證輪替

叢集根憑證授權單位 (CA) 的有效期限有限。CA 過期後,由該 CA 簽署的所有憑證都會失效,包括叢集用戶端憑證 (來自 MasterAuth API 欄位)、API 伺服器的金鑰和憑證,以及 kubelet 用戶端憑證。叢集憑證的生命週期取決於您建立叢集的時間,或上次輪替憑證的時間。詳情請參閱憑證生命週期

您可以執行憑證輪替來撤銷叢集的憑證,再發出新憑證。這項作業會輪替叢集 CA 私密金鑰,且需要重新建立節點,才能使用新憑證。您必須在目前憑證到期,為叢集開始並完成憑證輪替。除了輪替憑證以外,憑證輪替功能還能執行 IP 輪替

執行憑證輪替的時機

您應定期執行憑證輪替,並在目前憑證到期前執行。憑證輪替需要重新建立節點才能使用新憑證,這可能會中斷執行中的工作負載。規劃維護期並在維護時段執行輪替,避免叢集外部發生非預期的工作負載停機或 API 用戶端沒有回應。

如要進一步瞭解維護作業可用性如何影響叢集憑證輪替,以及叢集在輪替步驟中會遇到哪種中斷情形,請參閱手動變更表格中憑證輪替的資料列。這些變更會使用節點升級策略重新建立節點,並遵守維護政策。GKE 必須有可用資源,才能更新節點。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。

叢集憑證生命週期

叢集憑證的生命週期通常取決於叢集的建立時間,或最近一次輪替憑證的時間:

  • 大約在 2021 年 10 月前建立的叢集,其 CA 生命週期為 5 年。
  • 大約在 2021 年 10 月後建立的叢集,CA 的生命週期為 30 年。
  • 2022 年 1 月左右輪替的叢集,其 CA 生命週期為 30 年。

找出憑證即將到期或已過期的叢集

如果叢集的憑證將在未來 180 天內到期,或叢集的憑證已過期,GKE 會提供洞察資料和建議,說明您必須為這個叢集執行憑證輪替。這項指引包含憑證到期日。您可以在 Google Cloud 控制台中查看這項指引。或者,您可以使用 gcloud CLI 或 Recommender API 查看這項指引,並指定 CLUSTER_CA_EXPIRATION 子類型。

如果收到叢集的洞察資訊和建議,您必須執行憑證輪替,否則 GKE 會在目前 CA 到期日後 30 天內自動啟動憑證輪替,詳情請參閱下一節。憑證輪替完成後,洞察和建議最多可能要過 36 小時才會解決。

GKE 自動化政策,可防止叢集服務中斷

為避免叢集在目前憑證到期後進入無法復原的狀態,GKE 會在目前 CA 到期日前 30 天內,自動啟動憑證輪替程序。舉例來說,如果叢集 CA 在 2024 年 1 月 6 日到期,而您未在 2023 年 12 月 5 日前輪替憑證,GKE 會在 2023 年 12 月 7 日當天或之後啟動自動輪替,並嘗試在作業開始後七天內完成輪替。這項自動輪替是最後的嘗試,目的是為了避免叢集服務中斷,並有下列注意事項:

  • 自動輪替作業通常會遵守維護期間或維護作業排除時段,但 GKE 保留權利,可在憑證到期前 30 天內執行輪替步驟,不論維護作業是否可用。在 30 天內,GKE 會忽略第一步的維護可用性,也就是開始輪替
  • 如果維護作業導致 GKE 無法完成初始輪替作業,GKE 會持續嘗試完成輪替作業,直到憑證到期為止。憑證到期後,叢集將無法復原。
  • 憑證輪替完成後,系統會撤銷即將到期的憑證。您必須先設定用戶端使用新憑證,叢集外部的 Kubernetes API 用戶端 (例如本機環境中的 kubectl) 才能運作。
  • 輪替期間重新建立節點集區可能會導致執行中的工作負載中斷。

事前準備

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

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。

檢查憑證效期

建議您在執行憑證輪替前後檢查憑證生命週期,瞭解叢集根 CA 的效期。

如要檢查單一叢集的憑證生命週期,請執行下列指令:

gcloud container clusters describe CLUSTER_NAME \
    --location LOCATION \
    --format "value(masterAuth.clusterCaCertificate)" \
    | base64 --decode \
    | openssl x509 -noout -dates

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

notBefore=Mar 17 16:45:34 2023 GMT
notAfter=Mar  9 17:45:34 2053 GMT

如果您在啟動憑證輪替後執行這項指令,輸出內容會是原始憑證的生命週期。在完成輪替前,這個憑證仍有效。完成輪替後,輸出內容會顯示新憑證的生命週期。

如要檢查專案中所有叢集的憑證生命週期,請執行下列指令:

gcloud container clusters list --project PROJECT_ID \
    --format="value(name,masterAuth.clusterCaCertificate)" | \
while read -r cluster ca; do \
    expiry_date=$(echo -e "$ca" | base64 --decode | openssl x509 -noout -enddate | awk -F'=' '{print $2}'); \
    printf "%-40s  | %s\n" "$cluster" "$expiry_date" ; \
done | \
column -t | \
awk -F',' 'BEGIN{print "Cluster Name    |  Certificate Expiry Date"} {print}'

執行憑證輪替

憑證輪替的步驟如下:

  1. 啟動輪替:控制層除了原本的 IP 位址之外,也會開始為新的 IP 位址提供服務。新憑證會發給工作負載和控制層。
  2. 重新建立節點:GKE 會重新建立叢集節點,讓節點使用新的 IP 位址和憑證,並遵守維護期間和排除項目中的可用性。您也可以將節點版本升級至節點已執行的相同 GKE 版本,手動重建節點。
  3. 更新 API 用戶端:啟動輪替後,請更新所有叢集 API 用戶端 (例如使用 kubectl 的開發機器),透過新的 IP 位址與控制平面通訊。
  4. 完成輪替:控制層會停止透過原始 IP 位址提供流量。系統會撤銷舊憑證,包括 Kubernetes 服務帳戶的所有現有靜態憑證。

當您啟動憑證輪替,或 GKE 自動啟動輪替時,GKE 會自動執行這些步驟,包括嘗試完成輪替。在每個步驟中,如果叢集到期日距離現在超過 30 天,GKE 會遵守維護可用性。在叢集到期前的自動輪替期間,GKE 保留忽略維護可用性的權利,以防止叢集無法復原。在 30 天內,GKE 會忽略第一個步驟的維護可用性,也就是開始輪替

如果未在啟動憑證輪替後的七天內完成輪替作業,GKE 會嘗試為您完成輪替。如果叢集中的任何節點仍使用先前的憑證,自動完成作業就會失敗,但 GKE 會持續嘗試完成作業,直到憑證過期,叢集無法復原為止。您應規劃手動追蹤及完成您啟動的任何憑證輪替。如要覆寫維護作業可用性阻斷器,請在下列各節中執行指令,手動觸發輪替程序的這些階段。請勿依賴自動完成功能,這項功能只能盡量提供最佳結果。

啟動輪替

如要啟動憑證輪替,請執行下列指令:

gcloud container clusters update CLUSTER_NAME \
    --location LOCATION \
    --start-credential-rotation

這個指令會建立新憑證、將憑證發到控制層,並將控制層設為提供兩個 IP 位址的服務,為原本的 IP 位址和新 IP 位址提供服務。

重新建立節點

重新設定 API 伺服器,以在新 IP 位址上提供服務後,如果維護作業可用,GKE 會自動更新節點,以使用新的 IP 位址和憑證。GKE 會將所有節點升級至節點目前執行的 GKE 版本,並重新建立節點。詳情請參閱「節點集區升級」。

根據預設,GKE 會在您啟動作業七天後,自動完成憑證輪替。如果叢集有作用中的維護期間或排除項目,導致 GKE 無法在這七天內重新建立部分節點,憑證輪替作業一開始會無法完成。不過,GKE 會持續嘗試重建節點並完成輪替,直到維護可用性允許 GKE 繼續作業為止。在 Google Cloud Next 等重大活動期間,GKE 也可能會暫停自動重新建立節點,避免發生中斷情形。

  • 如果您使用維護排除項目或維護期間,可能會導致輪替失敗,請手動升級叢集,強制重新建立節點:

    gcloud container clusters upgrade CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=VERSION
    

    VERSION 替換為叢集已使用的相同 GKE 版本。

    詳情請參閱「手動變更,以遵守 GKE 維護政策」。

查看節點集區重建進度

  1. 如要監控輪替作業,請執行下列指令:

    gcloud container operations list \
        --filter="operationType=UPGRADE_NODES AND status=RUNNING" \
        --format="value(name)"
    

    此指令會傳回節點升級作業的「作業 ID」

  2. 如要對作業進行輪詢,請將作業 ID 傳送至下列指令:

    gcloud container operations wait OPERATION_ID
    

系統會逐一重建節點集區,每個集區都有各自的作業。如果您有多個節點集區,請按照這些操作說明輪詢每個作業。

更新 API 用戶端

啟動憑證輪替後,您必須更新叢集外的所有 API 用戶端 (例如開發人員機器上的 kubectl),以使用新憑證並指向控制層的新 IP 位址。

如要更新 API 用戶端,請對每個用戶端執行下列指令:

gcloud container clusters get-credentials CLUSTER_NAME \
    --location LOCATION

更新 Kubernetes ServiceAccount 憑證

如果您在叢集中使用 ServiceAccount 的靜態憑證,請改用短期憑證。完成輪替後,現有的 ServiceAccount 憑證就會失效。如果不想使用短期憑證,請務必在完成輪替後,為叢集中的所有 ServiceAccount 重新建立靜態憑證。

更新硬式編碼 IP 位址和防火牆規則

如果您在環境中將控制層的 IP 位址硬式編碼,或是防火牆規則以控制層的 IP 位址為目標,請將位址更新為新的 IP 位址。如果您完成輪替,但未更新應用程式和防火牆規則中的 IP 位址,當 GKE 停止透過先前的控制平面 IP 位址提供服務時,這些資源可能會發生中斷情形。

完成輪替

更新叢集外部的 API 用戶端後,請完成輪替,將控制層設為只使用新憑證和新 IP 位址提供服務:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --complete-credential-rotation

如果憑證輪替作業無法完成,並傳回類似下列的錯誤訊息,請參閱「錯誤 400:節點集區需要重新建立」:

ERROR: (gcloud.container.clusters.update) ResponseError: code=400, message=Node pool "test-pool-1" requires recreation.

GKE 會在自動完成輪替作業時遵守維護作業可用性,但為了避免叢集無法復原,GKE 可能會在憑證到期前 30 天內忽略這項可用性。如果輪替作業一開始失敗,且輪替作業至少在七天前啟動,GKE 會嘗試完成輪替作業,直到憑證到期為止,之後叢集就會無法復原。

後續步驟