CoreOS Flannel 网络插件故障排查指南
前言
Flannel 是 Kubernetes 生态中广泛使用的容器网络解决方案,它为集群中的 Pod 提供跨节点的网络通信能力。本文将深入剖析 Flannel 常见问题的排查方法,帮助运维人员快速定位和解决网络问题。
基础网络连通性问题
Docker iptables 策略变更
在 Docker v1.13 及更高版本中,默认的 iptables 转发策略变更为 DROP,这会导致不同主机上的容器间通信失败。
解决方案:
- 升级到最新版本的 Flannel
- 或手动调整 Docker 的 iptables 策略
日志系统详解
Flannel 使用 klog 日志库,但仅支持输出到 stderr。日志系统具有以下特点:
-
日志级别控制:
- 默认日志级别为
0 - 通过
-v参数可调整详细级别(最高可设为10) -vmodule支持按文件过滤日志
- 默认日志级别为
-
日志查看方式:
- systemd 环境:
journalctl -u flanneld - Kubernetes Pod:
kubectl logs --namespace kube-flannel <POD_ID> -c kube-flannel
- systemd 环境:
网络接口选择机制
Flannel 启动时会自动选择网络接口和公共 IP 地址,这些信息会在日志中明确输出:
I0629 14:28:35.866793 5522 main.go:386] Determining IP address of default interface
I0629 14:28:35.866987 5522 main.go:399] Using interface with name enp62s0u1u2 and address 172.24.17.174
I0629 14:28:35.867000 5522 main.go:412] Using 10.10.10.10 as external address
特殊场景 - Vagrant 环境: Vagrant 通常为 VM 分配两个接口:
- eth0:NAT 外部流量(默认 IP 10.0.2.15)
- eth1:内部通信接口
解决方案:
使用 --iface=eth1 参数强制 Flannel 使用第二个接口
NAT 环境下的特殊处理
当公共 IP 位于 NAT 后时,VXLAN 数据包的 UDP 校验和字段可能损坏。
临时解决方案:
/usr/sbin/ethtool -K flannel.1 tx-checksum-ip-generic off
持久化方案:
创建 udev 规则文件 /etc/udev/rules.d/90-flannel.rules:
SUBSYSTEM=="net", ACTION=="add|change|move", ENV{INTERFACE}=="flannel.1", RUN+="/usr/sbin/ethtool -K flannel.1 tx-checksum-ip-generic off"
权限问题排查
Flannel 某些后端功能需要 root 权限,常见错误包括:
Error adding route...Add L2 failedFailed to set up IP MasqueradeError registering network: operation not permitted
解决方案:
- 确认运行 Flannel 的用户具有足够权限
- 或使用
sudo运行
性能优化指南
控制平面优化
Flannel 可支持大规模主机集群,新主机 Pod 访问延迟可能表明控制平面问题:
- 检查 Flannel 资源配额
- 验证底层存储(etcd/Kubernetes API)性能
数据平面优化
-
后端选择:
vxlan性能优于udp- 无封装方案性能最佳
-
MTU 调整:
- 检查网络接口 MTU 设置
- 验证
subnet.env文件中的 MTU 值 - 确认容器虚拟网卡 MTU 配置
防火墙配置要点
不同后端所需的防火墙规则:
| 后端类型 | 端口 | 协议 | |---------|-------|------| | udp | 8285 | UDP | | vxlan | 8472 | UDP |
额外要求: 确保 Pod 网络 CIDR 可以访问 Kubernetes master 节点
Kubernetes 专项问题
podCIDR 配置检查
Flannel kube subnet 管理器依赖节点的 podCIDR 定义:
检查命令:
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'
kubectl get nodes -o template --template={{.spec.podCIDR}}
配置方法:
- kubelet 参数:
--pod-cidr - controller-manager 参数:
--allocate-node-cidrs=true --cluster-cidr=<cidr> - kubeadm 初始化参数:
--pod-network-cidr=10.244.0.0/16
手动配置(不推荐):
kubectl patch node <NODE_NAME> -p '{"spec":{"podCIDR":"<SUBNET>"}}'
常见错误日志解析
-
failed to read net conf:- 检查
/etc/kube-flannel/net-conf.json文件 - 验证
kube-flannel-cfgConfigMap 配置
- 检查
-
error parsing subnet config:- 检查网络配置 JSON 格式
- 验证配置内容正确性
-
node <NODE_NAME> pod cidr not assigned:- 节点缺少
podCIDR定义
- 节点缺少
-
RBAC 权限错误:
- 集群启用 RBAC 但缺少相应权限
- 需部署正确的 RBAC 配置清单
结语
本文全面梳理了 Flannel 网络插件的常见问题及其解决方案。通过系统化的排查方法,运维人员可以快速定位网络问题,确保 Kubernetes 集群的网络通信稳定可靠。建议定期检查 Flannel 日志和网络配置,防患于未然。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



