升級至 GKE 1.29 前,請確認 TLS 憑證的相容性


如果 GKE 叢集執行 1.29 版或更新版本,則不支援以 SHA-1 演算法簽署的傳輸層安全標準 (TLS) 憑證。為避免叢集受到影響,請先將Webhook擴充功能 API 伺服器後端的不相容憑證,替換為使用相容簽署演算法的憑證,再將叢集升級至 1.29 版。

移除這項功能對叢集的影響

如果叢集使用的憑證與 1.29 版不相容,GKE 會暫停自動升級。以相容簽署演算法替換憑證,或 1.28 版支援終止後,GKE 會恢復自動升級。

如果未在升級至 1.29 版前更換不相容的憑證,叢集可能會發生下列問題:

  • 如果 GKE Webhook 後端使用以 SHA-1 演算法簽署的 TLS 憑證,就會因驗證失敗而停止運作。如果 Kubernetes 控制層與 Webhook 通訊時使用不相容的憑證,Webhook 呼叫就會失敗。視設定而定,特別是使用准入 Webhook 時,如果無法與 Webhook 聯絡,可能會導致叢集無法建立資源 (例如 Pod),造成嚴重中斷。
  • 對擴充功能 API 伺服器提供的 API 進行的呼叫會失敗。

Kubernetes 為何要移除這項功能

GKE 採用開放原始碼 Kubernetes,並使用 kube-apiserver 元件,透過 TLS 與 Webhook 和擴充功能 API 伺服器後端通訊。kube-apiserver 元件是以 Go 程式設計語言編寫。

從 Go 1.18 版開始,Go 會拒絕以 SHA-1 演算法簽署的 TLS 憑證,但保留了偵錯切換開關 x509sha1=1,可啟用舊版行為,簡化遷移程序。GKE 1.24 版是第一個使用 Go 1.18 版建構的版本。在 1.29 版之前,Kubernetes 的 GKE 建構版本已啟用這個偵錯切換開關。Go 1.24 版將移除這項切換功能。GKE 1.29 建構 Kubernetes 時會停用切換功能,為日後移除 Go 的 debug 切換功能做準備。GKE 將叢集升級至 1.29 版後,如果叢集控制層呼叫叢集中的 Webhook 或擴充功能 API 伺服器,而這些伺服器提供的 TLS 憑證是以 SHA-1 演算法簽署,呼叫就會失敗。

找出受影響的叢集

GKE 會監控叢集,並使用 Recommender 服務透過洞察和建議提供指引,找出使用以 SHA-1 演算法簽署的 TLS 憑證的 Webhook 或擴充功能 API 伺服器後端。或者,您也可以使用記錄,找出叢集中對受影響後端的呼叫。

如何取得洞察資料和建議

如要查看執行 1.24 以上版本的叢集洞察資料和建議,請按照操作說明進行。您可以使用 gcloud CLI 或 Recommender API 取得深入分析結果,並以子類型 DEPRECATION_K8S_SHA_1_CERTIFICATE 進行篩選。

如何取得記錄

如果叢集執行 1.24 以上版本,且已啟用 Cloud Logging,GKE 會提供 Cloud 稽核記錄記錄,協助您找出叢集對受影響後端的呼叫。您可以使用下列篩選器搜尋記錄:

logName =~ "projects/.*/logs/cloudaudit.googleapis.com%2Factivity"
resource.type = "k8s_cluster"
operation.producer = "k8s.io"
"insecure-sha1.invalid-cert.kubernetes.io"

稽核記錄會列出受影響後端的伺服器名稱。如要進一步瞭解如何解讀結果,請參閱下一節。

解讀洞察資料和最佳化建議提供的指引

建議包括受影響後端的主機名稱,以及是否為 Webhook 或擴充功能 API 伺服器。參照叢集中服務的主機名稱格式為 <service-name>.<namespace>.svc

如果受影響的後端憑證來自 Webhook 伺服器,主機名稱可以是叢集中的服務,也可以是網址。詳情請參閱「聯絡 Webhook」。

如果受影響的憑證來自擴充功能 API 伺服器,主機名稱就是叢集中的 Service。詳情請參閱「與擴充功能 apiserver 聯絡」。

找出受影響的後端後,請按照指示檢查服務的憑證檢查網址後端的憑證 (視類型而定)。

如果叢集在過去 30 天內未呼叫使用受影響憑證的伺服器,系統就不會顯示任何建議。

建議範例

以下是建議的範例清單:

RECOMMENDATION_ID                     PRIMARY_IMPACT_CATEGORY  RECOMMENDATION_STATE  LAST_REFRESH_TIME               PRIORITY  RECOMMENDER_SUBTYPE                DESCRIPTION
26bfcb32-6f2a-407c-874f-8cf55b3af912  RELIABILITY              ACTIVE                2024-02-15T01:09:04.454456273Z  P2        DEPRECATION_K8S_SHA_1_CERTIFICATE  Update the webhook and/or extension API servers that use certificates signed with SHA-1 algorithm to use certificates with compatible signing algorithms prior to upgrading the cluster to version 1.29. [Learn more](https://cloud.google.com/kubernetes-engine/docs/deprecations/sha1-1-29#mitigate_the_risk_of_upgrading_to_129).

如要取得叢集和服務的詳細資料,請說明建議。在 default 命名空間中,名為 example-webhook 的 Service 輸出內容類似於下列內容:

associatedInsights:
- insight: projects/<CLUSTER_PROJECT_NUMBER>/locations/<CLUSTER_LOCATION>/insightTypes/google.container.DiagnosisInsight/insights/d76887a8-9eed-41a0-9459-d49dee43455e
content:
  overview:
    featureDeprecationRecommendation:
    - featureName: x.509_certificate_signature_algorithm
      featureReplacementValue: algorithm [compatible with GKE v1.29](https://cloud.google.com/kubernetes-engine/docs/deprecations/sha1-1-29#compatible-signing-algorithms)
      featureValue: SHA1
      stopServingVersion: '1.29'
      targetType: hostname
      targetValue: example-webhook.default.svc
    targetClusters:
    - clusterId: 3be916a554724c79a2314c8baee3fd57cf1c39df1ad34c3daf291db701b6d541
      clusterUri: //container.googleapis.com/projects/<CLUSTER_PROJECT_NUMBER>/locations/<CLUSTER_LOCATION>/clusters/<CLUSTER_NAME>
description: Update the webhook and/or extension API servers that use certificates
  signed with SHA-1 algorithm to use certificates with compatible signing algorithms
  prior to upgrading the cluster to version 1.29. [Learn more](https://cloud.google.com/kubernetes-engine/docs/deprecations/sha1-1-29#mitigate_the_risk_of_upgrading_to_129).
etag: '"ad50aac8278951d5"'
lastRefreshTime: '2024-02-15T01:09:04.454456273Z'
name: projects/<CLUSTER_PROJECT_NUMBER>/locations/<CLUSTER_LOCATION>/recommenders/google.container.DiagnosisRecommender/recommendations/26bfcb32-6f2a-407c-874f-8cf55b3af912
primaryImpact:
  category: RELIABILITY
  reliabilityProjection:
    risks:
    - SERVICE_DISRUPTION
priority: P2
recommenderSubtype: DEPRECATION_K8S_SHA_1_CERTIFICATE
stateInfo:
  state: ACTIVE
targetResources:
- //container.googleapis.com/projects/<CLUSTER_PROJECT_NUMBER>/locations/<CLUSTER_LOCATION>/clusters/<CLUSTER_NAME>

檢查服務的憑證

Webhook 和擴充功能 API 伺服器都可以由服務提供支援。

找出要檢查的相關後端服務後,請按照下列操作說明檢查每個服務的憑證,確認哪些憑證使用 SHA-1 演算法,需要更新。

  1. 找出服務的選取器和目標埠:

    kubectl describe service --namespace=NAMESPACE SERVICE_NAME
    

    NAMESPACESERVICE_NAME 替換為 targetValue 中的值。

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

    Name: example-service
    Namespace: default
    Labels: run=nginx
    Selector: run=nginx
    Type: ClusterIP
    IP: 172.21.xxx.xxx
    Port: 443
    TargetPort: 444
    

    這個輸出內容表示 example-service 具有選取器 run=nginx 和目標連接埠 444

  2. 找出符合選取器的 Pod:

    kubectl get pods --namespace=NAMESPACE --selector=run=nginx
    

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

    NAME          READY   STATUS    RESTARTS   AGE
    example-pod   1/1     Running   0          21m
    

    這項輸出內容表示相符的 Pod 為 example-pod

  3. kubectl localhost 設定通訊埠轉送至 Pod:

    kubectl port-forward --namespace=NAMESPACE pods/example-pod 8888:SERVICE_TARGET_PORT &
    

    SERVICE_TARGET_PORT 取代為服務中的 TargetPort 值。如未加入 TargetPort,請使用 Port 值。

  4. 使用 openssl 顯示服務使用的憑證:

    openssl s_client -connect localhost:8888 </dev/null | openssl x509 -noout -text
    

    以下範例輸出內容顯示以 SHA-256 演算法簽署的有效憑證:

    Certificate:
        Data:
            ...
            Signature Algorithm: sha256WithRSAEncryption
    ...
        Signature Algorithm: sha256WithRSAEncryption
    

    以下範例輸出內容顯示以 SHA-1 演算法簽署的無效憑證:

    Certificate:
        Data:
            ...
            Signature Algorithm: sha1WithRSAEncryption
    ...
        Signature Algorithm: sha1WithRSAEncryption
    

    如果憑證的輸出內容相似,請更新憑證,使用相容的簽署演算法。舉例來說,如果您使用 certificate.k8s.io API 管理叢集中的 TLS 憑證,可以按照操作說明建立憑證簽署要求

清除通訊埠轉送

如要清除在背景執行的通訊埠轉送,請找出並終止該程序。

  1. 執行下列指令,列出執行中的程序:

    jobs
    

    查看輸出內容,取得要終止的程序 ID:

    [1]+  Running                 kubectl port-forward pods/example-pod 8888:444 &
    

    這個範例輸出內容表示程序 ID 為 1

  2. 終止程序,並取代 PROCESS_ID

    kill %PROCESS_ID
    

    輸出內容如下:

    [1]+  Terminated              kubectl port-forward pods/example 8888:444
    

    此範例輸出內容顯示程序已終止。

檢查網址後端的憑證

如果 Webhook 使用 url 後端,請直接連線至網址中指定的主機名稱。舉例來說,如果網址是 https://example.com:123/foo/bar,請使用下列 openssl 指令,顯示後端使用的憑證:

openssl s_client -connect example.com:123 </dev/null | openssl x509 -noout -text

以下範例輸出內容顯示以 SHA-256 演算法簽署的有效憑證:

Certificate:
    Data:
        ...
        Signature Algorithm: sha256WithRSAEncryption
...
    Signature Algorithm: sha256WithRSAEncryption

以下範例輸出內容顯示以 SHA-1 演算法簽署的無效憑證:

Certificate:
    Data:
        ...
        Signature Algorithm: sha1WithRSAEncryption
...
    Signature Algorithm: sha1WithRSAEncryption

如果憑證的輸出內容相似,請更新憑證,使用相容的簽署演算法。舉例來說,如果您使用 certificate.k8s.io API 管理叢集中的 TLS 憑證,可以按照操作說明建立憑證簽署要求

降低升級至 1.29 版的風險

找出受影響的叢集和後端服務後,請先將服務的憑證從以 SHA-1 演算法簽署,更新為採用相容簽署演算法,再將叢集升級至 1.29 版。

GKE 會自動偵測受影響的叢集,並不會自動升級至 1.29 版,直到開始使用相容的憑證或 1.28 版終止支援為止。1.28 版終止支援後,叢集會自動升級至 1.29 版。

相容的簽署演算法

GKE 1.29 版與 Go x509 套件中支援的演算法相容。包括下列演算法:

  • SHA256WithRSA
  • SHA384WithRSA
  • SHA512WithRSA
  • ECDSAWithSHA256
  • ECDSAWithSHA384
  • ECDSAWithSHA512
  • SHA256WithRSAPSS
  • SHA384WithRSAPSS
  • SHA512WithRSAPSS
  • PureEd25519

如要查看可用的演算法,請參閱 x509.go 來源檔案,並搜尋 UnknownSignatureAlgorithm SignatureAlgorithm = iota。Go x509 套件支援的演算法會列在 const 區塊中,如要找出不受支援的不安全簽署演算法,請在檔案中搜尋 InsecureAlgorithmError 的用法。

資源

如要進一步瞭解這項異動,請參閱下列資源: