Flannel 是 Kubernetes 中常用的 CNI 插件之一,用于为容器提供网络连接。然而,在某些情况下,特定版本的
Flannel 可能与某些内核版本不兼容,导致 “bad udp checksum” 错误,从而影响了跨节点的 Pod 通信。在本篇博客中,将详细介绍如何逐步排查和定位这个问题。
当排查 Kubernetes 网络问题,特别是与 CNI(容器网络接口)有关的问题时,需要考虑以下方面:
- 防火墙
- iptables 规则
- 路由规则
- cni中间件(本文为flannel)状态
以下是一步步排查防火墙、iptables 规则、route 路由规则并通过抓包定位 “bad udp checksum” 错误的过程
环境说明
为简单定位问题,将节点缩减为2台,master: 192.168.1.10 worker: master: 192.168.1.11
rke配置文件举例()
|
|
- 操作系统: Ubuntu 22.04.3 LTS
- os内核: 5.15.0-79-generic
- rke: v1.2.6
- k8s安装包:v1.19.8-rancher1-1
- flannel版本:v0.13.0-rancher1
- network-plugin: canal
1. 确认错误现象
rke up 创建集群后,部署cert-manager后,创建ClusterIssuer
时,cert-manager组件之间无法通过svc.ns
访问
节点名称 | 节点角色 | node_IP | node网卡 | 子网 | 子网网卡 |
---|---|---|---|---|---|
node-1 | master | 192.168.1.1 | ens160 | 10.42.0.0/24 | flannel.1 |
node-2 | worker | 192.168.1.2 | ens160 | 10.42.1.0/24 | flannel.1 |
pod
pod名称 | 所属节点 | 集群内部IP |
---|---|---|
dnstools | node-1[192.168.1.1] | 10.42.0.5 |
coffee-85cvd | node-1[192.168.1.1] | 10.42.0.6 |
coffee-mrj6s | node-2[192.168.1.2] | 10.42.1.3 |
测试结果为:
k8s集群内部:
pod dnstools 可以ping通pod coffee-85cvd(同节点pod),无法ping通pod coffee-mrj6s(跨节点pod)宿主机节点:
宿主机可以 ping 通部署在当前主机上的pod ,去ping 部署在其他宿主机pod ip 不通
期望的正常结果为:
- k8s集群内部pod可以与集群内部任意pod通信;
- 宿主机可以ping集群内所有pod的IP;
2. 排查防火墙
同时在 node-1[192.168.1.1] node-2[192.168.1.2]执行命令检查防火墙,确认状态已关闭
|
|
3. 确认节点之间没有安全组规则
机器部署在云服务器,检查安全组设置,排除安全组规则设置导致通信异常的问题。
4. 排查iptables规则
-L: 列出当前的iptables规则
-S: 查看当前的iptables规则的详细信息
|
|
4. 检查路由规则
|
|
5. 检查vxlan配置
6. 抓包
tcpdump <参数> -i <网卡> <过滤条件: udp|icmp>
- X: 输出数据包的内容,以十六进制和 ASCII 文本的形式。这允许你查看数据包的实际内容。
- e: 在输出中显示以太网帧的详细信息,包括源和目标 MAC 地址以及帧类型。
- n: 使用数字形式显示IP地址和端口号,而不进行 DNS 解析。(性能优化、隐私保护)
- i: 指定要捕获数据包的网络接口。
- v/vv/vvv: 增加输出的详细程度,以便查看更多的信息。
源端网络
|
|
目的端网络
flannel节点之间通过udp通信,需要将协议改为udp
|
|
总结
checksum-offload 指定了内核不做校验和,交给网卡去做,当使用VXLAN
时,由于某些原因(参考连接1和2),校验值计算错误导致Bad udp cksum
错误,所以会丢弃。
而canal中节点中间通信通过flannel 的vxlan实现,节点内部通讯通过calico,因此出现跨节点pod无法通信,同一节点pod通信正常的现象。
解决
- 关闭
CNI VXLAN
网卡的 checksum offload - 升级内核版本
什么是 checksum offload
Checksum Offload 是网卡的一个功能选项。如果该选项开启,则网卡层面会计算需要发送或者接收到的消息的校验和,从而节省 CPU 的计算开销。此时,在需要发送的消息到达网卡前,系统会在报头的校验和字段填充一个随机值。但是,尽管校验和卸载能够降低 CPU 的计算开销,但受到计算能力的限制,某些环境下的一些网络卡计算速度不如主频超过 400MHz 的 CPU 快。
Reference
1. 内核缺陷触发的NodePort服务63秒延迟问题
2. k8s vxlan 作为 cni 后端引发的 63 秒延迟
3. 63 秒延迟的触发原因定位-张浩
4. Disable tx and rx offloading on VXLAN interfaces #1282