1. 课程导入与全景认知

在传统数据中心里,网络通常由交换机、路由器和专用防火墙承担转发与安全职责,主机上的 iptables 只是做一层补充。进入 Kubernetes 时代后,Pod 数量动辄成百上千,IP 地址频繁变化,Service、Ingress、NetworkPolicy 等抽象层不断叠加,传统基于 iptables 的 kube-proxy 模式在规则规模膨胀后会出现明显的性能衰减和排障困难。Cilium 正是为解决这一类问题而生的云原生网络、安全与可观测性方案,它的技术底座是 Linux 内核中的 eBPF。

理解 Cilium,首先要理解 eBPF 的定位。eBPF 允许把经过验证的字节码程序动态挂载到内核的钩子点上,例如网卡收包(XDP)、流量控制(tc)、套接字(socket)、cgroup 以及内核跟踪点(kprobe/tracepoint)。这些程序运行在内核态,无需修改内核源码、无需加载内核模块,就能对数据包、系统调用和网络事件进行拦截、改写、统计和转发。Cilium 把网络转发、负载均衡、策略执行、可观测性等能力都实现在 eBPF 程序里,因此它不再依赖庞大的 iptables 规则链,而是用哈希表、LPM trie 等数据结构做 O(1) 或 O(log n) 级别的查找。

核心认知:Cilium 不是“又一个 CNI 插件”,而是以 eBPF 为数据面、以身份(Identity)为策略语义、以 Hubble 为可观测性入口的云原生网络平台。CNI 只是它最基础的一层能力。

从整体架构看,Cilium 由几个关键部分组成。每个节点上运行一个 Cilium Agent(以 DaemonSet 形式部署),它负责监听 Kubernetes API、分配 Pod IP、生成并加载 eBPF 程序、维护 eBPF map。数据面由挂载在内核各钩子点的 eBPF 程序组成,负责实际的转发、NAT、策略判断和监控。Cilium Operator 负责集群级别的地址管理、CRD 协调等任务。Hubble 则从 eBPF 数据面直接采集流日志、服务依赖和策略判定结果,提供网络可观测性。下图展示了这一分层关系与数据流方向。

Cilium 分层架构与数据流 控制面 / 编排层 Kubernetes API Cilium Operator CRD / Identity Hubble Relay / UI 节点(每台 Worker / Control Plane) Cilium Agent 监听 API / 分配 IP 生成 eBPF 程序 维护 eBPF map 策略编译与下发 健康检查 / 状态上报 eBPF 数据面(内核态) XDP 收包 tc 转发 / NAT Socket LB 策略执行 连接跟踪 流日志采集 下发 工作负载 Pod A Pod B Pod C 外部客户端 流量

这张图说明了 Cilium 的关键分工:Agent 是控制面的“翻译官”,把 Kubernetes 的声明式对象翻译成 eBPF 程序和 map 条目;eBPF 数据面是真正的执行者,负责每个数据包的命运;Hubble 从数据面旁路采集信息,形成可观测性。理解这条链路,后续学习 NetworkPolicy、ClusterMesh、BGP、服务网格等能力时就不会迷失方向。

Cilium 的核心价值可以归纳为四点。第一,性能与规模:用 eBPF map 替代线性匹配的 iptables 规则,在数万 Service 规模下仍能保持稳定转发延迟。第二,身份化安全:Cilium 为每组 Pod 分配安全身份(Identity),策略基于身份而非 IP,Pod 重建后 IP 变化不影响策略语义。第三,深度可观测性:Hubble 能直接给出“哪个 Pod 访问哪个服务、被哪条策略允许或拒绝”的流级视图,排障效率远高于抓包加猜。第四,可扩展性:通过 eBPF 钩子可以叠加 L7 策略、加密(WireGuard/IPsec)、带宽管理、BGP 通告等能力,而无需更换数据面。

学习路径建议按“先跑通、再理解、后深入”推进。第一阶段完成环境搭建,让一个最小集群跑起来并观察 Pod 互通;第二阶段理解 eBPF 数据面与 Cilium 的映射关系,掌握 Identity、Endpoint、Policy 等核心对象;第三阶段进入 NetworkPolicy、L7 策略、Hubble 可观测性;第四阶段扩展到 ClusterMesh、BGP、服务网格、性能调优与故障排查。每一阶段都应以“能观察到的现象”为验收标准,而不是只记住概念。

实验环境搭建是本章最需要动手的部分。推荐两种方式:一是本地用 kind 或 minikube 快速起一个单节点集群,适合验证基础功能;二是用多节点虚拟机或云主机搭建三节点集群,便于观察跨节点转发和 ClusterMesh。下面给出一个基于 kind 的最小可用示例,注意这些参数属于教学示例,实际环境需按机器配置调整。

# 1. 安装 kind 与 kubectl(示例版本,按官方文档选择最新稳定版)
# 2. 创建集群,禁用默认 CNI,交给 Cilium 接管
cat <<'EOF' > kind-cilium.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  disableDefaultCNI: true
  podSubnet: "10.244.0.0/16"
nodes:
  - role: control-plane
  - role: worker
  - role: worker
EOF

kind create cluster --config kind-cilium.yaml --name cilium-lab

# 3. 安装 Cilium CLI 并部署
cilium install --version 1.16.0
cilium status --wait

# 4. 验证连通性与 Hubble
cilium connectivity test
cilium hubble enable --ui

部署完成后,判断环境是否健康的依据有几条:cilium status 应显示 Cilium、Operator、Hubble 均为 OK;kubectl get pods -n kube-system 中 cilium-agent 在每个节点都处于 Running;cilium connectivity test 全部用例通过;cilium hubble ui 能打开并看到流记录。如果 agent 反复重启,优先检查内核版本(建议 5.10 以上)、是否禁用了默认 CNI、以及节点是否可拉取镜像。

建议在实验前记录内核版本(uname -r)和 Cilium 版本,后续遇到行为差异时,这两个信息往往是定位问题的第一手依据。

最后需要建立一种正确的学习心态:Cilium 的能力大多发生在内核态,很多现象无法只靠 kubectl describe 看清。因此本课程会反复使用 cilium monitor、cilium endpoint list、hubble observe 等工具,把“看不见的内核行为”变成可读的事件流。只要坚持“部署—观察—验证—排障”的循环,就能逐步把 Cilium 从黑盒变成可控、可解释的网络平台。