4. Cilium安装与基础配置:使用Helm安装Cilium、配置kube-proxy替代、启用eBPF主机路由、验证安装状态
本章是Cilium网络调优实战的基石。我们将使用Helm在Kubernetes集群中部署Cilium,并完成三项核心基础配置:完全替代kube-proxy、启用eBPF主机路由以及验证安装状态。正确的安装与基础配置是后续多租户隔离策略和性能调优的前提。
4.1 使用Helm安装Cilium
Helm是部署Cilium的首选方式,它提供了声明式的配置管理和灵活的升级路径。安装前,请确保已添加Cilium官方Helm仓库并更新索引。
# 添加Cilium Helm仓库
helm repo add cilium https://helm.cilium.io/
# 更新仓库索引
helm repo update
# 查看可用的Cilium版本(可选)
helm search repo cilium/cilium --versions
以下是一个生产就绪的安装命令,它同时包含了kube-proxy替代和eBPF主机路由的配置参数。我们将在后续小节中详细解释每个参数的作用。
helm install cilium cilium/cilium \
--namespace kube-system \
--set kubeProxyReplacement=true \
--set k8sServiceHost=<API_SERVER_IP> \
--set k8sServicePort=6443 \
--set bpf.masquerade=true \
--set bpf.hostRouting=true \
--set ipam.mode=kubernetes \
--set ipv4.enabled=true \
--set ipv6.enabled=false \
--set autoDirectNodeRoutes=true \
--set socketLB.enabled=true \
--set nodePort.enabled=true \
--set externalIPs.enabled=true \
--set hostPort.enabled=true \
--set bandwidthManager.enabled=true \
--set l2announcements.enabled=false \
--set hubble.enabled=true \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true
k8sServiceHost和k8sServicePort必须指向Kubernetes API Server的稳定IP和端口。如果API Server通过负载均衡器暴露,请使用其VIP。错误的配置将导致Cilium Agent无法连接到API Server。
4.2 配置kube-proxy替代
Cilium的kube-proxy替代(kube-proxy replacement)是其核心优势之一。它使用eBPF直接在内核中实现Service负载均衡,完全绕过kube-proxy的iptables模式或IPVS模式,从而获得更高的性能和更低的延迟。
启用kube-proxy替代后,Cilium会接管以下Service功能:
| 功能 | 说明 | 性能优势 |
|---|---|---|
| ClusterIP | 集群内部Service访问 | O(1) 查找,无iptables规则链遍历 |
| NodePort | 节点端口暴露Service | DSR模式,减少额外网络跳数 |
| LoadBalancer | 外部负载均衡器集成 | 直接eBPF转发,无需kube-proxy干预 |
| ExternalIPs | 外部IP映射到Service | 内核级NAT,性能接近原生 |
| HostPort | Pod直接监听主机端口 | eBPF绕过iptables,减少上下文切换 |
| Socket LB | 同一节点上Pod访问Service的本地优化 | 在socket层直接转发,避免回环网络 |
安装完成后,需要移除集群中现有的kube-proxy组件,避免功能冲突:
# 通过kubectl删除kube-proxy DaemonSet
kubectl -n kube-system delete daemonset kube-proxy
# 清理残留的kube-proxy iptables规则(可选,但推荐)
# 在所有节点上执行
iptables-save | grep -v KUBE | iptables-restore
cilium status | grep KubeProxyReplacement,如果输出 KubeProxyReplacement: True [eth0 ...],则表示替代成功。如果显示 Disabled,请检查 k8sServiceHost 配置是否正确。
4.3 启用eBPF主机路由
eBPF主机路由(eBPF Host Routing)是Cilium另一个关键性能特性。传统上,Pod的出站流量需要经过主机网络协议栈的多次处理(如netfilter、路由表查找)。启用eBPF主机路由后,Cilium会在网络数据包到达主机网卡时,直接通过eBPF程序将其路由到正确的Pod veth对端,完全绕过主机协议栈的冗长路径。
下图展示了启用eBPF主机路由前后的数据路径对比:
启用eBPF主机路由后,Cilium会接管节点的路由表。这意味着传统的route命令看到的条目会发生变化,所有Pod子网的路由将由Cilium通过eBPF程序动态管理。
cilium status | grep HostRouting 确认当前模式。
4.4 验证安装状态
安装完成后,必须进行全面的状态验证,确保所有组件正常运行,核心功能已启用。以下是推荐的验证步骤:
- 检查Cilium Pod状态
# 确认所有Cilium Agent Pod和Operator Pod处于Running状态
kubectl -n kube-system get pods -l k8s-app=cilium
kubectl -n kube-system get pods -l k8s-app=cilium-operator
- 使用cilium CLI检查整体状态
# 选择一个Cilium Agent Pod,执行status命令
CILIUM_POD=$(kubectl -n kube-system get pods -l k8s-app=cilium -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system exec $CILIUM_POD -- cilium status
# 重点关注以下输出字段:
# - KubeProxyReplacement: True
# - Host Routing: eBPF
# - Bandwidth Manager: Enabled
# - Hubble: Enabled
- 验证Service连通性
# 创建一个测试Pod并访问kubernetes Service
kubectl run test-pod --image=busybox --rm -it --restart=Never -- sh -c 'wget -qO- http://kubernetes.default.svc.cluster.local'
# 预期输出:返回API Server的JSON响应
- 检查eBPF程序是否加载
# 在任意节点上检查Cilium加载的eBPF程序
bpftool prog list | grep cilium
# 预期输出:显示多个cilium_开头的eBPF程序,如cilium_from_netdev、cilium_to_netdev等
- 验证Hubble组件
# 检查Hubble UI是否可访问
kubectl -n kube-system get svc hubble-ui
# 通过port-forward访问Hubble UI(可选)
kubectl -n kube-system port-forward svc/hubble-ui 12000:80
# 浏览器访问 http://localhost:12000
以下表格总结了验证项与预期结果:
| 验证项 | 命令 | 预期结果 |
|---|---|---|
| Agent Pod状态 | kubectl get pods -n kube-system -l k8s-app=cilium |
所有Pod状态为 Running,就绪数等于节点数 |
| kube-proxy替代 | cilium status | grep KubeProxyReplacement |
True,并列出使用的网络接口 |
| eBPF主机路由 | cilium status | grep HostRouting |
eBPF(内核v5.10+)或 Legacy(低版本内核) |
| Service连通性 | kubectl run test-pod --image=busybox --rm -it -- sh -c 'wget -qO- http://kubernetes.default' |
返回API Server的HTTP响应,无超时或拒绝连接 |
| eBPF程序加载 | bpftool prog list | grep cilium |
显示多个 cilium_ 开头的eBPF程序 |
| Hubble状态 | cilium status | grep Hubble |
Enabled,且Relay和UI均处于健康状态 |
helm get values cilium -n kube-system 导出当前配置,并保存为YAML文件。后续的升级或配置变更应基于此基线进行。