使用 Google 代管 SSL 憑證

總覽

您可以在 Google Kubernetes Engine 中使用 Ingress 建立具有自動設定 SSL 憑證的 HTTPS 負載平衡器。系統會針對您的網域名稱佈建、更新及管理 Google 代管的 SSL 憑證。請在此進一步瞭解 Google 代管的 SSL 憑證。

建立具有代管憑證的 Ingress

如要設定代管 SSL 憑證並將其與 Ingress 建立關聯,您需要:

  • 建立 ManagedCertificate 物件。
  • 將註解 networking.gke.io/managed-certificates 新增至 Ingress,以便讓 ManagedCertificate 物件與 Ingress 建立關聯。該註解為以半形逗號分隔的 ManagedCertificate 資源清單,例如 cert1,cert2,cert3

ManagedCertificate 資源必須與 Ingress 建立在相同的命名空間。

限制

與您取得且自行管理的憑證相較,Google 代管憑證較不具彈性。代管憑證僅支援單一、非萬用字元網域;而自行管理憑證則支援萬用字元和多個主體別名 (SAN)

如果您必須使用自行管理憑證,或已具備要在 Ingress 上設定的 SSL 憑證,請參閱 Ingress 說明文件。

Ingress 支援的憑證數量和類型是由 GCP 代管的 SSL 憑證限制所定義。

先決條件

  • 您必須擁有網域名稱,網域名稱的長度不得超過 63 個字元。您可以使用 Google Domains 或其他註冊商。
  • 建立保留 (靜態) 外部 IP 位址。即使您刪除 Ingress,保留靜態 IP 位址可確保您持續擁有該位址。如果您沒有保留位址,位址可能會有所異動,導致您必須重新設定網域的 DNS 記錄。請使用 gcloud 指令列工具或 GCP 主控台建立名稱為 example-ip-address 的保留 IP 位址:

    gcloud

    gcloud compute addresses create example-ip-address --global
    

    如要找出您所建立的靜態 IP 位址:

    $ gcloud compute addresses describe example-ip-address --global
    address: 203.0.113.32
    ...
    

    主控台

    1. 前往 GCP 主控台的保留靜態位址頁面。

      前往「Reserve a static address」(保留靜態位址) 頁面

    2. 為此 IP 位址 example-ip-address 指定名稱。
    3. 指定為 IPv4IPv6 位址。以下範例使用 IPv4 位址。
    4. 針對位址類型選取 [Global] (全域)。
    5. 按一下 [Reserve] (預約) 來保留 IP。
    6. IP 位址會列在「External Address」(外部位址) 欄位中。

設定代管憑證

  1. 建立 ManagedCertificate 資源。該資源可以指定要為其建立 SSL 憑證的網域。系統不支援萬用字元網域。spec.domains 清單只能包含一個網域。

    將下列範例 ManagedCertificate 資訊清單儲存為檔案,並命名為 example-certificate.yaml。將 example.com 替換為您的網域名稱:

    apiVersion: networking.gke.io/v1beta1
    kind: ManagedCertificate
    metadata:
      name: example-certificate
    spec:
      domains:
        - example.com
    

    使用 kubectl 建立資源:

    kubectl apply -f example-certificate.yaml
    
  2. 建立 NodePort Service,將應用程式公開發布到網際網路。以下為 Service 資訊清單檔案 example-service.yaml 的範例。

    apiVersion: v1
    kind: Service
    metadata:
      name: example-nodeport-service
    spec:
      type: NodePort
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    

    此範例規格並未選擇任何 Pod 加入 Service,因為只是要說明如何設定代管憑證,這樣已經能達到目的。但是在實際使用時,Service 規格應包含選取器。

    如要進一步瞭解如何設定 Service,請參閱 NodePort 說明文件

    使用 kubectl 建立 Service:

    kubectl apply -f example-service.yaml
    
  3. 建立 Ingress,然後將其連結到先前建立的 ManagedCertificate。

    • networking.gke.io/managed-certificates 註解設定為您的憑證名稱。
    • 針對 spec.backend.serviceName 欄位,使用在先前步驟中所建立服務的名稱。
    • spec.backend.servicePort 欄位設定為在 Service 資訊清單中指定的通訊埠。
    • kubernetes.io/ingress.global-static-ip-name 註解設定為保留 IP 位址的名稱。

    以下為 Ingress 資訊清單 example-ingress.yaml 的範例:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: example-ingress
      annotations:
        kubernetes.io/ingress.global-static-ip-name: example-ip-address
        networking.gke.io/managed-certificates: example-certificate
    spec:
      backend:
        serviceName: example-nodeport-service
        servicePort: 80
    

    使用 kubectl 建立 Ingress:

    kubectl apply -f example-ingress.yaml
    
  4. 查詢在先前步驟中建立的負載平衡器 IP 位址。請使用以下指令來取得負載平衡器 IP 位址:

    $ kubectl get ingress
    NAME              HOSTS     ADDRESS         PORTS     AGE
    example-ingress   *         203.0.113.32     80        54s
    

    負載平衡器 IP 位址會列在 ADDRESS 欄位中,本範例為 203.0.113.32。如果您正在使用保留靜態 IP 位址,則該位址會做為負載平衡器位址。

    如果系統未列出位址,請等候 Ingress 完成設定。

  5. 將網域的 DNS 記錄設定為指向負載平衡器的 IP 位址。如果您使用 Cloud DNS,則可以參閱管理記錄指南,瞭解更多詳情。

  6. 請等待代管憑證完成佈建,這最多可能需要 15 分鐘。您可以透過下列指令來檢查憑證狀態:

    kubectl describe managedcertificate
    

    憑證佈建完成後,Status.CertificateStatus 欄位的值會變成 Active。以下範例顯示範例憑證佈建完成後,kubectl describe 的輸出資料:

    Name:         example-certificate
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1beta1
    Kind:         ManagedCertificate
    (...)
    Spec:
      Domains:
        example.com
    Status:
      CertificateStatus: Active
    (...)
    
  7. 使用 https:// 前置字串造訪您的網域,驗證 SSL 是否運作正常。此時瀏覽器會顯示連線是否安全,並供您查看憑證的詳細資料。

從自行管理憑證遷移至 Google 代管憑證

如果您要將 Ingress 從使用自行管理 SSL 憑證遷移至使用 Google 代管 SSL 憑證,在 Google 代管 SSL 憑證啟用前,請勿刪除任何自行管理 SSL 憑證。Google 代管 SSL 憑證佈建完畢後,便會自動啟用。Google 代管 SSL 憑證啟用後,您就可以刪除自行管理 SSL 憑證。

請按照以下操作說明,從自行管理 SSL 憑證遷移至 Google 代管 SSL 憑證。

  1. 設定代管憑證一節所述,將新代管憑證新增至 Ingress。
  2. 等待 Google 代管憑證資源狀態顯示為「Active」(啟用)。檢查含有 kubectl describe managedcertificate 憑證的狀態。
  3. 狀態顯示為「Active」(啟用) 時,請更新 Ingress,以移除對自行管理憑證的參照。

移除代管憑證

如要移除叢集中的代管憑證,您必須刪除 ManagedCertificate 資源,並移除參照該資源的 Ingress 註解。

  1. 刪除含有 kubectl 的 ManagedCertificate 資源:

    kubectl delete -f example-certificate.yaml
    

    系統會顯示以下輸出資料:

    managedcertificate.networking.gke.io "example-certificate" deleted
    
  2. 移除 Ingress 中的註解:

    kubectl annotate ingress example-ingress networking.gke.io/managed-certificates-
    

    注意指令結尾的減號「-」。

  3. 釋出您為負載平衡器保留的靜態 IP 位址:

gcloud

使用 gcloud 指令列工具:

gcloud compute addresses delete [ADDRESS_NAME] --global

其中 [ADDRESS_NAME] 是 IP 位址的名稱。

主控台

  1. 前往 GCP 主控台的外部 IP 位址頁面。

    前往外部 IP 位址頁面

  2. 找出您要釋出的 IP 位址,接著勾選旁邊的方塊。
  3. 點選 [Release IP address] (釋出 IP 位址)

疑難排解

系統會在建立 ManagedCertificate 資源之前,驗證 ManagedCertificate 定義。如果驗證失敗,系統就不會建立 ManagedCertificate 資源,並顯示錯誤訊息。以下說明失敗的各種原因:

spec.domains in body should have at most 1 items

ManagedCertificate 資訊清單在 spec.domains 欄位列出超過一個網域。代管憑證僅支援一個網域。

spec.domains in body should match '^(([a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9])\.)+[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]\.?$'

您在 spec.domains 欄位中指定了無效或含有萬用字元的網域名稱。代管憑證不支援使用萬用字元網域,例如 *.example.com

spec.domains in body should be at most 63 chars long

您指定的網域名稱長度太長。代管憑證支援的網域名稱,長度上限為 63 個字元。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件