本页面介绍了如何使用 Google 管理的 SSL 证书确保 GKE 上的 Ingress 的安全。您将了解如何使用 Google 的自动化证书管理服务来简化应用的 HTTPS 加密。
这些证书是 Google 为您的域名预配、续订和管理的网域验证 (DV) 证书。这些证书并不代表您的个人或组织身份。
本页面适用于负责规划和实施网络安全以及制定和维护安全政策的网络专家和安全专家。如需详细了解我们在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字段。 - 您必须在同一项目和命名空间中应用
Ingress和ManagedCertificate资源。 创建预留的(静态)外部 IP 地址。 预留静态 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 控制台中的外部 IP 地址页面。
为此 IP 地址指定名称(例如
example-ip-address)。指定您需要 IPv4 还是 IPv6 地址。
选择类型对应的全球选项。
点击预留。 IP 地址在外部地址列中列出。
Config Connector
注意:此步骤需要使用 Config Connector。按照安装说明在您的集群上安装配置连接器。
如需部署此清单,请将它以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类型的 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将清单应用到您的集群:
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" spec: defaultBackend: service: name: mc-service port: number: SERVICE_PORT替换以下内容:
ADDRESS_NAME:预留的 IP 地址的名称。SERVICE_PORT:Service 清单中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 管理的新证书添加到 Ingress,如设置由 Google 管理的证书部分中所述。
等待由 Google 管理的证书资源的状态变为“有效”。 使用以下命令检查证书的状态:
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 控制台中的外部 IP 地址页面。
选中要释放的 IP 地址旁边的复选框。
点击释放 IP 地址。
Config Connector
注意:此步骤需要使用 Config Connector。按照安装说明在您的集群上安装配置连接器。
如需部署此清单,请将它以
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 地址时未预配托管式证书
当网域解析为多个负载均衡器(多个 Ingress 对象)的 IP 地址时,您应该创建一个 ManagedCertificate 对象并将其关联到所有 Ingress 对象。如果您改为创建多个 ManagedCertificate 对象并将每个对象关联到单独的 Ingress,则证书授权机构可能无法验证网域的所有权,并且部分证书可能无法预配。若要使验证成功,证书必须在网域解析为的所有 IP 地址下显示。
具体而言,当您的网域解析为使用不同 Ingress 对象配置的 IPv4 和 IPv6 地址时,您应该创建一个 ManagedCertificate 对象并将其关联到两个 Ingress。
由 Google 管理的证书与 Ingress 之间的通信中断
代管式证书使用 ingress.gcp.kubernetes.io/pre-shared-cert 注解与 Ingress 通信。您可以在以下情况下中断此通信,例如:
- 运行可清除
ingress.gcp.kubernetes.io/pre-shared-cert注解的自动化进程。 - 存储 Ingress 的快照,然后通过快照删除和恢复 Ingress。在此期间,
ingress.gcp.kubernetes.io/pre-shared-cert注解中列出的SslCertificate资源可能已被删除。如果缺失关联的任何证书,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。 - 使用英文逗号分隔列表,将
ManagedCertificate的名称添加到 Ingress 上的networking.gke.io/managed-certificates注释。请勿移除旧证书名称。 - 等待
ManagedCertificate变为活动状态。 - 从 Ingress 中分离旧证书并将其删除。
创建 ManagedCertificate 时, Google Cloud 会创建一个 Google 管理的 SSL 证书。您无法更新此证书。 如果您更新 ManagedCertificate,则 Google Cloud 会删除并重新创建 Google 管理的 SSL 证书。
如需为您的 GKE 集群提供安全的 HTTPS 加密 Ingress,请参阅安全 Ingress 示例。
后续步骤
- 详细了解由 Google 管理的证书。
- 了解如何使用 Ingress 设置外部应用负载均衡器。
- 了解如何将多个 SSL 证书与使用 Ingress 的外部应用负载均衡器搭配使用。
- 实现安全 Ingress。