k8s的flannel生产实战与常见问题排查
关于 Kubernetes Flannel 插件的详细教程及生产环境实战指南,涵盖核心概念、安装配置、常见问题排查与优化策略
一、Flannel 概述
Flannel 是 Kubernetes 最常用的 CNI(Container Network Interface)插件之一,用于为集群中的 Pod 提供跨节点通信。其核心功能是分配 Pod IP 并建立覆盖网络(Overlay Network),支持多种后端(Backend)如 VXLAN、host-gw、UDP 等。
核心特性
-
简单轻量:配置简单,资源消耗低。
-
IP 地址管理(IPAM):自动为每个节点分配子网。
-
跨节点通信:通过覆盖网络实现 Pod 跨节点互通。
二、安装与配置 Flannel
1. 前置条件
-
已部署 Kubernetes 集群(kubeadm、kops 等工具搭建)。
-
节点间网络互通(开放 UDP 8472/VXLAN 或相应端口)。
2. 安装 Flannel
# 使用官方 Manifest 安装最新版本
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml# 或通过 Helm 安装(需预先安装 Helm)
helm repo add flannel https://flannel-io.github.io/flannel/
helm install flannel flannel/flannel
3. 配置 Flannel 后端
Flannel 支持多种后端模式,需根据网络环境选择:
后端模式 | 适用场景 | 性能 | 配置示例 |
---|---|---|---|
VXLAN | 跨子网、云环境(默认) | 中等 | net-conf.json: { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } } |
host-gw | 同子网、物理网络 | 高 | Backend: { "Type": "host-gw" } |
UDP | 老旧内核兼容(不推荐生产) | 低 | Backend: { "Type": "udp" } |
WireGuard | 加密通信(需内核支持) | 中等 | Backend: { "Type": "wireguard" } |
修改配置示例(通过 ConfigMap部署):
# kube-flannel.yml 片段
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "host-gw"
}
}
三、生产环境实战指南
1. 高可用性
-
多副本部署:确保
kube-flannel-ds
DaemonSet 在所有节点运行。 -
节点失效恢复:Flannel 依赖 Kubernetes 节点状态更新,确保
kubelet
健康。
2. 网络策略
-
NetworkPolicy 支持:Flannel 自身不提供网络策略,需结合 Calico 或 Cilium。
-
防火墙规则:开放 VXLAN UDP 8472 或 host-gw 的 IP 协议。
3. 监控与日志
-
日志收集:查看 Flannel Pod 日志定位问题:
-
命令示例:
kubectl logs -n kube-system <flannel-pod-name> --tail=100 -
Metrics 监控:集成 Prometheus 监控 Flannel 指标(需配置 ServiceMonitor)。
4. 安全加固
-
Pod 安全上下文:限制 Flannel Pod 的权限:
#yaml示例 securityContext:privileged: falsecapabilities:add: ["NET_ADMIN"]
-
加密通信:使用 WireGuard 或 IPSec 后端加密跨节点流量。
5. 性能优化
-
MTU 调整:根据网络环境调整 MTU(避免分片):
json示例:
-
"Backend": {
"Type": "vxlan",
"MTU": 1450
} -
避免 UDP 后端:仅在测试环境使用 UDP,生产环境优先选择 VXLAN 或 host-gw。
四、常见问题排查
1. Pod 无法跨节点通信
-
检查路由表:
-
# 在节点上执行
ip route show | grep flannel -
验证防火墙:确保 VXLAN(UDP 8472)或 host-gw(IP 协议)端口开放。
-
查看 Flannel 日志:
-
kubectl logs -n kube-system <flannel-pod-name> | grep "Failed"
2. IP 地址分配冲突
-
清理旧配置:
-
ip link delete flannel.1
rm -rf /var/lib/cni/flannel/* -
重置 Flannel:重启 Flannel DaemonSet 并重建 Pod。
3. 性能瓶颈
-
切换后端模式:从 VXLAN 切换到 host-gw(需同子网)。
-
调整 MTU:根据网络实际 MTU 优化(如 AWS 默认 MTU 为 9001)。
五、与其他 CNI 插件对比
CNI 插件 | 优势 | 劣势 |
---|---|---|
Flannel | 简单、轻量、易部署 | 功能单一(需配合其他插件) |
Calico | 支持网络策略、BGP 路由 | 配置复杂 |
Cilium | 基于 eBPF、高级安全特性 | 资源消耗较高 |