Cilium 基础回顾:架构、eBPF 原理与网络策略核心概念
在深入版本漂移适配之前,必须重新夯实 Cilium 的三大基石:架构组件、eBPF 数据面原理以及CiliumNetworkPolicy (CNP) 的匹配模型。这三者直接决定了日志平台在版本升级后策略是否仍能按预期生效。
2.1 Cilium 整体架构
Cilium 采用控制面与数据面分离的架构。控制面负责策略下发与状态同步,数据面通过 eBPF 在内核中执行转发与过滤。
架构要点: 控制面组件(Operator、Agent)不参与数据路径转发,仅管理 eBPF Map 和策略规则;数据面完全运行在 eBPF 程序中,无 sidecar 或 iptables 开销。
2.2 eBPF 原理与策略执行路径
eBPF 是 Cilium 的核心技术,允许在内核中安全运行沙箱程序。Cilium 利用 eBPF 在多个内核钩子点注入网络策略逻辑。
| 钩子点 | 触发时机 | Cilium 用途 |
|---|---|---|
| XDP | 网卡驱动层,最早包处理点 | DDoS 防护、早期丢弃、负载均衡 |
| TC (traffic control) | 内核协议栈入口/出口 | L3/L4 网络策略、封装/解封装 |
| cgroup/sock | Socket 创建/连接/发送 | L7 策略、DNS 策略、身份标识 |
| kprobe/tracepoint | 内核函数调用/事件 | Hubble 可观测性、监控指标 |
版本漂移风险点: 不同 Cilium 版本可能使用不同的 eBPF 辅助函数或 Map 布局。例如 v1.12 到 v1.14 期间,
BPF_MAP_TYPE_HASH 的策略键值结构从 u64 改为 struct,导致旧版编译的 eBPF 程序无法正确读取新版 Map。
2.3 CiliumNetworkPolicy 核心概念
CiliumNetworkPolicy (CNP) 是 Kubernetes CRD,用于定义 Pod 级别的网络访问规则。其匹配模型基于 Endpoint Selector 和 Identity,而非传统 IP/CIDR。
2.3.1 策略模型对比
| 维度 | 传统 NetworkPolicy | CiliumNetworkPolicy |
|---|---|---|
| 匹配依据 | Pod label + IP CIDR | Endpoint Selector + 身份标识 |
| L7 支持 | 不支持 | HTTP/gRPC/Kafka/DNS 等 |
| 规则方向 | ingress / egress | ingress / egress + 无状态 |
| 命名空间隔离 | 仅同命名空间 | 跨命名空间 + 集群范围 |
| 策略优先级 | 隐式 deny | 显式优先级 + 默认 deny |
2.3.2 策略匹配流程
- 身份分配: Cilium 为每个 Pod 分配基于安全标签的 64 位身份标识 (Security Identity)。
- 策略编译: Agent 将 CNP 规则编译为 eBPF 指令,写入 BPF Map(
cilium_policy/cilium_ipcache)。 - 包处理: 数据面 eBPF 程序在 TC 钩子点提取源/目的身份,查询策略 Map 决定允许/丢弃。
- 日志记录: 匹配策略的包可通过 Hubble 导出流日志,供日志平台消费。
2.4 策略语法核心字段
一个典型的 CNP 包含以下关键字段,版本漂移时这些字段的语义或默认值可能发生变化:
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: log-platform-allow
spec:
endpointSelector:
matchLabels:
app: log-collector
ingress:
- fromEndpoints:
- matchLabels:
app: fluentbit
toPorts:
- ports:
- port: "24224"
protocol: TCP
egress:
- toFQDNs:
- matchName: "elasticsearch.prod.svc"
toPorts:
- ports:
- port: "9200"
protocol: TCP
版本漂移适配警示: 上述示例中
toFQDNs 字段在 v1.12 之前为 matchPattern,v1.13 改为 matchName 并废弃 matchPattern。如果日志平台从 v1.11 升级到 v1.14,未更新的策略将导致 DNS 策略失效,日志数据无法写入 Elasticsearch。
2.5 关键版本差异速查表
| Cilium 版本 | 策略相关变更 | 对日志平台的影响 |
|---|---|---|
| v1.11 → v1.12 | 引入 toFQDNs.matchName,废弃 matchPattern |
DNS 策略需重写,否则日志聚合失败 |
| v1.12 → v1.13 | eBPF Map 键结构变更,identity 从 u32 扩展为 u64 |
旧版 eBPF 程序无法读取新版 Map,需重启 Agent |
| v1.13 → v1.14 | Hubble 流日志字段重命名,flow.verdict 改为 flow.verdict_code |
日志平台解析器需更新字段映射 |
| v1.14 → v1.15 | 默认启用 enable-ipv6-big-tcp,MTU 行为变化 |
日志平台大包传输可能被截断 |
实践建议: 在版本升级前,使用
cilium policy validate 检查现有策略的兼容性;升级后立即验证日志平台端到端连通性,重点关注 DNS 解析、身份匹配和流日志格式。