本页面介绍 Google Kubernetes Engine (GKE) 中的容器原生负载均衡。利用容器原生负载均衡,多种负载均衡器能够直接定位 Pod,还能将其流量均匀分发给 Pod。
容器原生负载均衡架构
容器原生负载均衡使用 GCE_VM_IP_PORT
网络端点组 (NEG)。NEG 的端点是 Pod IP 地址。
容器原生负载均衡始终用于内部 GKE Ingress,并且对于外部 Ingress 是可选的。Ingress 控制器会创建负载均衡器,包括虚拟 IP 地址、转发规则、健康检查和防火墙规则。
如需了解如何将 Ingress 与容器原生负载均衡搭配使用,请参阅通过 Ingress 配置容器原生负载均衡。
为了提高灵活性,您还可以创建独立的 NEG。在这种情况下,您负责创建和管理负载均衡器的所有方面。
容器原生负载均衡的优势
容器原生负载均衡具有以下优点:
- Pod 是负载均衡的核心对象
- kube-proxy 配置节点的
iptables
规则以将流量分发给 Pod。如果没有容器原生负载均衡,则负载均衡器流量将传输到节点实例组,然后通过iptables
规则路由到不一定在同一节点中的 Pod。有了容器原生负载均衡,负载均衡器流量将直接分发给应该接收该流量的 Pod,从而消除了额外的网络跃点。由于容器原生负载均衡直接定位 Pod,因此还有助于改善健康检查。
- 改善了网络性能
- 由于容器原生负载均衡器直接与 Pod 进行通信,而且连接的网络跃点较少,因此延迟时间和吞吐量均得到了改善。
- 提升了可见性
- 利用容器原生负载均衡,您可以了解从应用负载均衡器到 Pod 的延迟时间。从应用负载均衡器到每个 Pod 的延迟时间都是可见的,这些延迟时间通过节点 IP 基础容器原生负载均衡进行了汇总。这样,可以更轻松地在 NEG 级层排查服务问题。
- 对高级负载均衡功能的支持
- GKE 中的容器原生负载均衡支持外部应用负载均衡器的多项功能,例如与 Google Cloud Armor、Cloud CDN 和 Identity-Aware Proxy 等 Google Cloud 服务集成。此外,还具有负载均衡算法,可实现准确的流量分发。
- 对 Cloud Service Mesh 的支持
- 使用 Cloud Service Mesh(Google Cloud 专为服务网格打造的全托管式流量控制平面)需要 NEG 数据模型。
Pod 就绪性
对于相关 Pod,相应的 Ingress 控制器会管理一个类型为 cloud.google.com/load-balancer-neg-ready
的就绪性门控。Ingress 控制器会轮询负载均衡器的健康检查状态,其中包括 NEG 中所有端点的健康状况。如果负载均衡器的健康检查状态指示,特定 Pod 对应的端点运行正常,Ingress 控制器就会将 Pod 就绪性门控的值设置为True
。然后,在每个节点上运行的 kubelet 会计算 Pod 的有效就绪性,同时考虑此就绪性门控的值以及 Pod 的就绪性探测结果(如果定义了就绪性探测)。
通过 Ingress 使用容器原生负载均衡时,系统会自动启用 Pod 就绪性门控。
就绪性门控可以控制滚动更新的速率。启动滚动更新后,在 GKE 创建新 Pod 时,每个新 Pod 的端点都会添加到 NEG。如果从负载均衡器的角度来看,端点健康,则 Ingress 控制器会将就绪性门控设置为 True
。在 GKE 移除旧 Pod 之前,新创建的 Pod 必须至少通过其就绪性门控检查。这样可以确保该 Pod 的对应端点已经通过了负载均衡器的健康检查,并且后端容量得以维持。
如果 Pod 的就绪性门控因为容器映像已损坏或者负载均衡器健康检查配置有误而从未指示 Pod 已准备就绪,则负载均衡器不会将流量定向到新 Pod。如果在发布更新的 Deployment 时发生此类故障,则发布操作会在尝试创建一个新 Pod 后停止,这是因为该 Pod 的就绪性门控状态从未变为 True。如需了解如何检测和解决此问题,请参阅“问题排查”部分。
如果没有容器原生负载均衡和就绪性门控,则在将 Pod 标记为准备就绪之前,GKE 无法检测负载均衡器端点是否健康。在以前的 Kubernetes 版本中,您可以通过指定延迟时间段(Deployment 规范中的 minReadySeconds
)来控制系统移除和替换 Pod 的速率。
如果满足以下任一条件,则 GKE 会将 Pod 的 cloud.google.com/load-balancer-neg-ready
的值设置为 True
:
- Pod 的 IP 地址都不是 GKE 控制平面管理的
GCE_VM_IP_PORT
NEG 中的端点。 - Pod 的一个或多个 IP 地址是 GKE 控制平面管理的
GCE_VM_IP_PORT
NEG 中的端点。NEG 已连接到后端服务。后端服务的负载均衡器健康检查成功。 - Pod 的一个或多个 IP 地址是 GKE 控制平面管理的
GCE_VM_IP_PORT
NEG 中的端点。NEG 已连接到后端服务。后端服务的负载均衡器健康检查超时。 - 一个或多个 Pod IP 地址是一个或多个
GCE_VM_IP_PORT
NEG 中的端点。所有 NEG 都不会附加到后端服务。没有可用的负载均衡器健康检查数据。
会话亲和性
容器原生负载均衡支持基于 Pod 的会话亲和性。
使用容器原生负载均衡的要求
GKE 上通过 Ingress 实现的容器原生负载均衡器具有以下要求:
- 集群必须是 VPC 原生集群。
- 集群必须启用
HttpLoadBalancing
插件。 GKE 集群默认启用了HttpLoadBalancing
插件:您不得将其停用。
容器原生负载均衡器的限制
GKE 上通过 Ingress 实现的容器原生负载均衡器具有以下限制:
- 不支持外部直通网络负载均衡器。
- 您不得手动更改或更新 GKE 创建的应用负载均衡器的配置。您所做的任何更改都会被 GKE 覆盖。
容器原生负载均衡器的价格
您需要为在本指南中创建的 Ingress 预配的应用负载均衡器付费。如需了解负载均衡器的价格,请参阅 VPC 价格页面上的负载均衡和转发规则。
后续步骤
- 详细了解 NEG。
- 详细了解 VPC 原生集群。
- 详细了解外部应用负载均衡器。
- 观看有关 Pod 就绪性门控的 KubeCon 报告。