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 是否正常运行:
- 检查 Pod 状态: 确认所有 cilium-agent Pod 处于
Running状态。 - 检查 kube-proxy 替代状态: 使用
cilium status命令确认替代模式生效。 - 检查 eBPF 程序挂载: 验证 eBPF 程序已正确加载到内核。
- 检查 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 启动后的核心组件关系与数据流:
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