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


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

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

Google Kubernetes Engine (GKE) 网络基于 Cloud Load Balancing 构建而成。借助 Cloud Load Balancing,单个任播 IP 地址可使路由确定到最近的 Google Cloud 负载均衡器的最低成本路径。

对 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/v1
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/v1
kind: Ingress
metadata:
  name: my-ingress-2
spec:
  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 证书

要为您的 GKE 集群保护 HTTPS 加密的 Ingress,请参阅保护 Ingress 示例。

停用 HTTP

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

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

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

负载均衡器的预共享证书

除了使用 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 端口。

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

后续步骤