使用 Google 代管的安全資料傳輸層 (SSL) 憑證

本頁面說明如何在 GKE 上使用 Google 代管的 SSL 憑證,確保 Ingress 安全無虞。您將瞭解如何使用 Google 的自動化憑證管理服務,簡化應用程式的 HTTPS 加密程序。

這些憑證均為網域驗證 (DV) 憑證,且 Google 會針對您的網域名稱佈建、更新及管理這些憑證。這類憑證無法證明您的個人或機構身分。

本頁內容適用於規劃及實作網路安全防護機制,以及開發和維護安全政策的網路和安全專家。如要進一步瞭解我們在Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

閱讀本頁內容前,請先確認您已具備 GKE 實務知識,並充分瞭解網路網路安全

如要瞭解如何使用 Google Cloud建立 Google 代管憑證,請參閱「Google 代管憑證」。

建立具有 Google 代管憑證的 Ingress

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

  • 在與 Ingress 相同的命名空間中建立 ManagedCertificate 物件。
  • networking.gke.io/managed-certificates 註解新增至 Ingress,以便讓 ManagedCertificate 物件與 Ingress 建立關聯。這個註解是以半形逗號分隔的 ManagedCertificate 物件清單。

限制

與您取得且自行管理的憑證相較,Google 代管憑證較不具彈性。Google 代管憑證最多支援 100 個非萬用字元網域。與自行管理的憑證不同,Google 代管憑證不支援萬用字元網域。

如果您必須使用自行管理憑證,或已具備要在 Ingress 上設定的 SSL 憑證,請參閱「在用戶端和負載平衡器之間設定 HTTPS (TLS)」。

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

系統不支援更新 Google 代管憑證。詳情請參閱「手動更新 Google 代管的憑證」。

如果憑證是直接向憑證授權單位撤銷,Google 不會自動輪替憑證。您必須刪除 ManagedCertificate,然後建立新的憑證。

必要條件

  • 您必須擁有網域名稱,網域名稱的長度不得超過 63 個字元。您可以向任何網域名稱註冊商購買網域名稱。

  • 如果您使用 GKE Standard 叢集,則必須啟用 HttpLoadBalancing 外掛程式。

  • Ingress 資訊清單必須包含 kubernetes.io/ingress.class: "gce" 註解。系統不支援「ingressClassName」欄位。

  • 您必須在相同專案和命名空間中套用 IngressManagedCertificate 資源。

  • 建立保留 (靜態) 外部 IP 位址。即使您刪除 Ingress,保留靜態 IP 位址可確保您持續擁有該位址。如果您沒有保留 IP 位址,位址可能會有所異動,導致您必須重新設定網域的 DNS 記錄。使用 Google Cloud CLI 或 Google Cloud 控制台建立保留 IP 位址。

    gcloud

    如要建立保留的 IP 位址,請執行下列指令:

    gcloud compute addresses create ADDRESS_NAME --global
    

    ADDRESS_NAME 替換為您要建立的預留 IP 位址名稱。

    如要找出您建立的靜態 IP 位址,請執行下列指令:

    gcloud compute addresses describe ADDRESS_NAME --global
    

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

    address: 203.0.113.32
    ...
    

    控制台

    如要建立保留 IP 位址,請執行下列步驟:

    1. 前往 Google Cloud 控制台的「External IP addresses」(外部 IP 位址) 頁面。

      前往「External IP Addresses」(外部 IP 位址)

    2. 為 IP 位址指定名稱 (例如 example-ip-address)。

    3. 指定要使用 IPv4IPv6 位址。

    4. 在「Type」(類型) 欄位選取「Global」(全域) 選項

    5. 按一下「預留」。 IP 位址會列在「External Address」(外部位址) 欄位中。

    設定連接器

    附註:此步驟需要使用設定連接器。請按照安裝操作說明在叢集上安裝設定連接器。

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    kind: ComputeAddress
    metadata:
      name: example-ip-address
    spec:
      location: global
    如要部署此資訊清單,請以 compute-address.yaml 格式將其下載至您的電腦,並執行下列指令:

    kubectl apply -f compute-address.yaml
    

設定 Google 代管憑證

  1. 建立 ManagedCertificate 物件。該資源可以指定 SSL 憑證的網域。系統不支援萬用字元網域。

    下列資訊清單說明 ManagedCertificate 物件。將資訊清單儲存為 managed-cert.yaml

    apiVersion: networking.gke.io/v1
    kind: ManagedCertificate
    metadata:
      name: managed-cert
    spec:
      domains:
        - FQDN_1
        - FQDN_2
    

    更改下列內容:

    • FQDN_1FQDN_2: 您擁有的完整網域名稱。例如 example.comwww.example.com
  2. 將資訊清單套用至叢集:

    kubectl apply -f managed-cert.yaml
    
  3. 建立 NodePort 類型的 Service,將應用程式公開發布到網際網路。

    下列資訊清單說明 NodePort 類型的 Service。將資訊清單儲存為 mc-service.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: mc-service
    spec:
      selector:
        app: mc-service
      type: NodePort
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    
  4. 將資訊清單套用至叢集:

    kubectl apply -f mc-service.yaml
    
    ManagedCertificate
  5. 建立 Ingress。

    下列資訊清單說明使用您建立的 ManagedCertificate 的 Ingress。將資訊清單儲存為 managed-cert-ingress.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: managed-cert-ingress
      annotations:
        kubernetes.io/ingress.global-static-ip-name: ADDRESS_NAME
        networking.gke.io/managed-certificates: managed-cert
        kubernetes.io/ingress.class: "gce"
    spec:
      defaultBackend:
        service:
          name: mc-service
          port:
            number: SERVICE_PORT
    

    更改下列內容:

    • ADDRESS_NAME:預留 IP 位址的名稱。
    • SERVICE_PORT:服務資訊清單中的 ports.port 值。
  6. 將資訊清單套用至叢集:

    kubectl apply -f managed-cert-ingress.yaml
    
  7. 取得負載平衡器的 IP 位址:

    kubectl get ingress
    

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

    NAME                 HOSTS       ADDRESS         PORTS     AGE
    managed-cert-ingress   *         203.0.113.32     80       54s
    

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

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

  8. 將網域的 DNS 記錄設定為指向負載平衡器的 IP 位址。如果您使用 Cloud DNS,請參閱「管理記錄」一文瞭解詳情。

  9. 等待 Google 代管憑證完成佈建。這項作業最多可能需要 60 分鐘。您可以使用下列指令檢查憑證狀態:

    kubectl describe managedcertificate managed-cert
    

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

    Name:         managed-cert
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         ManagedCertificate
    (...)
    Spec:
     Domains:
       FQDN_1
       FQDN_2
    Status:
     CertificateStatus: Active
    (...)
    

    Status.CertificateStatus 欄位的值表示已佈建憑證。如果 Status.CertificateStatus 不是 Active,表示憑證尚未佈建。

  10. 您可以使用下列指令檢查 Ingress 上的事件:

    kubectl describe ingress INGRESS_NAME
    

    INGRESS_NAME 換成 Ingress 的名稱。

  11. 使用 https:// 前置字串造訪您的網域,驗證 SSL 是否運作正常。此時瀏覽器會顯示連線是否安全,並供您查看憑證的詳細資料。

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

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

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

  1. 如「設定 Google 代管憑證」一節所述,將新的 Google 代管憑證新增至 Ingress。
  2. 等待 Google 代管憑證資源狀態顯示為「Active」(啟用)。使用下列指令檢查憑證狀態:

    kubectl describe managedcertificate managed-cert
    
  3. 狀態顯示為 Active 時,請更新 Ingress,以移除對自行管理憑證的參照。

移除 Google 代管憑證

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

  1. 刪除 ManagedCertificate 物件:

    kubectl delete -f managed-cert.yaml
    

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

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

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

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

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

    您可以使用 Google Cloud CLI、 Google Cloud 控制台或 Config Connector,釋出保留的 IP 位址。

    gcloud

    使用下列指令釋出保留的 IP 位址:

    gcloud compute addresses delete ADDRESS_NAME --global
    

    ADDRESS_NAME 替換為 IP 位址名稱。

    控制台

    如要釋出保留的 IP 位址,請按照下列步驟操作:

    1. 前往 Google Cloud 控制台的「External IP addresses」(外部 IP 位址) 頁面。

      前往「External IP Addresses」(外部 IP 位址)

    2. 找出要釋放的 IP 位址,然後選取旁邊的核取方塊。

    3. 按一下 [Release IP address] (釋出 IP 位址)

    設定連接器

    附註:此步驟需要使用設定連接器。請按照安裝操作說明在叢集上安裝設定連接器。

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    kind: ComputeAddress
    metadata:
      name: example-ip-address
    spec:
      location: global

    如要部署此資訊清單,請以 compute-address.yaml 格式將其下載至您的電腦,並執行下列指令:

    kubectl delete -f compute-address.yaml
    

後續步驟