跳转到内容

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-agent
  • deployment/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 功能分层 ​

层组件干什么
数据面 DatapatheBPF 程序真正转包:路由/DNAT/SNAT/策略/负载均衡(不是进程,是内核程序)
CNI/IPAMcilium-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 配网(流程) ​

  1. operator 分网段:cluster-pool 模式下,operator 从 10.244.0.0/16 给每个节点切一个 /24,写进 CiliumNode CRD(spec.ipam.podCIDRs)。
  2. 建 Pod 时:kubelet → 容器运行时(cri-dockerd)→ 读 /etc/cni/net.d/05-cilium.conflist → 调 cilium-cni 插件(带上 Pod 的 netns 路径和信息)。
  3. cilium-cni → cilium-agent:插件不自己干活,把请求转给 agent。
  4. 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)
  5. 返回 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-pool

kube-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 建网 ​

环节CalicoCilium
运行时调用10-calico.conflist → calico + calico-ipam05-cilium.conflist → cilium-cni
谁分配 IPcalico-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 ​

场景CalicoCilium
同节点走宿主路由(cali* 接口)eBPF 在 veth 上直接转发
跨节点IPIP 封装(tunl0)或 BGP nativeVXLAN 封装(cilium_vxlan)或 native

4.3 Pod→Service(最大区别) ​

Calico(传统)Cilium
谁做 DNATkube-proxy 写 iptableseBPF 查 BPF LB map
路径穿过 netfilter 逐条匹配 KUBE-SVC/KUBE-SEP钩子上直接查表改写,绕过 netfilter

4.4 策略 ​

CalicoCilium
编译到iptables(cali-* 链),eBPF 可选BPF map
L7 策略需额外组件内建(Envoy)

4.5 可观测 ​

Calico无内置 flow
CiliumHubble 内建

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 逐维度对比 ​

维度CalicoCilium
数据面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、走云原生前沿

参考 ​

基于 MIT 许可发布