📘 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
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
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 |