用户指南

最佳实践

API 文档

负载均衡相关

最近更新时间:2021-11-04 15:38:12

本文汇总了负载均衡相关常见问题,介绍与 Service/Ingress CLB 相关的各种常见问题的出现原因及解决办法。

本文档需要您:

  • 熟悉 K8S 的 基本概念。例如 Pod、工作负载/Workload、Service、Ingress 等。
  • 熟悉 腾讯云控制台 容器服务之弹性集群的常规操作。
  • 熟悉通过 kubectl 命令行工具操作 K8S 集群中的资源。
注意

您可通过多种方式操作 K8S 集群中的资源,本文档向您介绍如何通过腾讯云控制台进行操作,及如何通过 kubectl 命令行工具进行操作。

EKS 会为哪些 Ingress 创建 CLB 实例?

EKS 会为满足如下条件的 Ingress 创建 CLB 实例:

对 Ingress 资源的要求 其他说明
annotations 中含有如下键值对: kubernetes.io/ingress.class: qcloud 如果不希望 EKS 为 Ingress 创建 CLB 实例,例如希望使用 Nginx-ingress,则只需保证 annotations 中不包含前述键值对。

如何查看 EKS 为 Ingress 创建的 CLB 实例?

如果成功为 Ingress 创建 CLB 实例,EKS 会将 CLB 实例的 VIP 写入 Ingress 资源的 status.loadBalancer.ingress 中,并且将如下键值对写入 annotations 中:

kubernetes.io/ingress.qcloud-loadbalance-id: CLB 实例 ID

如需查看 EKS 为 Ingress 创建的 CLB 实例,具体步骤如下:

  1. 登录容器服务控制台,选择左侧导航栏中的 弹性集群
  2. 在“弹性集群”页面,选择集群 ID 进入集群管理页面。
  3. 在集群管理页面,选择左侧服务与路由 > Ingress
  4. 在 “Ingress” 页面,查看 CLB 实例 ID 及其 VIP。如下图所示:

EKS 会为哪些 Service 创建 CLB 实例?

EKS 会为满足如下条件的 Service 创建 CLB 实例:

K8S 版本 对 Service 资源的要求
所有 EKS 支持的 K8S 版本 spec.type 为 LoadBalancer
魔改版 K8S(kubectl version 返回的 Server GitVersion 带有 "eks.*" 或 "tke.*" 后缀) spec.type 为 ClusterIP,并且 spec.clusterIP 的值不是None(即非 Headless 的 ClusterIP 类型的 Service)
非魔改版 K8S(kubectl version 返回的 Server GitVersion 不带 "eks.*" 或 "tke.*" 后缀) spec.type 为 ClusterIP,并且明确指定 spec.clusterIP 为空字符串("")
注意

如果成功创建 CLB 实例,EKS 会将如下键值对写入 Service annotations 中:

service.kubernetes.io/loadbalance-id: CLB 实例 ID

如何查看 EKS 为 Service 创建的 CLB 实例?

如果成功为 Service 创建 CLB 实例,EKS 会将 CLB 实例的 VIP 写入 Service 资源的 status.loadBalancer.ingress 中,并且将如下键值对写入 annotations 中:

kubernetes.io/ingress.qcloud-loadbalance-id: CLB 实例 ID
如需查看 EKS 为 Service 创建的 CLB 实例,具体步骤如下:

  1. 登录容器服务控制台,选择左侧导航栏中的 弹性集群
  2. 在“弹性集群”页面,选择集群 ID 进入集群管理页面。
  3. 在集群管理页面,选择左侧服务与路由 > Service
  4. 在 “Service” 页面,查看 CLB 实例 ID 及其 VIP。如下图所示:

为什么 Service 的 ClusterIP 无效(无法正常访问)或没有 ClusterIP ?

对于 spec.type 为 LoadBalancer 的 Service,目前 EKS 默认不分配 ClusterIP,或者分配的 ClusterIP 无效(无法正常访问)。如果用户同时需要使用 ClusterIP 访问 Service,可以通过在 annotations 中加入如下键值对指示 EKS 基于内网 CLB 实现 ClusterIP:

service.kubernetes.io/qcloud-clusterip-loadbalancer-subnetid: Service CIDR 子网 ID
Service CIDR 子网 ID 在创建集群时指定,为 subnet-******** 字符串。您可在 CLB 基本信息页面中查看该子网 ID 信息。

注意

只有使用魔改版 K8S(kubectl version 返回的 Server GitVersion带有 "eks.*" 或 "tke.*" 后缀)的 EKS 集群才支持该特性。对于早期创建的、使用非魔改版 K8S(kubectl version 返回的 Server GitVersion 不带 "eks.*" 或 "tke.*" 后缀)的 EKS 集群,您需要升级 K8S 版本后使用该特性。

如何指定 CLB 实例类型(公网或内网)?

您可以通过容器服务控制台或通过 kubectl 命令行工具指定 CLB 实例类型:

  • 对于 Ingress,通过“网络类型”选择“公网”或“内网”:

  • 对于 Service,通过“服务访问方式”控制,其中“VPC内网访问”对应内网 CLB 实例:

如何指定使用已有 CLB 实例?

您可以通过容器服务控制台或通过 kubectl 命令行工具指定使用已有 CLB 实例:

在创建 Service 或 Ingress 时,可以选择“使用已有” CLB 实例。对于 Service,还可以在 Service 创建之后,通过“更新访问方式”切换成“使用已有” CLB 实例。

如何查看 CLB 实例的访问日志?

仅7层 CLB 实例支持配置访问日志,但 EKS 为 Ingress 创建的7层 CLB 实例默认不开启访问日志。如需开启 CLB 实例的访问日志,可在 CLB 实例的详情页面进行操作。具体步骤如下:

  1. 登录容器服务控制台,选择左侧导航栏中的 弹性集群
  2. 在“弹性集群”页面,选择集群 ID 进入集群管理页面。
  3. 在集群管理页面,选择左侧服务与路由 > Ingress
  4. 在 “Ingress” 页面,选择 CLB 实例 ID 进入 CLB 基本信息页面。如下图所示:
  5. 在 CLB 基本信息页面的“访问日志(七层)”中,单击 ,在弹出窗口中进行开启。如下图所示:

为什么 EKS 没有为 Ingress 或 Service 创建 CLB 实例?

请参考 EKS 会为哪些 Ingress 创建 CLB 实例EKS 会为哪些 Service 创建 CLB 实例 问题的回答,确认对应的资源是否具备对应的条件。如具备条件但未成功创建 CLB 实例,可通过 kubectl describe 命令查看“资源”相关事件。
通常 EKS 会输出相关的 Warning 类型事件。示例图如下,输出事件表明子网中已经无可用的 IP 资源,所以无法成功创建 CLB 实例。

如何在多个 Service 中使用相同的负载均衡?

弹性容器服务 EKS 集群默认多个 Service 不可共用同一个 CLB 实例。如果您希望 Service 复用其他 Service 占用的 CLB,请添加此 annotation 并将 value 填写为 "true"。service.kubernetes.io/qcloud-share-existed-lb: true,关于此 annotation 的详细说明请参见 Annotation 说明

为什么访问 CLB VIP 时失败?

请您按照以下步骤进行分析:

查看 CLB 实例类型

  1. 在 “Service” 或 “Ingress” 页面,选择 CLB 实例 ID 进入 CLB 基本信息页面。如下图所示:
  2. 您可在 CLB 基本信息页面中查看上述 CLB 实例的“实例类型”。

确认访问 CLB VIP 的环境是否正常

  • 若 CLB 实例“实例类型”为内网,则其 VIP 只能在所属的 VPC 内访问。
    由于 EKS 集群中 Pods 的 IP 是 VPC 内的弹性网卡的 IP,所以可以在 Pods 中访问集群内任何 Service 或 Ingress 的 CLB 实例的 VIP。
    注意:

    通常 LoadBalancer 系统都存在回环问题(例如 AzureLoad Balancer 问题排查指南),请勿在工作负载所属的 Pods 中通过该工作负载(经 Service 或 Ingress )对外暴露的 VIP 访问该工作负载提供的服务。即 Pods 不要通过 VIP(包含“内网类型”及“外网类型”)访问 Pods 自己提供的服务。否则可能导致延迟增加,或者(在 VIP 对应的规则下只有一个 RS/Pod 时)访问不通。

  • 若 CLB 实例“实例类型”为公网,则其 VIP 可以在有公网访问能力的环境中访问。
    若要在集群内访问公网 VIP,请确保已经通过配置 NAT 网关或其他方式为集群开启了公网访问能力。

查看 CLB 下的 RS 包括(且仅包括)预期的 Pods 的 IP + 端口

您可在 CLB 管理页面中,选择监听器管理页面,查看(7层协议)转发规则、(4层协议)绑定的后端服务。其中的 IP 地址预期即为各个 Pod 的 IP。EKS 为某个 Ingress 创建的 CLB 示例图如下:

确认对应的 Endpoints 是否正常

如果已正确地为工作负载(Workload)设置了标签(Labels),并且正确地为 Service 资源设置了选择算符(Selectors),则在工作负载的 Pods 成功运行之后,即可通过 kubectl get endpoints 命令查看 Pods 被 K8S 列入到 Service 对应的 Endpoints 的就绪地址列表中。示例图如下:

而已创建、但状态异常的 Pods 会被 K8S 列入到 Service 对应的 Endpoints 的未就绪地址列表中。示例图如下:

注意

对于异常的 Pods,可通过 kubectl describe 命令查看异常的原因。示例命令如下:

kubectl describe pod nginx-7c7c647ff7-4b8n5 -n demo

确认 Pods 是否能够正常提供服务

即使 Running 状态的 Pods 也可能无法正常对外提供服务。例如,未监听指定的协议+端口、Pods 内部逻辑错误、处理过程阻塞等。您可通过 kubectl exec 命令登录至 Pod 内,并使用 telnet/wget/curl 命令或自定义的客户端工具直接访问 Pod IP+端口。若 Pod 内直接访问失败,则需要进一步分析导致 Pod 无法正常提供服务的原因。

确认 Pod 绑定的安全组是否放通 Pods 提供服务的协议和端口

安全组控制 Pods 的网络访问策略,如同 Linux 服务器中的 IPTables 规则。请结合实际情况进行查看:

交互流程会强制要求指定一个安全组,EKS 将使用该安全组控制 Pods 的网络访问策略。用户选择的安全组会被存储在工作负载的 spec.template.metadata.annotations,最终添加到 Pods 的 annotations 中。示例如下:

联系我们

若至此仍未找到问题原因,您可通过 在线客服提交工单 联系 TKE 团队解决问题。

目录