本頁面說明如何在 GKE 上使用 Google 代管的 SSL 憑證,確保 Ingress 安全無虞。您將瞭解如何使用 Google 的自動化憑證管理服務,簡化應用程式的 HTTPS 加密程序。
這些憑證均為網域驗證 (DV) 憑證,且 Google 會針對您的網域名稱佈建、更新及管理這些憑證。這類憑證無法證明您的個人或機構身分。
本頁內容適用於規劃及實作網路安全防護機制,以及開發和維護安全政策的網路和安全專家。如要進一步瞭解我們在Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。
閱讀本頁面之前,請先確認您已具備 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 個字元。您可以使用 Google Domains 或其他註冊商。
- 如果您使用 GKE Standard 叢集,則必須啟用
HttpLoadBalancing
外掛程式。 ingressClassName
必須為"gce"
。- 您必須在相同專案和命名空間中套用
Ingress
和ManagedCertificate
資源。 建立保留 (靜態) 外部 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 位址,請執行下列步驟:
前往 Google Cloud 控制台的「External IP addresses」(外部 IP 位址) 頁面。
為 IP 位址指定名稱 (例如
example-ip-address
)。指定要使用 IPv4 或 IPv6 位址。
在「類型」中選取「全域」選項。
按一下「預訂」。 IP 位址會列在「External Address」(外部位址) 欄位中。
設定連接器
附註:此步驟需要使用設定連接器。請按照安裝操作說明在叢集上安裝設定連接器。
如要部署此資訊清單,請以compute-address.yaml
格式將其下載至您的電腦,並執行下列指令:kubectl apply -f compute-address.yaml
設定 Google 代管憑證
建立
ManagedCertificate
物件。該資源可以指定 SSL 憑證的網域。系統不支援萬用字元網域。下列資訊清單說明
ManagedCertificate
物件。將資訊清單儲存為managed-cert.yaml
。apiVersion: networking.gke.io/v1 kind: ManagedCertificate metadata: name: managed-cert spec: domains: - FQDN_1 - FQDN_2
更改下列內容:
FQDN_1
、FQDN_2
: 您擁有的完整網域名稱。例如example.com
和www.example.com
。
將資訊清單套用至叢集:
kubectl apply -f managed-cert.yaml
建立
NodePort
類型的服務,將應用程式公開發布到網際網路。下列資訊清單說明
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
將資訊清單套用至叢集:
kubectl apply -f mc-service.yaml
建立 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" # Updated annotation spec: defaultBackend: service: name: mc-service port: number: SERVICE_PORT
更改下列內容:
ADDRESS_NAME
:保留 IP 位址的名稱。SERVICE_PORT
:服務資訊清單中的ports.port
值。
將資訊清單套用至叢集:
kubectl apply -f managed-cert-ingress.yaml
取得負載平衡器的 IP 位址:
kubectl get ingress
輸出結果會與下列內容相似:
NAME HOSTS ADDRESS PORTS AGE managed-cert-ingress * 203.0.113.32 80 54s
負載平衡器 IP 位址會列在
ADDRESS
欄位中。如果您正在使用保留靜態 IP 位址,則該位址會做為負載平衡器位址。如果系統未列出位址,請等候 Ingress 完成設定。
將網域的 DNS 記錄設定為指向負載平衡器的 IP 位址。如果您使用 Cloud DNS,請參閱「管理記錄」一文瞭解詳情。
等待 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
,表示憑證尚未佈建。您可以使用下列指令檢查 Ingress 上的事件:
kubectl describe ingress INGRESS_NAME
將
INGRESS_NAME
替換為 Ingress 的名稱。使用
https://
前置字串造訪您的網域,驗證 SSL 是否運作正常。此時瀏覽器會顯示連線是否安全,並供您查看憑證的詳細資料。
從自行管理憑證遷移至 Google 代管憑證
如果您要將 Ingress 從使用自行管理 SSL 憑證遷移至使用 Google 代管 SSL 憑證,在 Google 代管 SSL 憑證啟用前,請勿刪除任何自行管理 SSL 憑證。Google 代管 SSL 憑證佈建完畢後,便會自動啟用。Google 代管 SSL 憑證啟用後,您就可以刪除自行管理 SSL 憑證。
請按照以下操作說明,從自行管理 SSL 憑證遷移至 Google 代管 SSL 憑證。
- 如「設定 Google 代管憑證」一節所述,將新的 Google 代管憑證新增至 Ingress。
等待 Google 代管憑證資源狀態顯示為「Active」(啟用)。請使用下列指令檢查憑證狀態:
kubectl describe managedcertificate managed-cert
狀態顯示為
Active
時,請更新 Ingress,以移除對自行管理憑證的參照。
移除 Google 代管的憑證
如要移除叢集中的 Google 代管憑證,您必須刪除 ManagedCertificate
物件,並移除參照該物件的 Ingress 註解。
刪除
ManagedCertificate
物件:kubectl delete -f managed-cert.yaml
輸出結果會與下列內容相似:
managedcertificate.networking.gke.io "managed-cert" deleted
移除 Ingress 中的註解:
kubectl annotate ingress managed-cert-ingress networking.gke.io/managed-certificates-
注意指令結尾的減號「
-
」。釋出您為負載平衡器保留的靜態 IP 位址。
您可以使用 Google Cloud CLI、 Google Cloud 控制台或 Config Connector,釋出保留的 IP 位址。
gcloud
使用下列指令釋出保留的 IP 位址:
gcloud compute addresses delete ADDRESS_NAME --global
將
ADDRESS_NAME
替換為 IP 位址名稱。主控台
如要釋出保留的 IP 位址,請按照下列步驟操作:
前往 Google Cloud 控制台的「External IP addresses」(外部 IP 位址) 頁面。
找出要釋放的 IP 位址,然後勾選旁邊的核取方塊。
按一下 [Release IP address] (釋出 IP 位址)。
設定連接器
附註:此步驟需要使用設定連接器。請按照安裝操作說明在叢集上安裝設定連接器。
如要部署此資訊清單,請以
compute-address.yaml
格式將其下載至您的電腦,並執行下列指令:kubectl delete -f compute-address.yaml
疑難排解
本節提供相關資訊,說明如何解決 Google 管理的憑證問題。
檢查 ManagedCertificate
和 Ingress 資源的事件
如果憑證數量超出上限,系統會在 ManagedCertificate
中新增含有 TooManyCertificates
原因的事件。您可以使用下列指令,檢查 ManagedCertificate
物件的事件:
kubectl describe managedcertificate CERTIFICATE_NAME
將 CERTIFICATE_NAME
替換成您的 ManagedCertificate
名稱。
如果將不存在的 ManagedCertificate
附加至 Ingress,系統會在 Ingress 中新增 MissingCertificate
原因的事件。您可以使用下列指令,檢查 Ingress 上的事件:
kubectl describe ingress INGRESS_NAME
將 INGRESS_NAME
替換為 Ingress 的名稱。
網域解析為多個負載平衡器的 IP 位址時,系統不會佈建代管憑證
如果網域會解析為多個負載平衡器的 IP 位址 (多個 Ingress 物件),您應建立單一 ManagedCertificate
物件,並將其附加至所有 Ingress 物件。如果改為建立許多 ManagedCertificate
物件,並將每個物件附加至個別的 Ingress,憑證授權單位可能無法驗證網域擁有權,部分憑證也可能無法佈建。如要順利完成驗證,憑證必須在網域解析的所有 IP 位址下都可見。
具體來說,當網域解析為 IPv4 和 IPv6 位址,且這些位址是使用不同的 Ingress 物件設定時,您應建立單一 ManagedCertificate
物件,並將其附加至兩個 Ingress。
Google 代管憑證與 Ingress 之間的通訊中斷
代管憑證會使用 ingress.gcp.kubernetes.io/pre-shared-cert
註解與 Ingress 通訊。舉例來說,如果發生下列情況,您可能會中斷這類通訊:
- 執行自動化程序,清除註解
ingress.gcp.kubernetes.io/pre-shared-cert
。 - 儲存 Ingress 的快照,然後從快照刪除及還原 Ingress。在此期間,
SslCertificate
註解中列出的ingress.gcp.kubernetes.io/pre-shared-cert
資源可能已遭刪除。如果缺少任何附加的憑證,Ingress 就無法運作。
如果 Google 管理的憑證與 Ingress 之間的通訊中斷,請刪除 ingress.gcp.kubernetes.io/pre-shared-cert
註解的內容,然後等待系統進行協調。為避免再次發生,請確保註解不會遭到誤改或刪除。
建立 Google 管理的憑證時發生驗證錯誤
ManagedCertificate
定義會在建立 ManagedCertificate
物件前經過驗證。如果驗證失敗,系統就不會建立 ManagedCertificate
物件,並顯示錯誤訊息。以下說明各種錯誤訊息和原因:
spec.domains in body should have at most 100 items
您的 ManagedCertificate
資訊清單在 spec.domains
欄位列出超過 100 個網域。Google 代管憑證最多僅支援 100 個網域。
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
欄位中指定了無效或含有萬用字元的網域名稱。ManagedCertificate
物件不支援萬用字元網域 (例如 *.example.com
)。
spec.domains in body should be at most 63 chars long
您指定的網域名稱長度太長。Google 管理的憑證支援的網域名稱,長度上限為 63 個字元。
手動更新 Google 代管的憑證
如要手動更新憑證,讓舊網域的憑證在新的網域憑證佈建完成前繼續運作,請按照下列步驟操作:
- 為新網域建立
ManagedCertificate
。 - 使用以半形逗號分隔的清單,在 Ingress 的
networking.gke.io/managed-certificates
註解中新增ManagedCertificate
的名稱。請勿移除舊憑證名稱。 - 等待
ManagedCertificate
變成「Active」。 - 從 Ingress 中卸除舊憑證並刪除。
建立 ManagedCertificate
時, Google Cloud 會建立 Google 代管的 SSL 憑證。你無法更新這項憑證。如果您更新 ManagedCertificate
, Google Cloud 會刪除並重新建立 Google 代管的 SSL 憑證。
如要為 GKE 叢集提供安全的 HTTPS 加密 Ingress,請參閱安全 Ingress 範例。
後續步驟
- 進一步瞭解 Google 代管憑證。
- 瞭解如何使用 Ingress 設定外部應用程式負載平衡器。
- 瞭解如何透過 Ingress 在外部應用程式負載平衡器中使用多個 SSL 憑證。
- 實作安全 Ingress。