土法炼钢 · 系统与基础设施

【Cilium / eBPF】数据面全景:五轴坐标系与 16 篇路线

文章导航

分类入口
kubernetesnetwork
标签入口
#cilium#ebpf#dataplane#identity#bpf-maps#kube-proxy#hubble#v1.20.0

目录

站内 Cilium 深度拆解 已讲清产品能力与 Identity 叙事;eBPF 内核实现 拆透 verifier / JIT / Map;Envoy 选型HAProxy 选型 终章把「只要 L3/L4 与身份」指到 eBPF。中间仍缺一层:一次东西向包如何经 endpoint / identity 与 BPF map,卡在 policy 还是 service / CT,kube-proxy 替代相对 iptables 差在哪,以及相对 Calico / sidecar / Ambient 何时不该上 Cilium。

本文只做三件事:钉缺口、定义后续 15 篇共用的五条坐标系,并给出阅读路线。难点不在「会不会 Helm 装 Cilium」,而在控制面意图与内核路径交界上的可核对字段——numeric Identity、TC/XDP/cgroup 挂载点、cilium_policy_v3_* / LB / CT map、Hubble flow 字段。

本篇在系列中的位置

篇目 核心内容
第 1 篇 · 数据面全景 缺口、五轴坐标系、16 篇路线
第 2 篇 · Endpoint 与 Identity 数字身份、标签选择、生命周期
系列目录 关键问题、阅读路径、全部价值点

版本锚定:Cilium v1.20.0docs.cilium.io/en/v1.20/;源码 tag v1.20.0)。嵌入 Envoy / Gateway API 随该发行说明;第三方组件升版须显式标注。无真实 Cilium 集群则不粘贴伪造 cilium status / Hubble flow 输出。


一、相对站内已有内容,缺口在哪

下表列出各已有系列的视角,以及本系列补的格子。规则是:不重写已有内容,只填真正空着的格子。

已有内容 视角 本系列补什么
k8s-network/13 Cilium 产品:Identity 叙事、kube-proxy 替代概览、Hubble、ClusterMesh 源码/文档级路径、失败模式、排障坐标系;不复述产品能力表
ebpf/ verifier、JIT、BTF、Map 内核实现 不重写 VM;只写 Cilium 如何挂载与使用这些原语
linux/ebpf-ciliumk8s-network/21 为何替代 iptables、hook 概览 生产路径与策略/Service 状态机
envoy/haproxy/istio-xds/ 用户态 L7/L4 代理内核 对照叶;不重写 Filter / xDS / HTX

结论:读者知道「Cilium 用 eBPF」、会读 Hubble UI 截图,但不知道包卡在 policy map 还是 service map、identity 漂移如何表现为「偶发拒绝」、何时用户态 Envoy 仍不可避免。本系列补「K8s eBPF 数据面内核」那一格。

与通识教程的差别也在这里:多数「在 K8s 上装 Cilium」文章停在连通性与 NetworkPolicy 示例;本系列追问 连通成功之后延迟/丢包仍落在哪一层,以及 policy deny、Service 黑洞、CT 满、identity 窗口各自如何表现。深度来自可证伪的阶段划分,而不是更长的功能清单。

本系列刻意不写 Helm values 百科、每个云厂商托管 CNI 黑盒教程、verifier 形式化算法全书、未实测跨方案延迟排行。若目标只是「把 Pod 通上」,官方 Quickstart 与 k8s-network/13 已够;若目标是「失败落在哪张 map / 哪个 hook、标签变更为何偶发拒绝」,则必须沿五轴下钻。

Envoy 16HAProxy 14 的排除树把「只要 L3/L4 与身份」指到 eBPF:那是选型叶。本系列把叶展开成可归因的内核路径——选型终章(第 16 篇)再把这片叶收回代理系列。


二、五条坐标系(后续章节回指)

后面每一篇都落到下面某一条轴上。本篇钉名字、关键锚点与失败表象;具体生命周期、源码与包停顿点在对应篇展开。排障口诀:先点名轴,再下钻模块——不要一上来改 NetworkPolicy YAML 或重装 DaemonSet。

Identity 轴

定义:Endpoint 如何由标签导出数字 Identity,以及标签变更时策略窗口如何出现。

可核对锚点 含义
Endpoint / Endpoint ID 节点内标识;共享同一 IP 的容器组(典型为 Pod)
Numeric Identity 集群范围数字 ID;策略在 BPF 里匹配的是它,不是临时 Pod IP
Security-relevant labels 参与身份哈希的标签前缀集合;见 第 2 篇
reserved:init / host / world 引导与外部流量的保留身份(文档 Terminology)

「偶发拒绝」且伴随滚动更新 / 标签补丁时,优先落本轴,而不是先怀疑物理网卡。IP 变了但标签不变时,Identity 应稳定——这是相对 IP 策略的核心收益(见 docs.cilium.io/en/v1.20/security/network/identity/)。

BPF 挂载轴

定义:Cilium 在 XDP / TC / cgroup socket 等 hook 上挂了什么程序,以及加载与原子替换的边界。

可核对锚点 含义
bpf_xdp.c / bpf_host.c / bpf_lxc.c / bpf_sock.c v1.20.0 源码入口;职责见 第 3 篇
TC ingress on lxc* / host device 东西向策略与重定向主路径
XDP on physical NIC NodePort / 预过滤等早路径(能力依赖驱动与内核)
cgroup connect / sendmsg / sockops socket 层 Service 转换与同节点加速

「节点上有程序但行为像旧版本」或「升级后短暂黑洞」优先查本轴的加载/替换,而不是先改策略 YAML。Verifier / JIT 算法外链 ebpf/,本系列只写挂载角色与生命周期

Map 状态轴

定义:policy / service / CT / ipcache 等 BPF map 各存什么,满表或陈旧条目如何表现为连通故障。

可核对锚点 含义
cilium_policy_v3_* 每 endpoint 的 identity+port+protocol 允许/拒绝;v1.20 前缀见 pkg/maps/policymap
cilium_lb{4,6}_services_v2 Service LB;默认上限与 sizing 见官方 Maps 文档
cilium_ct_* 连接跟踪;动态 sizing 与 NAT 比例约束
ipcache / endpoints map IP→Identity / 本地 endpoint 解析

「新建 Service 不生效」而节点 CPU 不高,优先怀疑 LB map 满或 reconcile 失败(Maps 文档明确:map full 时可能无法 reconcile Service)。「突发新建连接失败」优先怀疑 CT。内核 Map 类型与哈希实现外链 ebpf/;本系列写职责与失败表象第 4 篇)。

包路径轴

定义:Pod→Pod、egress、ingress 在官方 Life of a Packet 图上的停顿点,以及与 netfilter / kube-proxy 的旁路关系。

可核对锚点 含义
Endpoint Policy 对象 L3/L4 身份匹配与转发决策(Intro 文档)
Service 对象 ClusterIP/NodePort 等 LB 查找
Socket Layer Enforcement 同节点 ESTABLISHED 后的 socket 直通加速
iptables 互操作边界 能力不足时回退;与 kube-proxy 共存图见 iptables 文档

「同节点快、跨节点慢」不等于「网络坏了」——可能是加速路径未命中、overlay/加密税、或 CT/策略在跨节点路径上多了一跳。展开见 第 5 篇 与后续 kube-proxy 替代篇。

策略与观测轴

定义:NetworkPolicy / CiliumNetworkPolicy 如何编译进 map,以及 Hubble / metrics 字段对应哪一层。

可核对锚点 含义
Policy 编译产物 选择器 → Identity 集合 → map 条目(第 7 篇)
Hubble flow 字段 verdict、identity、drop reason 等与数据面层的对应(第 8、12–13 篇)
默认拒绝窗口 标签/策略变更期间可能出现的短暂 deny/allow
指标全绿仍丢包 采样、CT 超时、加密失败等不同轴叠加

「Hubble 显示 FORWARDED 但应用超时」不要只盯策略——可能落在 Service 后端空洞、加密、或用户态代理边界。本轴回答信号语义,不替代前四轴的机制钉死。


三、坐标系背后的三个不变量

相对「纯 iptables CNI」与「用户态 sidecar 网格」,Cilium eBPF 数据面同时钉住三条不变量:

  1. 策略匹配以 Identity 为键,不以临时 Pod IP 为键:相同安全相关标签共享同一数字身份;扩缩容不应迫使全集群重写 IP 规则(Identity-Based 文档)。代价是必须能解释身份分配延迟与标签变更窗口。
  2. 数据面状态主要在 BPF map,控制面只做 reconcile:人改的是 CR / NetworkPolicy;权威执行在 hook 上的程序与 map。代价是满表、陈旧条目与程序替换窗口会表现为「偶发」连通问题。
  3. 能在 hook 完成的 L3/L4 尽量不进 netfilter / 用户态:XDP/TC/cgroup 组成可编程网格;L7 仍可走可选 Envoy(Intro 中的 L7 Policy 对象)。代价是排障坐标与 iptables 时代不同——iptables -L 空不代表「没策略」。

排障时先问「哪条不变量被触碰」,再落到对应轴。例如:滚动更新后偶发拒绝 → 不变量 1;新建大量 Service 后部分 VIP 不通 → 不变量 2;仍去翻宿主机 iptables 找 ClusterIP → 可能误判了不变量 3 下的旁路路径。

这三条不变量也解释了系列边界:本系列不重写 verifier 证明义务(那是 eBPF VM 层),也不写完整 Istio Ambient 控制面(那是网格控制面层)。我们只在 Cilium 数据面里追问:给定这三条约束,v1.20.0 如何实现、何处失败、与论文/经典可编程数据面假设差在哪。


四、设计谱系:可编程数据面 → Identity → 生产分叉

McCanne & Jacobson, USENIX 1993(经典 BPF:过滤虚拟机)
  → 扩展 BPF / XDP(内核可编程路径;Høiland-Jørgensen et al., CoNEXT 2018)
  → Cilium:eBPF-first CNI + Identity-based policy(工程系统)
  → kube-proxy replacement、Hubble、可选 L7 Envoy、ClusterMesh
  → 仍争:完全旁路 netfilter vs 与 iptables 共存;IP 策略简单性 vs identity 一致性窗口
  1. 经典 BPF(McCanne & Jacobson, USENIX Winter 1993)定义「在内核里用受限虚拟机过滤包」的范式;今天的 eBPF 是能力与安全模型都大幅扩展后的后代,细节见站内 ebpf/
  2. XDP(Høiland-Jørgensen et al., CoNEXT 2018)把可编程点推到驱动最早路径,论证「在 OS 内核内做高速可编程」相对用户态绕路的假设与边界。Cilium 把 XDP 用作 NodePort/预过滤等早路径,而不是把所有策略都塞进 XDP。
  3. Cilium Identity-Based 安全docs.cilium.io/en/v1.20/security/network/identity/)把「标签 → 数字身份 → map 键」写成可扩展策略模型,显式对比 IP 过滤器在 churn 下的更新风暴。
  4. 生产分叉(v1.20.0):policy map 前缀迁到 cilium_policy_v3_ 以匹配 identity aggregation 语义变更(pkg/maps/policymap 注释);kube-proxy 替代、透明加密、Gateway API 等作为可选面叠在同一套 hook/map 之上。
维度 经典 / 早期 Cilium v1.20.0 默认叙事 开放分叉
策略键 IP / CIDR 列表 Numeric Identity 标签风暴下的分配延迟与窗口
数据面 netfilter 链 TC/XDP/cgroup + map 完全旁路 vs 能力回退到 iptables
Service kube-proxy iptables/IPVS BPF LB maps 与 kube-proxy 共存模式
L7 无 / 外部代理 可选 Envoy 重定向 何时被迫回 sidecar / Ambient

五、开放争论(先立靶,后各章拆)

争论 A 侧 B 侧 本系列落点
完全旁路 netfilter vs 共存 路径短、锁竞争少 内核能力矩阵迫使回退;运维熟悉 iptables 第 3、5、6、14 篇
IP 策略简单性 vs Identity 心智模型贴近传统防火墙 churn 下更新成本低、共享身份可扩展 第 2、7、13 篇
内核 L3/L4 vs 用户态 L7 延迟与跳数税低 HTTP 语义、重试预算、Filter 链仍要代理 第 10、14–16 篇;对照 envoy/haproxy
「必须 Cilium」营销 vs CNI 足够 统一身份/观测/LB Calico/iptables 在部分规模下够用 第 14–16 篇

不在第 1 篇宣布胜负;每组争论要求后续篇给出可核对机制或选型边界,而不是「看业务场景」空话。

对「内核路径 vs sidecar」额外钉一句:本系列不比较未实测的 P99 排行榜,只比较失败模式是否可归因到五轴中的某一层。若托管 CNI 把策略与 LB 藏在黑盒里,工程师就失去了 Identity / map / Hubble 字段这类抓手——这是架构选择,不是性能排名。


六、16 篇路线与阅读建议

flowchart TD
  overview["01 Overview"] --> id["02 Endpoint Identity"]
  id --> attach["03 BPF Attach"]
  attach --> maps["04 BPF Maps"]
  maps --> path["05 East West Path"]
  path --> kpr["06 Kube Proxy Replace"]
  id --> policy["07 Policy Compile"]
  path --> policy
  policy --> hubble["08 Hubble"]
  path --> enc["09 Encryption"]
  kpr --> mesh["10 L7 Mesh Boundary"]
  id --> cm["11 ClusterMesh"]
  hubble --> obs["12 Observability"]
  obs --> trouble["13 Troubleshoot"]
  trouble --> vs["14 vs Alternatives"]
  mesh --> gw["15 Gateway Boundary"]
  vs --> select["16 Selection"]
  gw --> select
  overview --> select
路径 篇目 适合
必读核心 1 → 2 → 5 → 6 → 7 → 13 快速建立坐标系
Map 与挂载 3 → 4 → 5 BPF 原语在 Cilium 中的用法
可观测 8 → 12 → 13 Hubble / 排障
对照选型 1 → 14 → 16 路径选型
完整通读 1 → … → 16 系统掌握

先修:熟悉 Pod/Service;可选 k8s-network/13ebpf/01;对照 envoy/16haproxy/14

阅读时建议随身带一张「轴 → 锚点」卡片:偶发拒绝先问 Identity;升级黑洞先问挂载替换;新建 VIP 不通先问 LB map;同节点与跨节点差异先问包路径;Hubble 与症状对不上先问观测轴。把现象翻译成轴,比翻译成「重启 cilium-agent」更接近本系列目标。

五个关键问题到第 1 篇结尾仍然够用:后续每一篇应能把问题收束到某一轴上的可核对锚点。若一篇写完仍只能回答「看场景」,说明证据或机制还不够,应按 WRITING_GUIDE 停写或缩范围——本系列对跨方案延迟排名正是如此处理的。


七、小结

  1. 定位:补 k8s-network/13 与 ebpf/ 之间的 Cilium 数据面内核层,不重写产品百科或 verifier 全书。
  2. 五轴:Identity / BPF 挂载 / Map 状态 / 包路径 / 策略与观测;每轴有可核对锚点。
  3. 三不变量:Identity 为键、map 为权威状态、L3/L4 尽量留在 hook。
  4. 谱系:经典 BPF → XDP → Cilium Identity → v1.20.0 生产分叉。
  5. 路线:核心「1→2→5→6→7→13」;选型「1→14→16」。

下一篇进入 Identity 轴:没有 Endpoint 与数字身份的生命周期语言,后面的 policy map 与「偶发拒绝」都无处锚定。


八、参考资料

规范 / 官方文档(A)

源码(A)

核心论文

站内对照

实验台账


系列目录 · 下一篇:Endpoint 与 Identity

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。

2026-08-16 · kubernetes / network

Cilium / eBPF 数据面内核:从 Identity 到包路径

补齐站内 Cilium 产品单篇与 eBPF 内核实现之上的数据面内核层:Endpoint/Identity、BPF 挂载与 Map、东西向包路径、kube-proxy 替代、策略编译、Hubble、加密与 Mesh/ClusterMesh 边界,并以排障与选型收束。


By .