排查 GKE 中的负载均衡问题

Google Kubernetes Engine (GKE) 中的负载平衡问题可能会导致服务中断,例如出现 HTTP 502 错误,或阻止对应用的访问。

通过本文档,您将了解如何排查来自外部 Ingress 的 502 错误,以及如何使用负载均衡器日志和诊断工具(例如 check-gke-ingress)来发现问题。

对于在 GKE 中配置和维护负载均衡服务的平台管理员、运维人员和应用开发者来说,此信息非常重要。如需详细了解我们在 Cloud de Confiance by S3NS 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

外部 Ingress 生成 HTTP 502 错误

请按照以下指导信息来排查外部 Ingress 资源的 HTTP 502 错误:

  1. 为 Ingress 所引用的每个 GKE Service 相关联的每个后端服务启用日志
  2. 使用状态详细信息确定出现 HTTP 502 响应的原因。指示源自后端的 HTTP 502 响应的状态详细信息需要在服务 Pod(而非负载均衡器)中进行问题排查。

非代管实例组

如果外部 Ingress 使用非托管式实例组后端,您可能会遇到外部 Ingress 资源的 HTTP 502 错误。当满足以下所有条件时,就会出现此问题:

  • 集群的所有节点池中的节点总数很多。
  • Ingress 引用的一个或多个 Service 的服务 Pod 仅位于几个节点上。
  • Ingress 引用的 Service 使用 externalTrafficPolicy: Local

如需确定外部 Ingress 是否使用非代管实例组后端,请执行以下操作:

  1. 前往 Cloud de Confiance 控制台中的 Ingress 页面。

    进入 Ingress

  2. 点击外部 Ingress 的名称。

  3. 点击负载均衡器的名称。此时会显示 Load balancing details(负载均衡详情)页面。

  4. 查看后端服务部分中的表,以确定外部 Ingress 使用的是 NEG 还是实例组。

如需解决此问题,请使用以下解决方案之一:

  • 使用 VPC 原生集群。
  • 为外部 Ingress 引用的每个 Service 使用 externalTrafficPolicy: Cluster。此解决方案会导致您丢失数据包来源中的原始客户端 IP 地址。
  • 使用 node.kubernetes.io/exclude-from-external-load-balancers=true 注解。为未对集群中任何外部 Ingress 或 LoadBalancer Service 引用的任何 Service 运行任何服务 Pod 的节点或节点池添加注解。

L4 负载均衡器日志记录配置

如果您已为外部直通式网络负载平衡器或内部直通式网络负载平衡器启用日志记录,本部分将提供问题排查信息。

监控日志记录配置的状态

GKE L4LB 控制器通过服务的 status.conditions 类型提供有关日志记录协调状态的反馈。您可以运行以下命令来检查此状态:

kubectl get svc SERVICE_NAME -o yaml

替换以下内容:

  • SERVICE_NAME:集群的名称。

在输出中,查找 LoggingConfigManaged 条件类型。下表介绍了可能导致此状况的原因:

条件状态 原因 说明
True 已协调 控制器正在积极强制执行 L4LBConfig CRD 中定义的日志记录配置。
错误 不受管理 L4LBConfig CRD 中缺少 logging 部分,或者注解已被移除。控制器已停止管理,并将后端服务置于其最近一次的已知状态。
错误 缺失 找不到 Service 注解中引用的 L4LBConfig 资源。
错误 无效 L4LBConfig 资源未能通过 optionalFields 参数的交叉验证。
错误 错误 后端服务协调期间发生错误。

了解滑行行为

如果从 Service 清单中移除 networking.gke.io/l4lb-config 注解,或者删除引用的 L4LBConfig 资源,配置将进入 Coast 状态。

在此状态下,GKE 控制器会停止管理日志记录设置,但不会将 Cloud de Confiance by S3NS 后端服务重置为默认设置。而是保持在最近一次的已知良好状态。系统通常会发出警告事件,通知您 Kubernetes 不再控制相应配置。

使用负载均衡器日志进行问题排查

您可以使用内部直通网络负载均衡器日志外部直通网络负载均衡器日志来排查负载均衡器的问题,并将从负载均衡器到 GKE 资源的流量关联起来。

日志会按连接汇总并近乎实时地导出。系统将为 LoadBalancer Service 的数据路径中涉及的每个 GKE 节点生成入站和出站流量日志。日志条目包含 GKE 资源的其他字段,例如:

  • 集群名称
  • 集群位置
  • 服务名称
  • 服务命名空间
  • Pod 名称
  • Pod 命名空间

使用诊断工具排查问题

check-gke-ingress 诊断工具会检查 Ingress 资源是否存在常见配置错误。您可以通过以下方式使用 check-gke-ingress 工具:

  • 在集群上运行 gcpdiag 命令行工具。Ingress 结果显示在检查规则 gke/ERR/2023_004 部分中。
  • 按照 check-gke-ingress 中的说明,单独使用 check-gke-ingress 工具或是用作 kubectl 插件。