适用于外部 HTTP(S) 负载平衡的 Ingress

本页面介绍适用于外部 HTTP(S) 负载平衡的 Ingress 在 Google Kubernetes Engine (GKE) 中的工作原理。您还可以了解如何设置和使用适用于外部负载平衡的 Ingress

如需了解有关在 GKE 中使用负载平衡的一般信息,请参阅适用于 HTTP(S) 负载平衡的 Ingress

概览

Google Cloud 的外部 HTTP(S) 负载平衡器是一种全局分布式负载平衡器,用于在互联网上公开应用。它通过全球范围的 Google 接入点 (PoP) 进行部署,为用户提供低延迟的 HTTP(S) 连接。任播路由用于负载平衡器 IP 地址,从而允许互联网路由确定到其最接近的 Google 负载平衡器的最低成本路径。

GKE Ingress 会部署外部 HTTP(S) 负载平衡器,以便为作为后端的 Pod 原生提供全局负载平衡。

对 Google Cloud 功能的支持

您可以使用 BackendConfig 配置外部 HTTP(S) 负载平衡器,以便使用如下功能:

BackendConfig 是自定义资源,用于保存 Google Cloud 功能的配置信息。 如需详细了解支持的功能,请参阅 Ingress 功能

对 WebSocket 的支持

借助外部 HTTP(S) 负载平衡,WebSocket 协议无需进行任何配置即可运行。

如果您打算使用 WebSocket 协议,您可能需要使用大于默认值 30 秒的超时值。对于通过 Google Cloud 外部 HTTP(S) 负载平衡器发送的 WebSocket 流量,后端服务超时被解释为 WebSocket 连接可以保持打开状态(无论是否空闲)的最长时间。

如需为通过 Ingress 配置的后端服务设置超时值,请创建 BackendConfig 对象,并在 Service 清单中使用 beta.cloud.google.com/backend-config 注释。

如需了解配置信息,请参阅后端响应超时

HTTP(S) 负载平衡器的静态 IP 地址

创建 Ingress 对象时,您需要获取稳定的外部 IP 地址,客户端可以使用该 IP 地址访问您的 Service,进而访问您正在运行的容器。IP 地址是稳定的,因为它在 Ingress 对象的生存期内持续有效。如果您删除您的 Ingress 并从同一清单文件创建新的 Ingress,则无法保证您会获取相同的外部 IP 地址。

如果您希望获取永久的 IP 地址,即使在删除 Ingress 并创建新的 Ingress 后该 IP 地址仍然保持不变,则必须预留全球静态外部 IP 地址。然后,在您的 Ingress 清单中添加注释,并在其中提供预留的静态 IP 地址的名称。

例如,假设您已预留名为 my-static-address 的全球静态外部 IP 地址。在您的 Ingress 清单中添加 kubernetes.io/ingress.global-static-ip-name 注释,如下所示:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-static-address

在客户端和负载平衡器之间设置 HTTPS (TLS)

HTTP(S) 负载平衡器充当客户端和应用之间的代理。如果您想要接受来自客户端的 HTTPS 请求,则负载平衡器必须具有证书,这样才能向客户端证明其身份。负载平衡器还必须具有私钥才能完成 HTTPS 握手。

当负载平衡器接受来自客户端的 HTTPS 请求时,客户端与负载平衡器之间的流量使用 TLS 进行加密。但是,负载平衡器可终止 TLS 加密,并将未加密的请求转发给应用。如需了解如何对负载平衡器与应用之间的流量进行加密,请参阅负载平衡器和应用之间的 HTTPS

您可以使用 Google 管理的 SSL 证书或您自行管理的证书。如需详细了解如何创建使用 Google 管理的证书的 Ingress,请参阅使用 Google 管理的 SSL 证书

如需为 HTTP(S) 负载平衡器提供您自己创建的证书和密钥,请创建 Kubernetes Secret 对象。Secret 会包含该证书和密钥。将 Secret 添加到 Ingress 清单的 tls 字段中,如以下示例所示:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress-2
spec:
  tls:
  - secretName: secret-name
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: service-name
          servicePort: 60000

系统会定期获取对 Secret 的更改,因此如果您修改了 Secret 内的数据,则最多需要 10 分钟就能将这些更改应用于负载平衡器。

如需了解详情,请参阅在通过 Ingress 进行 HTTP(S) 负载平衡时使用多个 SSL 证书

停用 HTTP

如果您希望客户端和 HTTP(S) 负载平衡器之间的所有流量都使用 HTTPS,则可以通过在 Ingress 清单中添加 kubernetes.io/ingress.allow-http 注释来停用 HTTP。请将注释的值设置为 "false"

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress-2
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
  - secretName: secret-name
  ...

负载平衡器的预共享证书

除了使用 Kubernetes Secret 为负载平衡器提供证书以终止 HTTP(S) 之外,您还可以使用之前上传到 Google Cloud 项目的证书。如需了解详情,请参阅使用预共享证书以及在通过 Ingress 进行 HTTPS 负载平衡时使用多个 SSL 证书

负载平衡器与应用之间的 HTTPS (TLS)

HTTP(S) 负载平衡器充当客户端和应用之间的代理。客户端可以使用 HTTP 或 HTTPS 与负载平衡器代理进行通信。默认情况下,从负载平衡器代理到应用的连接使用 HTTP。不过,如果在 GKE Pod 中运行的应用能够接收 HTTPS 请求,您可以将负载平衡器配置为使用 HTTPS 将请求转发给应用。

如需配置负载平衡器和应用之间使用的协议,请在 Service 清单中使用 cloud.google.com/app-protocols 注释。

以下 Service 清单指定了两个端口。注释表明,如果 HTTP(S) 负载平衡器以 Service 的端口 80 作为目标,则应该使用 HTTP。如果负载平衡器以 Service 的端口 443 作为目标,则应该使用 HTTPS。

apiVersion: v1
kind: Service
metadata:
  name: my-service-3
  annotations:
    cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
  type: NodePort
  selector:
    app: metrics
    department: sales
  ports:
  - name: my-https-port
    port: 443
    targetPort: 8443
  - name: my-http-port
    port: 80
    targetPort: 50001

后续步骤