使用由 Google 管理的 SSL 证书

本页面介绍了如何使用 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 字段不受支持。

  • 您必须在同一项目和命名空间中应用 IngressManagedCertificate 资源。

  • 创建预留的(静态)外部 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 地址,请执行以下步骤:

    1. 进入 Google Cloud 控制台中的外部 IP 地址页面。

      转到“外部 IP 地址”

    2. 为此 IP 地址指定名称(例如 example-ip-address)。

    3. 指定您需要 IPv4 还是 IPv6 地址。

    4. 选择类型对应的全球选项。

    5. 点击预留。 IP 地址在外部地址列中列出。

    Config Connector

    注意:此步骤需要使用 Config Connector。按照安装说明在您的集群上安装配置连接器。

    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
    
  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:Service 清单中 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 管理的新证书添加到 Ingress,如设置由 Google 管理的证书部分中所述。
  2. 等待由 Google 管理的证书资源的状态变为“有效”。 使用以下命令检查证书的状态:

    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 控制台中的外部 IP 地址页面。

      转到“外部 IP 地址”

    2. 选中要释放的 IP 地址旁边的复选框。

    3. 点击释放 IP 地址

    Config Connector

    注意:此步骤需要使用 Config Connector。按照安装说明在您的集群上安装配置连接器。

    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
    

后续步骤