tencent cloud

文档反馈

负载均衡相关

最后更新时间:2023-03-27 11:08:16
    本文汇总了负载均衡相关常见问题,介绍与 Service/Ingress CLB 相关的各种常见问题的出现原因及解决办法。
    本文档需要您:
    熟悉 K8S 的 基本概念。例如 Pod、工作负载/Workload、Service、Ingress 等。
    熟悉 腾讯云控制台 容器服务之 TKE Serverless 集群的常规操作。
    熟悉通过 kubectl 命令行工具操作 K8S 集群中的资源。
    注意:
    您可通过多种方式操作 K8S 集群中的资源,本文档向您介绍如何通过腾讯云控制台进行操作,及如何通过 kubectl 命令行工具进行操作。

    TKE Serverless 会为哪些 Ingress 创建 CLB 实例?

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

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

    如果成功为 Ingress 创建 CLB 实例,TKE Serverless 会将 CLB 实例的 VIP 写入 Ingress 资源的 status.loadBalancer.ingress 中,并且将如下键值对写入 annotations 中:
    kubernetes.io/ingress.qcloud-loadbalance-id: CLB 实例 ID
    如需查看 TKE Serverless 为 Ingress 创建的 CLB 实例,具体步骤如下:
    1. 登录容器服务控制台,选择左侧导航栏中的 集群
    2. 在集群列表页面,选择集群 ID 进入集群管理页面。
    3. 在集群管理页面,选择左侧服务与路由 > Ingress
    4. 在 “Ingress” 页面,查看 CLB 实例 ID 及其 VIP。如下图所示:
    

    TKE Serverless 会为哪些 Service 创建 CLB 实例?

    TKE Serverless 会为满足如下条件的 Service 创建 CLB 实例:
    K8S 版本
    对 Service 资源的要求
    所有 TKE Serverless 支持的 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 实例,TKE Serverless 会将如下键值对写入 Service annotations 中:
    service.kubernetes.io/loadbalance-id: CLB 实例 ID

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

    如果成功为 Service 创建 CLB 实例,TKE Serverless 会将 CLB 实例的 VIP 写入 Service 资源的 status.loadBalancer.ingress 中,并且将如下键值对写入 annotations 中:
    kubernetes.io/ingress.qcloud-loadbalance-id: CLB 实例 ID
    如需查看 TKE Serverless 为 Service 创建的 CLB 实例,具体步骤如下:
    1. 登录容器服务控制台,选择左侧导航栏中的 集群
    2. 在集群列表页面,选择集群 ID 进入集群管理页面。
    3. 在集群管理页面,选择左侧服务与路由 > Service
    4. Service 页面,查看 CLB 实例 ID 及其 VIP。如下图所示:
    

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

    对于 spec.type 为 LoadBalancer 的 Service,目前 TKE Serverless 默认不分配 ClusterIP,或者分配的 ClusterIP 无效(无法正常访问)。如果用户同时需要使用 ClusterIP 访问 Service,可以通过在 annotations 中加入如下键值对指示 TKE Serverless 基于内网 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." 后缀)的 TKE Serverless 集群才支持该特性。对于早期创建的、使用非魔改版 K8S(kubectl version 返回的 Server GitVersion 不带 "eks." 或 "tke." 后缀)的 TKE Serverless 集群,您需要升级 K8S 版本后使用该特性。

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

    您可以通过容器服务控制台 或通过 kubectl 命令行工具指定 CLB 实例类型:
    通过容器服务控制台操作
    通过 kubectl 命令行工具操作
    对于 Ingress,通过“网络类型”选择“公网”或“内网”:
    
    对于 Service,通过“服务访问方式”控制,其中“VPC内网访问”对应内网 CLB 实例:
    
    默认创建的 CLB 实例是“公网”类型。
    如需创建“内网”类型的 CLB 实例,则需为 Service 或 Ingress 加上相应的 annotation:
    资源类型
    需要在 annotations 中添加的键值对
    Service
    service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: 子网 ID
    Ingress
    kubernetes.io/ingress.subnetId: 子网 ID
    注意:
    子网 ID是形如 subnet-******** 的字符串,并且该子网必须在创建集群时为 “集群网络”指定的 VPC 中,该 VPC 信息可在腾讯云控制台集群 “基本信息” 中查询到。
    

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

    您可以通过容器服务控制台 或通过 kubectl 命令行工具指定使用已有 CLB 实例:
    通过容器服务控制台 操作
    通过 kubectl 命令行工具操作
    在创建 Service 或 Ingress 时,可以选择“使用已有” CLB 实例。对于 Service,还可以在 Service 创建之后,通过“更新访问方式”切换成“使用已有” CLB 实例。
    在创建 Service/Ingress 或变更 Service 时,为 Service 或 Ingress 加上相应的 annotation 即可:
    资源类型
    需要在 annotations 中添加的键值对
    Service
    service.kubernetes.io/tke-existed-lbid: CLB 实例 ID
    Ingress
    kubernetes.io/ingress.existLbId: CLB 实例 ID
    注意:
    “已有 CLB 实例” 不能是 “TKE Serverless 为 Service 或 Ingress 创建的 CLB 实例”,并且 TKE Serverless 不支持多个 Service/Ingress 共用同一个已有 CLB 实例。
    

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

    仅7层 CLB 实例支持配置访问日志,但 TKE Serverless 为 Ingress 创建的7层 CLB 实例默认不开启访问日志。如需开启 CLB 实例的访问日志,可在 CLB 实例的详情页面进行操作。具体步骤如下:
    1. 登录容器服务控制台,选择左侧导航栏中的 集群
    2. 在集群列表页面,选择集群 ID 进入集群管理页面。
    3. 在集群管理页面,选择左侧服务与路由 > Ingress
    4. 在 “Ingress” 页面,选择 CLB 实例 ID 进入 CLB 基本信息页面。如下图所示:
    
    5. 在 CLB 基本信息页面的“访问日志(七层)”中,单击 
    
    ,在弹出窗口中进行开启。如下图所示:
    

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

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

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

    TKE Serverless 集群默认多个 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 内访问。 由于 TKE Serverless 集群中 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。TKE Serverless 为某个 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 规则。请结合实际情况进行查看:
    通过容器服务控制台创建工作负载
    使用 kubectl 命令创建工作负载
    交互流程会强制要求指定一个安全组,TKE Serverless 将使用该安全组控制 Pods 的网络访问策略。用户选择的安全组会被存储在工作负载的 spec.template.metadata.annotations,最终添加到 Pods 的 annotations 中。示例如下:
    
    若您通过 kubectl 命令创建工作负载,且没有(通过 annotations)为 Pods 指定安全组,则 TKE Serverless 会使用账号下的同地域的默认项目的 default 安全组。查看步骤如下:
    1. 登录私有网络控制台,选择左侧导航栏中的 安全组
    2. 在“安全组”页面上方,选择同地域的默认项目。
    3. 可在列表中查看 default 安全组,可单击修改规则查看详情。如下图所示:
    

    联系我们

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

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持