首充送50%
续费低至5折
AWS CDN 1折购
免费代充值
免费选购指南
免费协助迁移

适用于外部应用负载均衡器的 Ingress

2023-07-24

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

如需了解有关在 GKE 中使用负载均衡的一般信息,请参阅适用于外部应用负载均衡器的 Ingress

概览

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

GKE Ingress 会部署外部应用负载均衡器,以便为作为后端的 Pod 原生提供全球负载均衡。

对 Google Cloud 功能的支持

您可以使用 BackendConfig 配置外部应用负载均衡器,以使用如下功能:

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

对 WebSocket 的支持

使用外部应用负载均衡器时,WebSocket 协议无需进行任何配置即可运行。

如果您打算使用 WebSocket 协议,您可能需要使用大于默认值 30 秒的超时值。对于通过 Google Cloud 外部应用负载均衡器发送的 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 地址的名称。 如果您修改现有 Ingress 以使用静态 IP 地址而不是临时 IP 地址,则 GKE 可能会在 GKE 重新创建负载均衡器的转发规则时更改负载均衡器的 IP 地址。

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


apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  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/v1kind: Ingressmetadata:  name: my-ingress-2spec:  tls:  - secretName: SECRET_NAME  rules:  - http:      paths:      - path: /*        pathType: ImplementationSpecific        backend:          service:            name: SERVICE_NAME            port:              number: 60000

此清单包含以下值:

  • SECRET_NAME:您创建的 Secret 的名称。
  • SERVICE_NAME:后端服务的名称。

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

如需了解详情,请参阅在通过 Ingress 进行 HTTPS 负载均衡时使用多个 SSL 证书

停用 HTTP

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


apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: my-ingress-2  annotations:    kubernetes.io/ingress.allow-http: 'false'spec:  tls:  - secretName: SECRET_NAME  ...

此清单包含 SECRET_NAME,即您创建的 Secret 的名称。

注意:如果您使用的是注释 networking.gke.io/managed-certificates,则无法使用注释 kubernetes.io/ingress.allow-http: false。只有在外部应用负载均衡器完全编程后,您才能更新 Ingress 并添加注解 kubernetes.io/ingress.allow-http: false。

负载均衡器的预共享证书

除了使用 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 清单必须包含 type: NodePort。如果使用容器原生负载均衡,请使用 type: ClusterIP

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

Service 清单必须在端口注解中包含一个 name 值。您只能通过引用 Service 已分配的 name 端口(而不是通过其 targetPort 值)来修改 Service 端口。