為確保叢集維持良好狀態,請務必規劃並定期輪替叢集憑證。本文說明如何執行憑證輪換,並提供規劃定期輪換的最佳做法。
本文件適用於負責 GKE 叢集憑證生命週期的安全專家。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。
關於 GKE 中的憑證輪換
叢集根憑證授權單位 (CA) 的效期有限。CA 過期後,由 CA 簽署的任何憑證都會失效,包括叢集用戶端憑證 (來自 MasterAuth API 欄位)、API 伺服器的金鑰和憑證,以及 kubelet 用戶端憑證。叢集憑證的有效期限取決於您建立叢集的時間,或上次輪替憑證的時間。詳情請參閱憑證生命週期。
您可以執行下列其中一種輪替類型,撤銷並重新核發這些憑證。
憑證輪換:
- 輪替控制層用於 Kubernetes API 伺服器的 IP 位址。
- 輪替叢集根 CA。
- 輪替 Kubernetes ServiceAccount 金鑰,用於簽署及驗證 ServiceAccount 憑證。
- 輪換匯總層 CA。
-
- 輪替控制層用於 Kubernetes API 伺服器的 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指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
- 請確認您有現有的 Autopilot 或 Standard 叢集。如需叢集,請建立 Autopilot 叢集。
檢查憑證效期
在執行憑證輪換前後,請檢查憑證生命週期,瞭解叢集根 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}'
執行憑證輪換
任何憑證輪換都包含下列步驟:
- 開始輪替:控制層除了原始 IP 位址外,也會開始使用新的 IP 位址。系統會向工作負載和控制層發放新憑證。
- 重新建立節點:GKE 會重新建立叢集節點,讓節點使用新的 IP 位址和憑證,並遵循維護期間和排除項目的可用性。您也可以手動重新建立節點,方法是將節點版本升級至節點已執行的相同 GKE 版本。
- 更新 API 用戶端:開始輪換後,請更新所有叢集 API 用戶端 (例如使用
kubectl的開發機器),以便使用新的 IP 位址與控制層通訊。 - 完成輪替:控制層停止透過原始 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 位址。
重新啟動具有長期連線的叢內元件
啟動 IP 位址或憑證輪換後,叢集的憑證授權單位 (CA) 也會輪換。部分叢集內元件 (例如 metrics-server 和 konnectivity-agent) 會維護存續時間較長的 TLS 連線,可能不會自動信任新的叢集 CA。
這種情況可能會導致與節點或其他叢集端點通訊時連線失敗,而且您可能會在元件記錄中看到 TLS 握手錯誤,例如 x509: certificate signed by unknown authority。
如果在啟動輪替後發現這些錯誤,可能需要手動重新啟動 Pod。重新啟動會強制 Pod 重新初始化連線,並載入新的叢集 CA 憑證。舉例來說,如要重新啟動 metrics-server 和 konnectivity-agent,請執行下列指令:
kubectl rollout restart deployment metrics-server -n kube-system
kubectl rollout restart deployment konnectivity-agent -n kube-system
重新建立節點
重新設定 API 伺服器,改用新的 IP 位址提供服務後,如果維護作業可用,GKE 會自動更新節點,改用新的 IP 位址和憑證。GKE 會將所有節點升級至節點已執行的相同 GKE 版本,這會重新建立節點。詳情請參閱「節點集區升級」。
根據預設,GKE 會在您啟動作業後七天,自動完成憑證輪換。如果叢集中的有效維護期間或排除項目,導致 GKE 無法在這七天內重建部分節點,憑證輪換作業一開始會無法完成。不過,GKE 會持續嘗試重新建立節點,並完成輪替作業,直到維護可用性允許 GKE 繼續作業為止。在 Google Cloud Next 等重大活動期間,GKE 也可能會暫停自動重建節點,避免發生中斷情形。
如果您使用維護排除項目或維護期間,可能會導致輪替失敗,請執行下列任一步驟,強制 GKE 重新建立節點:
在 Autopilot 叢集中,手動升級控制層:
gcloud container clusters upgrade CLUSTER_NAME \ --location=LOCATION \ --master \ --cluster-version=VERSION將
VERSION替換為叢集目前使用的 GKE 版本。在 Standard 叢集中,手動升級每個節點集區。
詳情請參閱「手動變更,但須遵守 GKE 維護政策」。
查看節點集區重新建立進度
如要監控輪替作業,請執行下列指令:
gcloud container operations list \ --filter="operationType=UPGRADE_NODES AND status=RUNNING" \ --format="value(name)"這個指令會傳回節點升級作業的作業 ID。
如要對作業進行輪詢,請將作業 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 重新建立靜態憑證。
如要找出叢集中現有的靜態 ServiceAccount 憑證,請執行下列指令:
kubectl get secrets --all-namespaces --field-selector type=kubernetes.io/service-account-token
如果這項指令的輸出內容為 No resources found,表示叢集沒有靜態 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 會嘗試完成輪替作業,直到憑證到期為止,之後叢集就無法復原。您可以按照「憑證授權機構 (CA) 過期後復原叢集」一節中的步驟,嘗試復原叢集。
在 CA 到期後復原叢集
叢集 CA 過期後,叢集可能無法復原。 如果您在 CA 到期日後嘗試啟動憑證輪換,GKE 可能無法建立新的節點集區。記錄中會顯示以下訊息:
x509: certificate has expired or is not yet valid
您可以嘗試從這個狀態手動復原叢集。不過,由於 CA 過期的叢集通常無法復原,因此這項作業可能會失敗,您可能必須建立新的叢集。如要嘗試復原叢集,請按照下列步驟操作:
- 開始憑證輪換。如果憑證輪替作業已在進行中,請略過這個步驟。
- 完成輪替。GKE 控制層會停止使用先前的 CA,改為只使用新的 CA。
建立新的節點集區,取代現有的節點集區。
如果節點集區建立失敗並顯示
IP_SPACE_EXHAUSTED_WITH_DETAILS錯誤訊息,請先刪除現有節點集區,再建立新的節點集區。刪除節點集區後,IP 位址就會釋出,可供新的節點集區使用。將工作負載遷移至新的節點集區。
更新 Kubernetes API 用戶端,使用新的憑證和新的控制層 IP 位址。
更新靜態 Kubernetes ServiceAccount 憑證,使用由新 CA 簽署的權杖。
如果完成上述步驟後,叢集仍無法復原,請建立新叢集。
後續步驟
- 進一步瞭解 Kubernetes Secret 物件。
- 瞭解如何輪替控制層 IP。
- 瞭解 GKE RBAC 的最佳做法。
- 進一步瞭解如何排解 GKE 問題。