📘 Cilium 替换 kube-proxy 与性能调优指南

目录


1. 简介

Cilium 借助 eBPF 技术直接运行于 Linux 内核中,绕过传统网络栈处理流量,有效减少用户态与内核态之间的上下文切换,显著降低延迟并提升吞吐,特别适合性能敏感型负载场景。


2. 替换方法

Cilium 将替换原生的 kube-proxy 与 AWS CNI 插件 aws-node,因此需要先打补丁以避免 DaemonSet 冲突:

kubectl -n kube-system patch daemonset aws-node \
  --type='strategic' -p='{"spec":{"template":{"spec":{"nodeSelector":{"io.cilium/aws-node-enabled":"true"}}}}}'

kubectl -n kube-system patch daemonset kube-proxy \
  --type='strategic' -p='{"spec":{"template":{"spec":{"nodeSelector":{"io.cilium/aws-node-enabled":"true"}}}}}'

使用 Helm 部署 Cilium(EKS 场景下的 IP 为控制平面域名,端口为 443):

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set kubeProxyReplacement=true \
  --set k8sServiceHost=<K8s_SERVER_IP> \
  --set k8sServicePort=443

部署完成输出如下即代表成功:

Release "cilium" has been upgraded. Happy Helming!
...
Your release version is 1.16.0.

3. 设置验证

查看是否成功启用 kube-proxy 替代:

kubectl -n kube-system exec ds/cilium -- cilium status | grep KubeProxyReplacement

示例输出:

KubeProxyReplacement: True [eth0 192.168.x.x ...]

4. Cilium 性能调优

4.1 Netkit 模式

  • 内核要求:>= 6.8
  • 无需 veth,降低 namespace 切换开销
  • 配合 eBPF 主机路由启用:
helm install cilium cilium/cilium \
  --namespace kube-system \
  --set routingMode=native \
  --set bpf.datapathMode=netkit \
  --set bpf.masquerade=true \
  --set kubeProxyReplacement=true

🔍 Netkit 官方介绍


4.2 eBPF 主机路由

完全绕过 iptables 提高吞吐与降低延迟:

  • 内核要求:>= 5.10
  • 默认自动开启
  • 验证:
cilium status | grep "Host Routing"

4.3 IPv4 大包 TCP (BIG TCP)

支持更大 GSO/GRO 封包,减少 CPU 开销:

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set enableIPv4BIGTCP=true \
  --set ipv4.enabled=true \
  --set bpf.masquerade=true \
  --set routingMode=native \
  --set kubeProxyReplacement=true

4.4 跳过 iptables 的连接跟踪

节省 CPU 消耗,要求内核版本较低时建议开启:

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set installNoConntrackIptablesRules=true \
  --set kubeProxyReplacement=true

⚠️ 某些云平台(如 Azure、GKE)不支持,详见 Issue #17177


4.5 Hubble 观测系统

可选组件,影响 1~15% 性能,可关闭:

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set hubble.enabled=false

4.6 带宽管理器 Bandwidth Manager

用于 TCP pacing,提升吞吐控制延迟:

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set bandwidthManager.enabled=true \
  --set kubeProxyReplacement=true

4.7 Pod 使用 BBR 拥塞控制

需开启 Bandwidth Manager 并使用新内核(>= 5.18):

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set bandwidthManager.enabled=true \
  --set bandwidthManager.bbr=true \
  --set kubeProxyReplacement=true

4.8 Maglev 一致性哈希

提高负载均衡一致性与可用性:

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set loadBalancer.algorithm=maglev \
  --set kubeProxyReplacement=true

4.9 Tuned 网络性能配置

适用于 AWS EC2 或物理机网络调优:

yum install tuned -y
tuned-adm profile network-latency

⚠️ AL2023 默认不支持,需自定义镜像


4.10 混合 DSR/SNAT 模式

针对 TCP 使用 DSR,UDP 使用 SNAT:

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set loadBalancer.mode=hybrid \
  --set kubeProxyReplacement=true

4.11 AWS 上 NodePort + XDP 支持

MTU 与 channel 限制如下:

ip link set dev ens5 mtu 3498
ethtool -L ens5 combined 1

详情参考:Cilium kube-proxy-free 指南


5. 性能测试

🔧 延迟测试

kubectl create deployment nginx-test --image=nginx --replicas=5
curl -o /dev/null -s -w "%{time_total}\n" http://<POD_IP>:80

📊 吞吐测试

kubectl run -it --rm iperf-server --image=networkstatic/iperf3 -- iperf3 -s
kubectl run -it --rm iperf-client --image=networkstatic/iperf3 -- iperf3 -c iperf-server -t 60 -i 1

📈 测试结果

场景 kube-proxy cilium cilium(tuned)
跨 AZ 延迟(ms) 2.1904 1.9369 1.8161
跨 AZ 吞吐(Gbps) 43.4 43.6 58.3
区域 kube-proxy cilium
集群内延迟 (ms) 0.726 0.553
AZ 内集群外访问 (ms) 1.326 1.366
跨 AZ 集群外访问 (ms) 2.356 2.221

6. 参考资料