容器服务平台提供网络诊断功能,帮助您诊断网络常见问题,例如Pod之间不通、集群到公网访问不通、公网到LoadBalancer不通。本文介绍网络诊断的基本原理、使用方式、以及如何针对常见网络不通的场景定位网络问题和使用网络诊断。
使用故障诊断功能时,系统将在您的集群节点上执行数据采集程序并收集检查结果。采集的信息包括系统版本、负载、Docker、Kubelet等运行状态及系统日志中关键错误信息。数据采集程序不会采集您的业务信息及敏感数据。
前提条件
已创建ACK集群。具体操作,请参见创建Kubernetes托管版集群或创建Kubernetes专有版集群。
网络诊断介绍
容器服务控制台中提供了网络诊断功能,通过输入问题链路的源地址和目的地址、目的端口和协议,即可快速诊断常见网络问题。您无需对复杂的容器网络架构和网络插件原理进行了解,也无需对系统内核有丰富的运维经验。
网络诊断功能基于开源项目KubeSkoop。KubeSkoop针对不同的网络插件和IaaS提供商,提供了常见Kubernetes集群网络问题的一键诊断,并结合eBPF对内核关键路径做深度监控和分析。本文仅对网络诊断部分进行说明,关于深度监控和分析,请参见使用ACK Net Exporter定位网络问题。
工作原理
拓扑构建:在提供诊断信息后,网络诊断会根据所提供的信息,以及集群中所收集到的资源信息(例如Pod、Node、Service、NetworkPolicy等),去构建本次诊断的访问拓扑图。
信息采集:网络诊断采集运行时信息、网络协议栈信息以及网络基础设施的相关信息。采集不同的数据和信息,以便于排查故障和网络分析。
链路模拟:网络诊断通过在ECS上执行命令或在集群中下发collector Pod的形式,收集网络诊断所经过的节点或容器内的网络栈信息,包括网络设备、sysctl、iptables、IPVS等。除此之外,网络诊断也会收集云上如路由表、安全组、NAT网关等信息。系统会将收集的这些信息与预期的网络配置作对比,以发现配置不正确的情况,包括对iptables和路由的模拟、对设备状态的判断、对云上路由表和安全组规则的验证等。
获取诊断结果:在实际配置与预期配置做比较后,最终将会输出诊断的网络拓扑,并将异常节点和异常问题标记出来。
使用网络诊断
使用限制
待诊断的Pod需要为Running状态。
目前公网到LoadBalancer Service仅支持4层CLB类型,且后端Pod数量不超过10个。
目前暂不支持ACK Serverless集群或VK虚拟节点的诊断。
操作步骤
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择巡检和诊断>故障诊断。
在故障诊断页面,单击网络诊断。
在访问信息面板,输入需诊断网络的源地址、目的地址、端口,并选择目标协议,仔细阅读注意事项后,选中我已知晓并同意,然后单击发起诊断。
关于此处诊断参数的填写,请参见常见网络不通的诊断参数。
在诊断结果页面,能够查看网络诊断结果,并且在访问全图区域,会呈现出本次诊断访问链路的全景图。
异常节点会使用不同于正常节点的颜色标出。关于常见诊断结果,请参见常见诊断结果及解决方案。
常见网络不通的诊断参数
场景一:诊断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上安全组不允许包通过。 | 检查安全组规则,放行对应地址。 |
| 云路由表中不存在到目标IP的路由。 | 检查云上路由表配置,若目的地址为公网,检查公网NAT网关配置。 |
| 云路由表中的路由指向与预期不符。 | 检查云上路由表配置,若目的地址为公网,检查公网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。 |