这是一篇关于 Kubernetes 常见网络插件(Flannel、Calico 和 Cilium)的文章,详细介绍了不同网络插件之间的优缺点及其适用场景,提供详细的安装指导,希望这篇文章能帮助您找到合适的网络插件!
- 操作系统:CentOS Linux 7 (Core)
- Containerd:1.6.33
- Kubernetes:1.30.1
1、Flannel vs Calico vs Cilium
- 核心特性对比
特性 | Flannel | Calico | Cilium |
---|---|---|---|
网络模型 | Overlay (VXLAN) | BGP/IPIP/VXLAN | eBPF-based |
性能 | 中等 | 高 | 极高 |
网络策略 | 基本支持 | 高级支持 | 最先进支持 |
加密 | 不支持 | IPsec | WireGuard/IPsec |
服务发现 | 无 | 无 | 内置 |
可观测性 | 有限 | 中等 | 丰富 |
安装复杂度 | 简单 | 中等 | 较复杂 |
适用集群规模 | 中小型(≤100节点) | 大中型(≤1000节点) | 任意规模 |
- 性能对比指标
1、吞吐量
Cilium(eBPF) > Calico(BGP) > Calico(IPIP) > Flannel(VXLAN)
2、延迟
Cilium(eBPF) ≈ Calico(BGP) < Calico(IPIP) < Flannel(VXLAN)
3、CPU 利用率
Flannel ≈ Calico(BGP) < Calico(IPIP) < Cilium(高负载下更好)
4、策略执行效率
Cilium(L3-L7) > Calico(L3-L4) > Flannel(基本)
综合优缺点分析
1、Flannel
a、优点:
安装配置简单,适合简单的网络需求
资源消耗低
社区支持广泛,稳定性高
b、缺点:
仅支持基本网络策略
性能一般(使用VXLAN封装有开销)
缺乏高级网络功能
c、典型场景:
开发测试环境、小型生产集群
不需要复杂网络策略的场景
资源受限的环境
2、Calico
a、优点:
高性能(BGP模式无封装开销)
丰富的网络策略支持
良好的可扩展性
支持IP地址管理(IPAM)
b、缺点:
配置相对复杂
BGP 模式需要网络基础设施支持
eBPF 功能较 Cilium 有限
c、典型场景:
企业级生产环境
需要严格网络策略的场景、需要高性能网络的环境
混合云/多集群环境
3、Cilium
a、优点:
基于eBPF的极致性能
高级网络策略(L3 - L7)
内置服务网格功能
强大的可观测性
原生支持多集群
b、缺点:
学习曲线陡峭
对内核版本有要求(≥4.19)
资源消耗相对较高
某些高级功能需要商业版
c、典型场景:
高性能需求场景,大规模集群
安全敏感型环境
服务网格集成需求
需要深度网络可视化的环境
2、安装 Flannel 网络插件
- Flannel:v0.26.7
### 安装 ###
# 下载 flannel.yml 配置(文件内容见附件)
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 应用 kube-flannel.yml
kubectl apply -f kube-flannel.yml
# 验证测试网络插件部署成功
kubectl get pods -n kube-system
kubectl run nginx-flannel --image=nginx:latest
## 报错:Failed to check br netfilter: stat /proc/sys/net/bridge/bridge-nf-call-iptables: no such file or directory
## 原因:通常表示内核模块 br_netfilter 未加载或未正确配置
## 解决:
# 加载 br_netfilter 模块
modprobe br_netfilter
# 配置以启用桥接网络的 iptables 规则
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1 # 开启路由转发
net.bridge.bridge-nf-call-ip6tables = 1 # 开启桥流量监控
net.bridge.bridge-nf-call-iptables = 1 # 开启桥流量监控
EOF
# 生效
sysctl --system
# 重启 kubelet、containerd
systemctl daemon-reload
systemctl restart kubelet
systemctl restart containerd
## 配置 ghcr.io镜像加速
## 解决:
mkdir -p /etc/containerd/certs.d/ghcr.io
tee /etc/containerd/certs.d/ghcr.io/hosts.toml << 'EOF'
server = "https://ghcr.io"
[host."https://ghcr.m.daocloud.io"]
capabilities = ["pull", "resolve", "push"]
EOF
3、安装 Calico 网络插件
- Calico:v3.29.3
### 安装 ###
# 下载 tigera-operator.yaml、custom-resources.yaml(文件内容见附件)
wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.3/manifests/tigera-operator.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.3/manifests/custom-resources.yaml
# 部署 tigera-operator.yaml
kubectl create -f tigera-operator.yaml
# 查看 podSubnet 并修改 custom-resources.yaml 中的 spec.calicoNetwork.ipPools.cidr
kubectl get cm -n kube-system kubeadm-config -o yaml | grep podSubnet
vi custom-resources.yaml
...
cidr: 10.244.0.0/16
...
# 部署 custom-resources.yaml
kubectl create -f custom-resources.yaml
# 验证测试网络插件部署成功
kubectl get all -n calico-system
kubectl get pod -A
kubectl run nginx-calico --image=nginx:latest
## 报错:The CustomResourceDefinition "installations.operator.tigera.io" is invalid: metadata.annotations: Too long: must have at most 262144 bytes
## 原因(官方文档):
# NOTE:Due to the large size of the CRD bundle, kubectl apply might exceed request limits. Instead, use kubectl create or kubectl replace.
## 解决:使用 kubectl create -f xxx.yaml 命令即可
4、安装 Cilium 网络插件
- cilium-cli: v0.18.3 compiled with go1.24.2 on linux/amd64
- cilium image (default): v1.17.2
- cilium image (stable): v1.17.3
- cilium image (running): 1.17.2
### 安装 ###
# 下载安装包(安装包见附件)
wget curl -LO https://github.com/cilium/cilium-cli/releases/download/v0.17.0/cilium-linux-amd64.tar.gz
# 解压后将 cilium 移动到 /usr/local/bin
tar -zxvf cilium-linux-amd64.tar.gz
mv cilium /usr/local/bin
# 完成后可执行 cilium --help 验证 cilium 可用
cilium --help
# 使用 cilium install 命令安装 cilium 网络插件
cilium install --set kubeProxyPeplacement=strict --set ipam.mode=kubernetes --set routingMode=tunnel --set tunnelProtocol=vxlan --set ipam.operator.clusterPoolIPv4PodCIDRList=10.244.0.0/16 --set ipam.Operator.ClusterPoolIPv4MaskSize=24
# 查看安装状态
kubectl get pod -A
cilium status
# 验证测试网络插件部署成功
kubectl run nginx-cilium --image=nginx:latest