2. Cilium 安装与部署:使用 Helm 部署 Cilium、配置 kube-proxy 替代模式、验证 Cilium Agent 状态

在生产环境中部署 Cilium 时,Helm 是官方推荐的标准方式。它提供了声明式的配置管理、版本回滚和参数化安装能力。本章将引导你完成从 Helm 仓库配置到 Agent 状态验证的完整流程,并重点讲解 kube-proxy 替代模式——这是 Cilium 实现高性能网络的关键特性。

2.1 环境准备与 Helm 仓库配置

在安装 Cilium 之前,请确保你的 Kubernetes 集群满足以下最低要求:

组件 版本要求 说明
Kubernetes ≥ 1.20 推荐 1.26+ 以获得完整 eBPF 特性
Linux 内核 ≥ 5.10 支持 eBPF 核心功能;推荐 5.15+
Helm ≥ 3.8 支持 OCI 仓库和 Values 合并
kubelet --network-plugin=cni 必须启用 CNI 支持

添加 Cilium 官方 Helm 仓库并更新索引:

helm repo add cilium https://helm.cilium.io/
helm repo update
💡 生产建议: 使用固定版本号而非 latest。例如 helm install cilium cilium/cilium --version 1.15.5,确保可重复部署。

2.2 使用 Helm 部署 Cilium(含 kube-proxy 替代模式)

kube-proxy 替代模式(kubeProxyReplacement)是 Cilium 的核心优势之一。它通过 eBPF 直接在内核层面处理 Service 负载均衡,完全绕过 iptables,显著降低延迟并提升吞吐量。以下部署命令同时启用了该模式:

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set kubeProxyReplacement=true \
  --set k8sServiceHost=192.168.1.100 \
  --set k8sServicePort=6443 \
  --set cluster.name=production-cluster \
  --set cluster.id=1 \
  --set ipam.mode=kubernetes \
  --set ipv4NativeRoutingCIDR=10.0.0.0/16 \
  --set hubble.relay.enabled=true \
  --set hubble.ui.enabled=true
参数 值 作用
kubeProxyReplacement true 完全替代 kube-proxy,使用 eBPF 处理 Service
k8sServiceHost/Port API Server 地址 Cilium Agent 连接 API Server 的端点
ipam.mode kubernetes 使用 Kubernetes Node CIDR 分配 Pod IP
ipv4NativeRoutingCIDR 集群 Pod CIDR 启用原生路由,避免隧道封装开销
hubble.relay/ui true 开启 Hubble 可观测性组件
⚠️ 关键检查点: 启用 kubeProxyReplacement=true 后,必须确保集群中不再运行 kube-proxy DaemonSet。如果 kube-proxy 仍在运行,Cilium 会检测到冲突并进入 strict 模式,拒绝启动。请提前执行 kubectl -n kube-system delete ds kube-proxy。

2.3 验证 Cilium Agent 状态

部署完成后,通过以下步骤验证 Cilium 是否正常运行:

  1. 检查 Pod 状态: 确认所有 cilium-agent Pod 处于 Running 状态。
  2. 检查 kube-proxy 替代状态: 使用 cilium status 命令确认替代模式生效。
  3. 检查 eBPF 程序挂载: 验证 eBPF 程序已正确加载到内核。
  4. 检查 Hubble 组件: 确认 Hubble Relay 和 UI 已就绪。
# 1. 检查 Pod 状态
kubectl -n kube-system get pods -l k8s-app=cilium

# 2. 进入任意 cilium-agent Pod 执行状态检查
kubectl -n kube-system exec -it ds/cilium -- cilium status

# 3. 检查 kube-proxy 替代模式是否生效
kubectl -n kube-system exec -it ds/cilium -- cilium status | grep -i "kube-proxy"

# 4. 检查 eBPF 程序
kubectl -n kube-system exec -it ds/cilium -- bpftool prog list | head -20

# 5. 检查 Hubble 组件
kubectl -n kube-system get pods -l k8s-app=hubble-relay
kubectl -n kube-system get pods -l k8s-app=hubble-ui

以下 SVG 展示了 Cilium Agent 启动后的核心组件关系与数据流:

Cilium Agent 核心组件与数据流 Kubernetes API Server Cilium Agent (DaemonSet) eBPF 子系统 (内核) Watch / CRD bpf() syscall Node Manager Service Sync Policy Enf. Identity TC BPF XDP BPF CGroup BPF L7 Proxy 加载 BPF 程序 / Map Pod A (10.0.1.2) Pod B (10.0.2.3) 出站 veth BPF 入站 🔍 关键验证点 • kube-proxy 替代模式:cilium status 输出应显示 "KubeProxyReplacement: Strict" • eBPF 程序:bpftool prog list 应包含 cilium_ 开头的 TC/XDP/CGroup 程序 • Hubble 状态:hubble status 应显示 Relay 和 UI 均为 Healthy

2.4 验证 kube-proxy 替代模式是否生效

执行以下命令确认 Cilium 已完全接管 Service 处理:

# 查看 kube-proxy 替代模式状态
kubectl -n kube-system exec -it ds/cilium -- cilium status | grep -A5 "KubeProxyReplacement"

# 预期输出示例:
# KubeProxyReplacement:   Strict   [eth0, eth1]
# Status:                 OK
# Devices:                eth0 (192.168.1.100), eth1 (10.0.0.1)
# Mode:                   SNAT
# Backend Selection:      Random

# 验证 iptables 规则是否被清理(应无 KUBE-SVC 链)
iptables -t nat -L KUBE-SERVICES 2>/dev/null || echo "KUBE-SERVICES 链不存在,kube-proxy 已移除"
✅ 成功标志: 当 KubeProxyReplacement 显示为 Strict 或 Partial,且 Status 为 OK 时,说明 Cilium 已成功替代 kube-proxy。Strict 表示完全替代,Partial 表示部分替代(例如仍保留 NodePort 的 iptables 规则)。

2.5 常见安装故障与排查

故障现象 可能原因 排查命令 / 解决方案
cilium-agent Pod 处于 CrashLoopBackOff 内核版本过低或缺少 eBPF 支持 uname -r 检查内核;cilium sysdump 收集日志
cilium status 显示 "KubeProxyReplacement: Probe" kube-proxy 仍在运行,Cilium 无法进入 Strict 模式 kubectl -n kube-system delete ds kube-proxy 后重启 Cilium
Pod 无法分配 IP 地址 ipam.mode 配置错误或 Node CIDR 冲突 检查 kubectl describe node 的 PodCIDR;确认 ipv4NativeRoutingCIDR 正确
Hubble UI 无法访问 Hubble Relay 未就绪或端口转发未配置 kubectl -n kube-system port-forward svc/hubble-ui 12000:80

2.6 验证 Cilium Agent 健康状态

使用 cilium status 的详细输出进行逐项检查:

kubectl -n kube-system exec -it ds/cilium -- cilium status --verbose

# 重点关注以下字段:
# - Cilium:         OK
# - NodeMonitor:    Listening for events on 8 CPUs with 64x4096 shared memory
# - CiliumHealth:   OK
# - Hubble:         OK
# - KubeProxyReplacement: Strict
# - Encryption:     Disabled (可选项)
# - Cluster health: 3/3 reachable (所有节点健康)

如果所有字段均为 OK,说明 Cilium 已成功部署并正常运行。此时可以创建测试 Pod 验证网络连通性:

kubectl run test-pod --image=busybox -- sleep 3600
kubectl exec -it test-pod -- ping -c 3 10.0.2.3  # 替换为另一个 Pod 的 IP