Please enable Javascript to view the contents

K8s部署实录-6-Flannel版本与5.15内核不兼容导致跨节点pod无法通信问题

 ·  ☕ 4 分钟

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配置文件举例()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
cluster_name: general
nodes:
  - address: 192.168.1.10
    role:
      - controlplane
      - etcd
      - worker
  - address: 192.168.1.11
    role:
      - worker
ssh_key_path: /home/tgde/.ssh/id_ed25519
kubernetes_version: v1.19.8-rancher1-1
# Specify network plugin-in (canal, calico, flannel, weave, or none)
network:
  plugin: canal
private_registries:
  - url: reg.paas.org
    is_default: true
dns:
  provider: coredns
ingress:
  provider: none
services:
  kubelet:
    extra_binds:
      - "/data:/data"
  • 操作系统: 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_IPnode网卡子网子网网卡
node-1master192.168.1.1ens16010.42.0.0/24flannel.1
node-2worker192.168.1.2ens16010.42.1.0/24flannel.1

pod

pod名称所属节点集群内部IP
dnstoolsnode-1[192.168.1.1]10.42.0.5
coffee-85cvdnode-1[192.168.1.1]10.42.0.6
coffee-mrj6snode-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]执行命令检查防火墙,确认状态已关闭

1
systemctl status ufw.service

3. 确认节点之间没有安全组规则

机器部署在云服务器,检查安全组设置,排除安全组规则设置导致通信异常的问题。

4. 排查iptables规则

-L: 列出当前的iptables规则
-S: 查看当前的iptables规则的详细信息

1
sudo iptables -L

4. 检查路由规则

1
route -n

5. 检查vxlan配置

6. 抓包

tcpdump <参数> -i <网卡> <过滤条件: udp|icmp>

  • X: 输出数据包的内容,以十六进制和 ASCII 文本的形式。这允许你查看数据包的实际内容。
  • e: 在输出中显示以太网帧的详细信息,包括源和目标 MAC 地址以及帧类型。
  • n: 使用数字形式显示IP地址和端口号,而不进行 DNS 解析。(性能优化、隐私保护)
  • i: 指定要捕获数据包的网络接口。
  • v/vv/vvv: 增加输出的详细程度,以便查看更多的信息。

源端网络

1
sudo tcpdump -vvvenX -i ens160 udp 

目的端网络

flannel节点之间通过udp通信,需要将协议改为udp

1
sudo tcpdump -vvvenX -i ens160 udp 

2023-0830-udp-checksum-error.png

总结

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

分享

Hex
作者
Hex
CloudNative Developer

目录