2. Cilium 安装与部署:使用 Helm 在 K8s 集群中安装 Cilium、配置 CNI、验证部署状态
在生产环境中,Cilium 的安装推荐使用 Helm 进行声明式管理。Helm 提供了参数化配置、版本回滚和依赖管理能力,能够精确控制 Cilium 的 CNI 模式、内核兼容性、eBPF 挂载点以及安全策略引擎的启停。本节将演示从 Helm 仓库添加、Values 定制到部署验证的完整流程。
2.1 环境准备与 Helm 仓库配置
在安装 Cilium 之前,需要确保 Kubernetes 集群满足以下最低版本要求,并正确配置 Helm 客户端。
| 组件 | 最低版本 | 推荐版本 |
|---|---|---|
| Kubernetes | v1.21 | v1.27+ |
| Helm | v3.8 | v3.12+ |
| Linux Kernel | 4.19 | 5.10+ (支持完整 eBPF 特性) |
| 容器运行时 | containerd 1.5 / CRI-O 1.22 | containerd 1.7+ |
uname -r 确认内核版本。若内核低于 5.10,Cilium 的 Bandwidth Manager、BBR 拥塞控制及 WireGuard 透明加密将不可用。建议在节点上启用 CONFIG_DEBUG_INFO_BTF=y 以获取最佳 eBPF 兼容性。
执行以下命令添加 Cilium 官方 Helm 仓库并更新索引:
helm repo add cilium https://helm.cilium.io/
helm repo update
2.2 使用 Helm 安装 Cilium(生产级配置)
以下安装命令启用了 Cilium 的核心功能:eBPF 数据面、Hubble 可观测性、ClusterMesh 以及 L7 网络策略。请根据实际集群环境调整 --set 参数。
helm install cilium cilium/cilium \
--namespace kube-system \
--set cluster.name="production-cluster" \
--set cluster.id=1 \
--set ipam.mode=kubernetes \
--set kubeProxyReplacement=strict \
--set securityContext.capabilities=CAP_NET_RAW,CAP_NET_ADMIN \
--set cgroup.autoMount.enabled=true \
--set cgroup.hostRoot=/sys/fs/cgroup \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true \
--set hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution}" \
--set l7Proxy=true \
--set encryption.type=wireguard
kubeProxyReplacement=strict:完全替换 kube-proxy,要求内核支持 eBPF。若集群存在NodePort冲突,可降级为probe或disabled。encryption.type=wireguard:启用节点间 WireGuard 透明加密。需内核支持 WireGuard 模块。ipam.mode=kubernetes:使用 Kubernetes 原生的 PodCIDR 分配,避免与现有 CNI 冲突。
2.3 验证 Cilium 部署状态
安装完成后,通过以下三个维度验证 Cilium 是否正常运行:Pod 状态、CNI 配置、eBPF 程序挂载。
2.3.1 检查 DaemonSet 与 Pod 状态
kubectl -n kube-system get pods -l k8s-app=cilium
kubectl -n kube-system get daemonset cilium
预期输出:所有节点的 cilium-xxxxx Pod 均为 Running 状态,且 READY 列为 1/1。
2.3.2 验证 CNI 配置是否生效
检查每个节点上的 CNI 配置文件:
kubectl -n kube-system exec -it ds/cilium -- cilium status
kubectl -n kube-system exec -it ds/cilium -- cilium-health status
在 cilium status 输出中,重点关注以下字段:
| 状态字段 | 期望值 | 异常排查方向 |
|---|---|---|
| KVStore | etcd (OK) | 检查 etcd 连接或 etcd-operator 状态 |
| Kubernetes | OK | 确认 kubeconfig 权限与 API Server 可达性 |
| KubeProxyReplacement | Strict | 内核 eBPF 特性缺失时降级为 Probe |
| CNI Chaining | none | 若显示其他 CNI,检查是否配置了 chaining 模式 |
| NodeAddress | 正确内网 IP | 确认节点网络接口与路由表 |
2.3.3 验证 eBPF 程序与 Hubble 可观测性
通过 Hubble UI 验证流量可视化是否正常:
kubectl -n kube-system port-forward svc/hubble-ui 12000:80
# 浏览器访问 http://localhost:12000
同时,在任意节点上检查 eBPF 程序是否挂载:
kubectl -n kube-system exec -it ds/cilium -- bpftool prog list | grep cilium
预期输出应包含 cilium_calls_、cilium_from_container、cilium_to_container 等 eBPF 程序。
- ✅ 所有 Cilium Pod 处于 Running 状态
- ✅
cilium status显示 Kubernetes 与 KVStore 均为 OK - ✅
cilium-health status显示节点间连通性正常 - ✅ Hubble UI 可正常访问并展示集群流量拓扑
- ✅ 创建测试 Pod 后,Cilium 自动分配 Endpoint 并应用网络策略
2.4 Cilium 部署架构与组件交互
下图展示了 Cilium 在 Kubernetes 集群中的核心组件部署架构,包括 Cilium Agent(DaemonSet)、Cilium Operator(Deployment)、Hubble Relay 以及 KVStore 之间的数据流与控制流关系。
2.5 常见安装问题与排错
在实际部署中,以下三类问题出现频率最高。请对照排查:
| 问题现象 | 根因 | 解决方案 |
|---|---|---|
| Cilium Agent CrashLoopBackOff | eBPF 文件系统未挂载或权限不足 | 检查 /sys/fs/bpf 是否挂载;添加 --set cgroup.autoMount.enabled=true |
| cilium status 显示 KVStore 异常 | etcd 集群不可达或 TLS 证书错误 | 确认 etcd 服务地址;检查 --set etcd.ssl=true 及证书 Secret |
| Pod 网络不通或策略不生效 | CNI 配置未正确写入或 kube-proxy 残留 | 检查 /etc/cni/net.d/ 下是否存在 05-cilium.conf;确认 kube-proxy 已移除或禁用 |
| Hubble UI 无数据 | Hubble Relay 未启动或 metrics 未启用 | 确认 hubble.relay.enabled=true;检查 hubble.metrics.enabled 配置 |
kubectl -n kube-system logs -l k8s-app=cilium --tail=50 查看 Agent 日志;使用 cilium sysdump 一键收集全集群诊断信息。
2.6 升级与回滚策略
当需要升级 Cilium 版本时,建议遵循以下步骤:
- 备份当前 Values:
helm get values cilium -n kube-system > cilium-values-backup.yaml - 更新 Helm 仓库:
helm repo update - 执行升级:
helm upgrade cilium cilium/cilium -n kube-system -f cilium-values-backup.yaml --version <新版本> - 验证升级: 重复 2.3 节的验证步骤,确认所有 Agent 滚动更新完成。
- 回滚(如需):
helm rollback cilium -n kube-system 1(回滚至上一个版本)
- 升级期间,现有连接不会中断,但新 Pod 调度可能短暂延迟。
- 跨大版本升级(如 v1.12 → v1.14)时,请先查阅官方升级指南,确认 API 变更。
- 若启用了
encryption.type=wireguard,升级后需重启所有节点上的 WireGuard 接口。