4. Cilium安装与基础配置:使用Helm安装Cilium、配置kube-proxy替代、启用eBPF主机路由、验证安装状态

本章是Cilium网络调优实战的基石。我们将使用Helm在Kubernetes集群中部署Cilium,并完成三项核心基础配置:完全替代kube-proxy、启用eBPF主机路由以及验证安装状态。正确的安装与基础配置是后续多租户隔离策略和性能调优的前提。

前提条件:确保集群满足Cilium最低要求:Kubernetes v1.16+、Linux内核v4.19+(推荐v5.10+以支持完整eBPF功能)、基于x86_64或arm64架构的节点。本指南基于Kubernetes v1.28与Helm v3.12+。

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
验证kube-proxy替代状态:执行 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主机路由:数据路径对比 传统主机路由(无eBPF) 物理网卡 主机协议栈 ... 路径:网卡 → 协议栈 → netfilter → 路由 → veth 延迟高,CPU开销大,上下文切换频繁 eBPF主机路由 物理网卡 eBPF程序 Pod 路径:网卡 → eBPF程序 → Pod veth 延迟低,CPU开销小,无上下文切换 性能对比指标 • P99 延迟:传统 200μs → eBPF 30μs(降低85%) • CPU 开销:传统 100% → eBPF 30%(节省70%) • 吞吐量:传统 10Gbps → eBPF 40Gbps(提升4倍) • 连接数:传统 100K → eBPF 1M+(提升10倍)

启用eBPF主机路由后,Cilium会接管节点的路由表。这意味着传统的route命令看到的条目会发生变化,所有Pod子网的路由将由Cilium通过eBPF程序动态管理。

内核要求:eBPF主机路由需要Linux内核v5.10+。如果内核版本低于此要求,Cilium会自动回退到传统路由模式。可以通过 cilium status | grep HostRouting 确认当前模式。

4.4 验证安装状态

安装完成后,必须进行全面的状态验证,确保所有组件正常运行,核心功能已启用。以下是推荐的验证步骤:

  1. 检查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
  1. 使用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
  1. 验证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响应
  1. 检查eBPF程序是否加载
# 在任意节点上检查Cilium加载的eBPF程序
bpftool prog list | grep cilium

# 预期输出:显示多个cilium_开头的eBPF程序,如cilium_from_netdev、cilium_to_netdev等
  1. 验证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均处于健康状态
生产环境建议:在验证通过后,建议将Cilium的配置固化到版本控制系统中。使用 helm get values cilium -n kube-system 导出当前配置,并保存为YAML文件。后续的升级或配置变更应基于此基线进行。