Cilium 概念、组件与 Calico 对比
结论先行:Calico 与 Cilium 的流程骨架一样(建 veth 配 IP、跨节点隧道/路由、Service 做 DNAT、策略放行),真正的分叉在数据面落点——Calico 写内核路由表 + iptables,Cilium 写 eBPF 程序 + BPF map;Cilium 还顺带把 kube-proxy 的活一起接了。
环境:192.168.60.128(单节点 master,Ubuntu 26.04,k8s v1.35.4,docker 29.7.2 + cri-dockerd)。下文标注「已验证」的结论来自该机器上的实测输出。
1. 三条要点
- Cilium 替代了 Calico:接管 Pod IP 分配、路由、网络策略
- Cilium 替代了 kube-proxy:接管 Service 负载均衡(ClusterIP / NodePort 的 DNAT)
- eBPF 是 Cilium 的数据面实现;
cilium-agent用bpf()把 eBPF 程序挂到内核钩子点上,之后每个包到钩子,内核自动执行
2. Cilium 组件与分层
2.1 组件清单(已验证)
ds/cilium-agent— 通过 CNI 给 Pod 配网、建 endpoint、加载/挂 eBPF 程序、写 BPF map、本节点 IPAM、策略下发、本地可观测cilium-cni— 由容器运行时(cri-dockerd)调用,真正「给 Pod 配网」的入口,把请求转给 cilium-agentdeployment/cilium-operator— cluster-pool 模式下的 IPAM 池切分(给节点分 /24)、Pod IP 池管理、CRD/资源垃圾回收、Service 的 LB IP 分配(LB-IPAM)、kvstore 相关cilium-envoy— L7 代理,做 L7 网络策略(按 HTTP 方法/路径)、Ingress/Gateway、以及部分 Service 代理deployment/hubble-relay/hubble-ui— 把各节点 agent 采集的 flow 汇总并提供 API / Web 界面
2.2 功能分层
| 层 | 组件 | 干什么 |
|---|---|---|
| 数据面 Datapath | eBPF 程序 | 真正转包:路由/DNAT/SNAT/策略/负载均衡(不是进程,是内核程序) |
| CNI/IPAM | cilium-cni + agent + operator | 给 Pod 分配 IP、配 veth/路由 |
| 网络服务 | agent(+envoy) | Service 负载均衡(取代 kube-proxy)、NodePort |
| 安全 | agent + envoy | 身份(identity)、L3/L4/L7 策略 |
| 可观测 | agent(hubble) + relay + ui | 看 flow、依赖图 |
| 控制面 | agent + operator | 监听 K8s API、算状态、写 BPF map |
3. Cilium 怎么给 Pod 配网(流程)
- operator 分网段:
cluster-pool模式下,operator 从10.244.0.0/16给每个节点切一个/24,写进CiliumNodeCRD(spec.ipam.podCIDRs)。 - 建 Pod 时:kubelet → 容器运行时(cri-dockerd)→ 读
/etc/cni/net.d/05-cilium.conflist→ 调cilium-cni插件(带上 Pod 的 netns 路径和信息)。 - cilium-cni → cilium-agent:插件不自己干活,把请求转给 agent。
- agent 干活:
- 从本节点
/24里分一个具体 IP(IPAM) - 建 veth pair:一头进 Pod netns(eth0),一头在宿主(
lxcXXXX) - 配 Pod 内的 IP 和默认路由
- 注册 endpoint(写
CiliumEndpoint+/var/run/cilium/state/<id>/) - 在 veth 上挂 eBPF 程序
cil_from_container,把 endpoint 写进 BPF map(cilium_lxc、ipcache)
- 从本节点
- 返回 IP/路由给运行时 → Pod 网络就绪。
3.1 网段来源与「和 controller 冲突吗」(已验证)
单节点实测:
text
Node master .spec.podCIDR = 10.244.0.0/24
CiliumNode .spec.ipam.podCIDRs = ["10.244.0.0/24"]
cilium-config: ipam = cluster-poolkube-controller-manager 相关参数:
text
--allocate-node-cidrs=true
--cluster-cidr=10.244.0.0/16
--node-cidr-mask-size-ipv4=24
--service-cluster-ip-range=10.96.0.0/12结论:不冲突。KCM 与 Cilium 的网段(10.244.0.0/16)和掩码(/24)一致,两边切出来的都是 10.244.0.0/24。cluster-pool 模式下 Cilium 不读 KCM 分配的 podCIDR,以 CiliumNode 为准;KCM 那份只是被忽略的冗余副本。真正要避免的是两边网段/掩码不一致——多节点时会让 Node.spec.podCIDR 与 CiliumNode 指向不同的 /24。
4. Cilium vs Calico 逐流程对比
一句话区别:Calico = 内核路由表 + iptables 驱动;Cilium = eBPF 程序 + BPF map 驱动。控制面两者都在「监听 K8s API → 算状态」,区别只在把状态落到哪里。
4.1 Pod 建网
| 环节 | Calico | Cilium |
|---|---|---|
| 运行时调用 | 10-calico.conflist → calico + calico-ipam | 05-cilium.conflist → cilium-cni |
| 谁分配 IP | calico-ipam(IPPool 172.16.0.0/16) | cilium-agent(CiliumNode 10.244.0.0/24) |
| 关键落点 | 宿主路由表 + iptables(felix 写) | eBPF 挂 veth + 写 BPF map |
4.2 Pod→Pod
| 场景 | Calico | Cilium |
|---|---|---|
| 同节点 | 走宿主路由(cali* 接口) | eBPF 在 veth 上直接转发 |
| 跨节点 | IPIP 封装(tunl0)或 BGP native | VXLAN 封装(cilium_vxlan)或 native |
4.3 Pod→Service(最大区别)
| Calico(传统) | Cilium | |
|---|---|---|
| 谁做 DNAT | kube-proxy 写 iptables | eBPF 查 BPF LB map |
| 路径 | 穿过 netfilter 逐条匹配 KUBE-SVC/KUBE-SEP | 钩子上直接查表改写,绕过 netfilter |
4.4 策略
| Calico | Cilium | |
|---|---|---|
| 编译到 | iptables(cali-* 链),eBPF 可选 | BPF map |
| L7 策略 | 需额外组件 | 内建(Envoy) |
4.5 可观测
| Calico | 无内置 flow |
| Cilium | Hubble 内建 |
4.6 一个包的旅程
- Calico:Pod eth0 → lxc → 宿主 netfilter → 链式匹配 KUBE-SVC/KUBE-SEP → DNAT → 路由 → 目标 Pod
- Cilium:Pod eth0 → lxc veth 上
cil_from_container(eBPF)→ 查 BPF LB map → 改写目的 → 直接送目标 Pod veth
5. Calico vs Cilium 优缺点
共同点:都是成熟 CNI,都支持 NetworkPolicy、隧道与 BGP。
5.1 逐维度对比
| 维度 | Calico | Cilium |
|---|---|---|
| 数据面 | iptables / IPVS(默认),eBPF 可选 | eBPF-first |
| 性能 | 规则多了线性退化 | O(1) 查表,规则多也不退化 |
| Service | 依赖 kube-proxy | 可取代 kube-proxy |
| 可观测 | 弱(需外挂) | Hubble 内建 |
| L7 策略 | 需额外组件 | 内建 Envoy |
| 内核要求 | 低(老内核也行) | 高(≥5.10,部分功能更高) |
| 成熟度 | 很高,生产验证多,云厂商广泛支持 | 高且活跃,云原生前沿 |
| 学习 / 排障 | 简单(iptables 直观) | 陡(eBPF 概念多,排障手法新) |
| 运行时兼容 | 广(含 Windows) | 主测 containerd / CRI-O;docker + cri-dockerd 属边缘 |
5.2 Calico
- 优点:成熟稳定、生态广、内核要求低、BGP 与物理网络集成强、支持 Windows、iptables 直观好排障
- 缺点:默认 iptables 性能随规则退化、Service 靠 kube-proxy、可观测弱、L7 弱
5.3 Cilium
- 优点:eBPF 高性能、取代 kube-proxy、Hubble 可观测、L7 策略内建、基于 identity 的安全强、功能前沿(Gateway API / ambient / BGP)
- 缺点:内核要求高、学习与排障陡、组件多、对运行时挑剔(docker + cri-dockerd 属边缘)、排障工具链新
6. 怎么选
- 选 Calico:传统数据中心、需 BGP 对接物理网、内核较老、要 Windows、团队熟 iptables
- 选 Cilium:追求性能与可观测、要 L7 安全、内核较新、想省掉 kube-proxy、走云原生前沿