Cilium 基础回顾:架构、eBPF 原理与网络策略核心概念

在深入版本漂移适配之前,必须重新夯实 Cilium 的三大基石:架构组件、eBPF 数据面原理以及CiliumNetworkPolicy (CNP) 的匹配模型。这三者直接决定了日志平台在版本升级后策略是否仍能按预期生效。

2.1 Cilium 整体架构

Cilium 采用控制面与数据面分离的架构。控制面负责策略下发与状态同步,数据面通过 eBPF 在内核中执行转发与过滤。

架构要点: 控制面组件(Operator、Agent)不参与数据路径转发,仅管理 eBPF Map 和策略规则;数据面完全运行在 eBPF 程序中,无 sidecar 或 iptables 开销。
Cilium 架构组件 控制面 (Control Plane) cilium-operator 身份管理 · 策略分发 cilium-agent eBPF 加载 · 策略同步 etcd / K8s API Hubble 数据面 (Data Plane) eBPF 程序 XDP · TC · cgroup · sock eBPF Maps 策略 · 端点 · 身份 关键说明 • Agent 通过 K8s Watch 监听 Endpoint/Policy 变更 • 将策略编译为 eBPF 指令,写入 BPF Map • 数据面 eBPF 程序在每次包处理时查询 Map • 版本漂移时,Map 结构或语义可能变化 • Hubble 提供可观测性,不参与策略执行

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 策略匹配流程

  1. 身份分配: Cilium 为每个 Pod 分配基于安全标签的 64 位身份标识 (Security Identity)。
  2. 策略编译: Agent 将 CNP 规则编译为 eBPF 指令,写入 BPF Map(cilium_policy / cilium_ipcache)。
  3. 包处理: 数据面 eBPF 程序在 TC 钩子点提取源/目的身份,查询策略 Map 决定允许/丢弃。
  4. 日志记录: 匹配策略的包可通过 Hubble 导出流日志,供日志平台消费。
CiliumNetworkPolicy 匹配流程 1. 身份分配 2. 策略编译 3. 包处理 4. 日志导出 版本漂移对匹配流程的影响 • 身份分配:v1.13 引入 identity-selector 新语法,旧版 Agent 无法解析 • 策略编译:eBPF 指令集版本差异可能导致编译失败或生成错误规则 • 包处理:Map 键值结构变更(如 struct endpoint_key 增加字段)导致查询错位 • 日志导出:Hubble 流格式变化(如 v1.14 弃用 flow.verdict 字段)破坏日志解析

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 解析、身份匹配和流日志格式。