排解憑證授權單位套件無效的 CRD 問題


自訂資源定義 (CRD) 是擴充 Kubernetes 功能的強大工具。不過,如果 CRD 的轉換 Webhook 設定spec.conversion.webhook.clientConfig.caBundle含有無效或格式錯誤的憑證授權單位 (CA) 組合,可能會中斷叢集作業。這可能會在資源建立、更新或刪除期間顯示為錯誤。Google Kubernetes Engine (GKE) 會監控叢集,並使用 Recommender 服務提供指引,說明如何最佳化平台使用情形。

為確保叢集保持穩定且效能良好,請參閱 GKE 針對運作中但 CA 組合無效的 CRD 提供的建議。請按照這份指南檢查可能設定錯誤的 CRD,並視需要更新。如要進一步瞭解如何管理 Recommenders 的深入分析和建議,請參閱「運用深入分析和建議,最佳化 GKE 用量」。

找出受影響的叢集

如要取得洞察資料,找出受無效 CA 組合影響的 CRD 叢集,請按照操作說明查看子類型 K8S_CRD_WITH_INVALID_CA_BUNDLE 的洞察資料和建議。您可以透過下列方式取得洞察資料:

  • 使用 Google Cloud 控制台。
  • 使用 Google Cloud CLI 或 Recommender API,並以子類型 K8S_CRD_WITH_INVALID_CA_BUNDLE 進行篩選。

使用洞察資料找出 CRD 後,請按照說明排解設定錯誤的 CA 組合

GKE 偵測到設定錯誤的 CRD 時

如果 GKE 叢集有一個或多個 CRD 回報 spec.conversion.webhook.clientConfig 中 Webhook 用戶端設定的 caBundle 設定錯誤,GKE 會產生 K8S_CRD_WITH_INVALID_CA_BUNDLE 子類型的洞察和建議。

按照操作說明檢查 CA 組合設定錯誤的 CRD

排解偵測到的 CRD 問題

以下各節提供操作說明,協助您排解 GKE 偵測到的潛在設定錯誤 CRD。

按照指示操作並正確設定 CRD 後,建議會在 24 小時內解決,且不會再顯示於控制台中。如果導入建議的指引不到 24 小時,您可以將建議標示為已解決。 如果不想採用建議,可以關閉

找出叢集中受影響的 CRD

  1. 查看子類型 K8S_CRD_WITH_INVALID_CA_BUNDLE 的洞察資料和建議,一次選擇一項洞察資料進行疑難排解。如果叢集有損毀的 CRD,GKE 會為每個叢集產生一項洞察。

  2. 執行下列指令來說明 Service,找出可能含有問題 CA 組合的 CRD:

    kubectl get crd -o custom-columns=NAME:.metadata.name,CABUNDLE:.spec.conversion.webhook.clientConfig.caBundle
    

    輸出內容包含下列項目:

    • 名稱:CRD 的名稱。
    • CaBundle:與 CRD 轉換 Webhook 相關聯的 CA 組合 (如有)。檢查輸出內容。如果您知道某個 CRD 使用轉換 Webhook,但 caBundle 欄位為空白,這表示 caBundle 可能有問題。

重新建立 CRD

如要解決這項錯誤,請使用有效的 CA 組合重新建立受影響的 CRD:

  1. 備份與這個有問題的 CRD 相關聯的現有自訂資源 (如有)。執行下列指令,匯出現有資源:

      kubectl get <crd-name> -o yaml > backup.yaml
    
  2. 刪除現有 CRD:

      kubectl delete crd <crd-name>
    
  3. 請檢查 CRD 的 caBundle 欄位,確認是否含有格式正確的 Base64 編碼 PEM 憑證。您可以直接編輯 CRD,或與編寫者聯絡。

  4. 修改 CRD YAML 定義,使用有效的 CA 組合資料更新 spec.conversion.webhook.clientConfig.caBundle 欄位。結果應如下所示:

        spec:
          conversion:
            webhook:
              clientConfig:
                caBundle: <base64-encoded-ca-bundle>
    
  5. 套用修正後的 CRD:

        kubectl apply -f <corrected-crd-file.yaml>
    
  6. 還原自訂資源:

        kubectl apply -f backup.yaml
    

後續步驟