站内 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.0(
docs.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-cilium、k8s-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 16 与 HAProxy 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 数据面同时钉住三条不变量:
- 策略匹配以 Identity 为键,不以临时 Pod IP 为键:相同安全相关标签共享同一数字身份;扩缩容不应迫使全集群重写 IP 规则(Identity-Based 文档)。代价是必须能解释身份分配延迟与标签变更窗口。
- 数据面状态主要在 BPF map,控制面只做 reconcile:人改的是 CR / NetworkPolicy;权威执行在 hook 上的程序与 map。代价是满表、陈旧条目与程序替换窗口会表现为「偶发」连通问题。
- 能在 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 一致性窗口
- 经典 BPF(McCanne & Jacobson, USENIX Winter 1993)定义「在内核里用受限虚拟机过滤包」的范式;今天的 eBPF 是能力与安全模型都大幅扩展后的后代,细节见站内 ebpf/。
- XDP(Høiland-Jørgensen et al., CoNEXT 2018)把可编程点推到驱动最早路径,论证「在 OS 内核内做高速可编程」相对用户态绕路的假设与边界。Cilium 把 XDP 用作 NodePort/预过滤等早路径,而不是把所有策略都塞进 XDP。
- Cilium Identity-Based
安全(
docs.cilium.io/en/v1.20/security/network/identity/)把「标签 → 数字身份 → map 键」写成可扩展策略模型,显式对比 IP 过滤器在 churn 下的更新风暴。 - 生产分叉(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/13、ebpf/01;对照 envoy/16、haproxy/14。
阅读时建议随身带一张「轴 → 锚点」卡片:偶发拒绝先问 Identity;升级黑洞先问挂载替换;新建 VIP 不通先问 LB map;同节点与跨节点差异先问包路径;Hubble 与症状对不上先问观测轴。把现象翻译成轴,比翻译成「重启 cilium-agent」更接近本系列目标。
五个关键问题到第 1 篇结尾仍然够用:后续每一篇应能把问题收束到某一轴上的可核对锚点。若一篇写完仍只能回答「看场景」,说明证据或机制还不够,应按 WRITING_GUIDE 停写或缩范围——本系列对跨方案延迟排名正是如此处理的。
七、小结
- 定位:补 k8s-network/13 与 ebpf/ 之间的 Cilium 数据面内核层,不重写产品百科或 verifier 全书。
- 五轴:Identity / BPF 挂载 / Map 状态 / 包路径 / 策略与观测;每轴有可核对锚点。
- 三不变量:Identity 为键、map 为权威状态、L3/L4 尽量留在 hook。
- 谱系:经典 BPF → XDP → Cilium Identity → v1.20.0 生产分叉。
- 路线:核心「1→2→5→6→7→13」;选型「1→14→16」。
下一篇进入 Identity 轴:没有 Endpoint 与数字身份的生命周期语言,后面的 policy map 与「偶发拒绝」都无处锚定。
八、参考资料
规范 / 官方文档(A)
- Cilium v1.20 Identity-Based Security —
docs.cilium.io/en/v1.20/security/network/identity/。 - Cilium v1.20 Terminology(Endpoint / Identity /
reserved)—
docs.cilium.io/en/v1.20/gettingstarted/terminology/。 - Cilium v1.20 eBPF Datapath Intro / Life of a Packet /
Maps —
docs.cilium.io/en/v1.20/network/ebpf/。 - Cilium v1.20 Iptables Usage —
docs.cilium.io/en/v1.20/network/ebpf/iptables/。
源码(A)
cilium/ciliumtag v1.20.0:bpf/bpf_{lxc,host,xdp,sock}.c,pkg/maps/policymap(MapName = cilium_policy_v3_),pkg/identity/,pkg/datapath/。
核心论文
- McCanne & Jacobson, The BSD Packet Filter, USENIX Winter 1993 —— 经典 BPF 范式。
- Høiland-Jørgensen et al., The eXpress Data Path, CoNEXT 2018 —— XDP 假设与内核可编程早路径。
站内对照
实验台账
- 本篇无命令输出;不写 pps / 延迟数字,不粘贴伪造 Hubble flow。
→ 系列目录 · 下一篇:Endpoint 与 Identity
读完这篇,下一步读什么
优先读同系列或同问题的下一篇,把单篇消费变成主题集群。
【Cilium / eBPF】排障坐标系:丢包、policy deny、identity 漂移、Service 黑洞与加密失败
按五轴映射 Cilium 东西向故障:通用丢包、Policy denied、identity 漂移窗口、Service/ClusterIP 黑洞、透明加密失败;每轴绑定 status/Hubble/map 层,一次否证一轴。
Cilium / eBPF 数据面内核:从 Identity 到包路径
补齐站内 Cilium 产品单篇与 eBPF 内核实现之上的数据面内核层:Endpoint/Identity、BPF 挂载与 Map、东西向包路径、kube-proxy 替代、策略编译、Hubble、加密与 Mesh/ClusterMesh 边界,并以排障与选型收束。
【Cilium / eBPF】Endpoint 与 Identity:数字身份、标签选择与生命周期
钉清 Cilium Endpoint 与 Numeric Identity 的关系:安全相关标签如何导出集群范围数字身份、保留身份与 well-known 身份、标签变更时的短暂 deny/allow 窗口,以及相对 IP 策略消除了什么。
【Cilium / eBPF】关键 BPF Map:policy、service、CT 的职责与失败表象
按 Cilium v1.20 Maps 文档钉清 policy、Service LB、CT、NAT、ipcache 等 map 的职责、默认容量与满表后果;说明 v3 policy map 语义变更,内核 map 实现外链 ebpf/ 系列。