✅ 已完成:启用本地路由 + 完全替换 KubeProxy
📈 目标:通过 Cilium eBPF 技术,彻底摆脱 iptables/netfilter 瓶颈,提升 Kubernetes 网络性能
🎯 前言:为什么要做 Cilium 调优?
将 Kubernetes 的 CNI 从传统组件切换为 Cilium,本身就能显著提升网络性能。但通过进一步启用 Cilium 的高级功能和内核级优化,可实现“质的飞跃”。
可选调优项(持续更新中):
优化项 | 说明 | 内核要求 |
---|---|---|
✅ 启用本地路由 (Native Routing) | 减少额外封装,提升吞吐量 | - |
✅ 完全替换 KubeProxy | 消除 iptables 规则链瓶颈 | - |
🔄 IP 地址伪装 → eBPF 模式 | 更高效 SNAT/Masq | - |
🔄 NodePort DSR 模式 | Direct Server Return,减少回程路径 | - |
🔄 绕过 iptables 连接跟踪 | 减少 conntrack 开销 | - |
🔄 主机路由 → BPF 模式 | 高效主机间路由 | ≥5.10 |
🔄 启用 IPv6 BIG TCP | 提升大包传输效率 | ≥5.19 |
⚠️ 禁用 Hubble | 不推荐,牺牲可观测性换性能 | - |
🔄 MTU → 巨型帧 (Jumbo Frames) | 需网络设备支持 | - |
🔄 启用带宽管理器 | Pod 级带宽控制 | ≥5.1 |
🔄 启用 Pod BBR 拥塞控制 | 更智能 TCP 拥塞算法 | ≥5.18 |
🔄 启用 XDP 加速 | 驱动层高性能数据包处理 | 需支持 XDP 驱动 |
🛠️ 调整 eBPF Map Size | 高级用户按需调整 | - |
🐧 Linux Kernel 优化 | 如 CONFIG_PREEMPT_NONE=y |
- |
🖥️ 系统级调优 | tuned profile / CPU 性能模式 / irqbalance 优化等 | - |
📌 提示:在满足硬件/网络/内核条件的前提下,尽可能多地启用上述选项。
🧪 测试环境
- Cilium: v1.15.3
- Kubernetes: v1.33.4
- OS: centos 7.9
- Kernel: 6.9.10-1.el7.x86_64(满足绝大多数高级特性)
- 节点数: 1
📖 背景:KubeProxy 的性能瓶颈
KubeProxy 使用 iptables 实现服务流量转发,在大规模集群中:
- 数千甚至上万条 iptables 规则
- 每次规则匹配都是 O(n) 复杂度
- 导致延迟增加、吞吐下降、连接建立慢
KubeProxy 负责的功能:
ClusterIP
:集群内访问 ServiceNodePort
:集群内外通过节点端口访问ExternalIP
:外部 IP 访问LoadBalancer
:云厂商 LB 接入
👉 Cilium 使用 eBPF 完全实现了以上功能,并性能更优!
📊 官方测试显示:启用 DSR 后,性能进一步提升!
🛠️ 实战:创建无 KubeProxy 的集群
Step 1: 准备工具
# 安装依赖工具
sudo apt update && sudo apt install -y conntrack socat
# 下载 kk(KubeKey)
curl -sfL https://get-kk.kubesphere.io | sh -
chmod +x kk
Step 2: 创建集群配置 & 部署
cat > config-sample.yaml <<'EOF'
apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
name: sample
spec:
hosts:
- {name: k8s-single, address: 192.168.1.31, internalAddress: 192.168.1.31, user: root, password: "1234567"}
roleGroups:
etcd:
- k8s-single
control-plane:
- k8s-single
worker:
- k8s-single
controlPlaneEndpoint:
## Internal loadbalancer for apiservers
# internalLoadbalancer: haproxy
domain: lb.kubesphere.local
address: ""
port: 6443
kubernetes:
version: v1.33.4
clusterName: cluster.local
autoRenewCerts: true
containerManager: containerd
etcd:
type: kubekey
network:
plugin: cilium
kubePodsCIDR: 10.233.64.0/18
kubeServiceCIDR: 10.233.0.0/18
## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
multusCNI:
enabled: false
registry:
privateRegistry: ""
namespaceOverride: ""
registryMirrors: []
insecureRegistries: []
addons: []
EOF
./kk create cluster -f config-sample.yaml
⚙️ 配置 Cilium 启用严格替换模式
1. 备份 kube-proxy DaemonSet
kubectl -n kube-system get ds kube-proxy -o yaml > ~/kube-proxy-backup.yaml
- 文件 ~/kube-proxy-backup.yaml 就是完整的 kube-proxy 配置
- 可以随时用这个文件恢复:
kubectl apply -f ~/kube-proxy-backup.yaml
2. 删除 kube-proxy DaemonSet
kubectl -n kube-system delete ds kube-proxy
编辑 Cilium ConfigMap:
kubectl -n kube-system edit cm cilium-config
修改以下关键字段:
kube-proxy-replacement: "strict"
bpf-lb-external-clusterip: "true" # 支持从节点外访问 ClusterIP
bpf-lb-sock: "true" # Socket 层负载均衡加速
enable-node-port: "true" # 启用 NodePort
enable-host-port: "true"
routing-mode: native # 推荐单机/简单拓扑使用
编辑 Cilium DaemonSet,指定本地路由 CIDR:
kubectl -n kube-system edit ds cilium
在 args
中添加:
- --ipv4-native-routing-cidr=10.233.64.0/18
💡 根据你的 Pod CIDR 调整该值。
✅ 验证是否成功替换 KubeProxy
kubectl -n kube-system exec -it ds/cilium -- cilium status
检查输出中是否包含:
KubeProxyReplacement: Strict
🧪 实战验证:部署 Nginx + NodePort 服务
1. 创建 Deployment
cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
EOF
2. 暴露为 NodePort Service
kubectl expose deployment my-nginx --type=NodePort --port=80
查看服务信息:
kubectl get svc my-nginx
# 输出示例:
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# my-nginx NodePort 10.43.204.231 <none> 80:32727/TCP 96s
🔍 验证 Cilium eBPF 服务接管
kubectl -n kube-system exec ds/cilium -- cilium service list
应看到类似输出(含 NodePort 条目):
6 192.168.1.31:30776 NodePort 1 => 10.233.64.14:80 (active)
7 0.0.0.0:30776 NodePort 1 => 10.233.64.14:80 (active)
🚫 验证 iptables 规则已被移除
sudo iptables-save | grep KUBE-SVC
✅ 预期结果:无任何输出 —— 表明已无 KubeProxy 相关 iptables 规则!
🧭 多维度访问测试
获取 NodePort:
node_port=$(kubectl get svc my-nginx -o=jsonpath='{@.spec.ports[0].nodePort}')
echo $node_port
依次测试:
# 1. 本机回环 + NodePort
curl 127.0.0.1:$node_port
# 2. 本机 eth0 IP + NodePort
curl 192.168.1.31:$node_port
# 3. ClusterIP
curl 10.233.30.47:80
# 4. 本机 Pod IP(需已启用 Native Routing)
curl 10.233.64.14:80
# 5. 其他节点 Pod IP(需已启用 Native Routing)
curl 10.233.64.48:80
✅ 所有请求均应返回 Nginx 欢迎页:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
📝 Note:最后两项能通,是因为之前启用了 Native Routing!
🎉 总结
通过使用 Cilium 替代 KubeProxy,我们实现了:
- ❌ 彻底移除 iptables 规则链
- ⚡ 显著降低网络延迟与 CPU 开销
- 📈 提升 ClusterIP / NodePort / LoadBalancer 等服务的吞吐能力
- 🧩 为后续启用 DSR、BBR、XDP 等高级功能打下基础
✅ 当前已完成调优项
- ✔️ 启用本地路由 (Native Routing)
- ✔️ 完全替换 KubeProxy
📌 最佳实践建议:
在生产环境中,不要禁用 Hubble —— 可观测性远比微小的性能增益重要!
📚 参考资料:
评论