网络诊断

容器服务平台提供网络诊断功能,帮助您诊断网络常见问题,例如Pod之间不通、集群到公网访问不通、公网到LoadBalancer不通。本文介绍网络诊断的基本原理、使用方式、以及如何针对常见网络不通的场景定位网络问题和使用网络诊断。

重要

使用故障诊断功能时,系统将在您的集群节点上执行数据采集程序并收集检查结果。采集的信息包括系统版本、负载、Docker、Kubelet等运行状态及系统日志中关键错误信息。数据采集程序不会采集您的业务信息及敏感数据。

前提条件

已创建ACK集群。具体操作,请参见创建Kubernetes托管版集群创建Kubernetes专有版集群

网络诊断介绍

容器服务控制台中提供了网络诊断功能,通过输入问题链路的源地址和目的地址、目的端口和协议,即可快速诊断常见网络问题。您无需对复杂的容器网络架构和网络插件原理进行了解,也无需对系统内核有丰富的运维经验。

网络诊断功能基于开源项目KubeSkoop。KubeSkoop针对不同的网络插件和IaaS提供商,提供了常见Kubernetes集群网络问题的一键诊断,并结合eBPF对内核关键路径做深度监控和分析。本文仅对网络诊断部分进行说明,关于深度监控和分析,请参见使用ACK Net Exporter定位网络问题

工作原理

image.png
  1. 拓扑构建:在提供诊断信息后,网络诊断会根据所提供的信息,以及集群中所收集到的资源信息(例如Pod、Node、Service、NetworkPolicy等),去构建本次诊断的访问拓扑图。

  2. 信息采集:网络诊断采集运行时信息、网络协议栈信息以及网络基础设施的相关信息。采集不同的数据和信息,以便于排查故障和网络分析。

  3. 链路模拟:网络诊断通过在ECS上执行命令或在集群中下发collector Pod的形式,收集网络诊断所经过的节点或容器内的网络栈信息,包括网络设备、sysctl、iptables、IPVS等。除此之外,网络诊断也会收集云上如路由表、安全组、NAT网关等信息。系统会将收集的这些信息与预期的网络配置作对比,以发现配置不正确的情况,包括对iptables和路由的模拟、对设备状态的判断、对云上路由表和安全组规则的验证等。

  4. 获取诊断结果:在实际配置与预期配置做比较后,最终将会输出诊断的网络拓扑,并将异常节点和异常问题标记出来。

使用网络诊断

使用限制

  • 待诊断的Pod需要为Running状态。

  • 目前公网到LoadBalancer Service仅支持4层CLB类型,且后端Pod数量不超过10个。

  • 目前暂不支持ACK Serverless集群或VK虚拟节点的诊断。

操作步骤

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择巡检和诊断>故障诊断

  3. 故障诊断页面,单击网络诊断

  4. 访问信息面板,输入需诊断网络的源地址目的地址端口,并选择目标协议,仔细阅读注意事项后,选中我已知晓并同意,然后单击发起诊断

    关于此处诊断参数的填写,请参见常见网络不通的诊断参数

    image.png
  5. 诊断结果页面,能够查看网络诊断结果,并且在访问全图区域,会呈现出本次诊断访问链路的全景图。

    异常节点会使用不同于正常节点的颜色标出。关于常见诊断结果,请参见常见诊断结果及解决方案

    image.png

常见网络不通的诊断参数

场景一:诊断Pod、Node间网络

若出现Pod与Pod、Pod与Node连接不通的情况,您可以使用网络诊断功能对Pod、Node间的网络进行诊断。诊断参数如下:

参数

说明

源地址

Pod或Node地址

目标地址

Pod或Node地址

端口

需要诊断的端口

协议

需要诊断的协议

场景二:诊断Pod、Node到Service的网络

网络诊断可以以Service的集群IP进行诊断,诊断Pod、Node到Service的每一个端点的链路,以及与Service相关的网络配置。诊断参数如下:

参数

说明

源地址

Pod、Node地址

目标地址

Service的集群IP

端口

需要诊断的端口

协议

需要诊断的协议

场景三:诊断DNS链路的网络

当访问目标为域名时,除源地址到目标域名IP的链路外,可能还需要检查集群内的DNS是否工作正常。您可以使用网络诊断功能诊断Pod到集群内DNS服务(kube-system命名空间下的kube-dns)的连通性,来判断是否存在DNS解析问题。

执行以下命令,获得集群中kube-system命名空间下的kube-dns Service的集群IP。

kubectl get svc -n kube-system kube-dns

预期输出:

kube-dns   ClusterIP   172.16.XX.XX   <none>        53/UDP,53/TCP,9153/TCP   6d
NAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                  AGE

输出结果中,172.16.XX.XX即为kube-dns的集群IP。使用kube-dns的集群IP作为目标地址,诊断参数如下:

参数

说明

源地址

Pod或Node地址

目标地址

kube-dns Service的集群IP

端口

53

协议

udp

场景四:诊断Pod、Node到公网的网络

您可以使用网络诊断对Pod、Node到公网IP地址进行网络诊断。若公网为域名,您需要先将其手动解析为公网IP。诊断参数如下:

参数

说明

源地址

Pod、Node地址

目标地址

公网IP

端口

需要诊断的端口

协议

需要诊断的协议

场景五:诊断公网到LoadBalancer Service的网络

若出现公网访问集群内LoadBalancer Service不通的情况,您可以以公网地址为源地址、目标地址为LoadBalanacer的外部IP进行诊断。诊断参数如下:

参数

说明

源地址

公网地址

目标地址

LoadBalancer的外部IP

端口

需要诊断的端口

协议

需要诊断的协议

常见诊断结果及解决方案

诊断结果

说明

解决方案

pod container ... is not ready

Pod中容器未就绪。

查看对应Pod健康状态,进行修复。

network policy ... deny the packet from ...

NetworkPolicy阻拦了包。

修改对应的NetworkPolicy规则。

no process listening on ...

容器或节点上没有以该协议监听该端口的进程。

确认对应进程是否异常,检查诊断参数(端口、协议)。

no route to host .../invalid route ... for packet ...

没有找到路由或路由指向错误。

检查网络插件工作是否正常。

... do not have same security roup

两台ECS间不存在相交的安全组规则,可能会导致包被丢弃。

使ECS使用同一安全组。

security group ... not allow packet ...

ECS上安全组不允许包通过。

检查安全组规则,放行对应地址。

  • no route entry for destination ip ...

  • no next hop for destination ip ...

云路由表中不存在到目标IP的路由。

检查云上路由表配置,若目的地址为公网,检查公网NAT网关配置。

  • error route next hop for destination ip ...

  • expect next hop for destination ip ...

云路由表中的路由指向与预期不符。

检查云上路由表配置,若目的地址为公网,检查公网NAT网管配置。

no snat entry on nat gateway ...

公网NAT网关上未找到对应的SNAT规则。

检查公网NAT网关中的SNAT规则配置。

backend ... health status for port ..., not "normal"

CLB上存在健康检查失败的后端。

检查CLB上挂载端点是否符合预期,以及检查CLB上挂载的端点对应的服务是否健康。

cannot find listener port ... for slb ...

CLB上不存在该端口。

检查LoadBalancer Service配置,以及检查诊断参数(端口、协议)是否正确。

status of loadbalancer for ... port ... not "running"

CLB上监听状态不为Running。

检查CLB上监听端口是否存在异常。

service ... has no valid endpoint

Service上没有端点。

检查Service标签选择器是否符合预期,以及检查Service所对应的端点是否存在且健康。

关于集群内访问LoadBalancer Service IP的情况,请参见集群外无法访问SLB