CoreOS Flannel 网络插件故障排查指南

CoreOS Flannel 网络插件故障排查指南

前言

Flannel 是 Kubernetes 生态中广泛使用的容器网络解决方案,它为集群中的 Pod 提供跨节点的网络通信能力。本文将深入剖析 Flannel 常见问题的排查方法,帮助运维人员快速定位和解决网络问题。

基础网络连通性问题

Docker iptables 策略变更

在 Docker v1.13 及更高版本中,默认的 iptables 转发策略变更为 DROP,这会导致不同主机上的容器间通信失败。

解决方案

  • 升级到最新版本的 Flannel
  • 或手动调整 Docker 的 iptables 策略

日志系统详解

Flannel 使用 klog 日志库,但仅支持输出到 stderr。日志系统具有以下特点:

  1. 日志级别控制

    • 默认日志级别为 0
    • 通过 -v 参数可调整详细级别(最高可设为 10
    • -vmodule 支持按文件过滤日志
  2. 日志查看方式

    • systemd 环境:journalctl -u flanneld
    • Kubernetes Pod:kubectl logs --namespace kube-flannel <POD_ID> -c kube-flannel

网络接口选择机制

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 failed
  • Failed to set up IP Masquerade
  • Error registering network: operation not permitted

解决方案

  • 确认运行 Flannel 的用户具有足够权限
  • 或使用 sudo 运行

性能优化指南

控制平面优化

Flannel 可支持大规模主机集群,新主机 Pod 访问延迟可能表明控制平面问题:

  1. 检查 Flannel 资源配额
  2. 验证底层存储(etcd/Kubernetes API)性能

数据平面优化

  1. 后端选择

    • vxlan 性能优于 udp
    • 无封装方案性能最佳
  2. 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}}

配置方法

  1. kubelet 参数:--pod-cidr
  2. controller-manager 参数:--allocate-node-cidrs=true --cluster-cidr=<cidr>
  3. kubeadm 初始化参数:--pod-network-cidr=10.244.0.0/16

手动配置(不推荐)

kubectl patch node <NODE_NAME> -p '{"spec":{"podCIDR":"<SUBNET>"}}'

常见错误日志解析

  1. failed to read net conf

    • 检查 /etc/kube-flannel/net-conf.json 文件
    • 验证 kube-flannel-cfg ConfigMap 配置
  2. error parsing subnet config

    • 检查网络配置 JSON 格式
    • 验证配置内容正确性
  3. node <NODE_NAME> pod cidr not assigned

    • 节点缺少 podCIDR 定义
  4. RBAC 权限错误:

    • 集群启用 RBAC 但缺少相应权限
    • 需部署正确的 RBAC 配置清单

结语

本文全面梳理了 Flannel 网络插件的常见问题及其解决方案。通过系统化的排查方法,运维人员可以快速定位网络问题,确保 Kubernetes 集群的网络通信稳定可靠。建议定期检查 Flannel 日志和网络配置,防患于未然。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值