✅ 已完成:启用本地路由 + 完全替换 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:集群内访问 Service
  • NodePort:集群内外通过节点端口访问
  • 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 —— 可观测性远比微小的性能增益重要!


📚 参考资料