3. Cilium 基础架构:Cilium Agent、eBPF 数据路径、Hubble 可观测性组件、Cilium Operator

在深入排查网络策略故障之前,必须理解 Cilium 的四大核心组件及其协作方式。Cilium 并非传统意义上的 CNI 插件,而是一个基于 eBPF 的数据平面与控制平面系统。其架构可概括为:Agent 负责策略下发与状态管理,eBPF 负责内核态高速转发,Hubble 负责流量可视化,Operator 负责集群级协调。

3.1 组件总览与职责划分

下表列出了 Cilium 各组件的部署形态与核心职责,这是排障时定位问题组件的基础。

组件 部署形态 核心职责 排障关注点
Cilium Agent DaemonSet(每个节点一个) eBPF 程序加载、策略规则翻译、端点管理、与 kube-apiserver 交互 Agent 日志、eBPF map 状态、端点列表
eBPF 数据路径 内核态(无独立进程) 网络包过滤、转发、负载均衡、隧道封装/解封装 tc 钩子、XDP 钩子、eBPF map 内容
Hubble DaemonSet + 独立 UI/Relay 流量抓取、L3/L4/L7 可观测性、策略审计、服务依赖图 Hubble 指标、流日志、策略 verdict 记录
Cilium Operator Deployment(通常 1-2 副本) IPAM(IP 地址管理)、Service 同步、节点间协调、CRD 状态维护 Operator 日志、IP 池状态、节点连通性
排障提示: 当网络策略不生效时,首先检查 Cilium Agent 是否处于 Ready 状态,其次检查 Hubble 是否捕获到策略拒绝(verdict: DROPPED)的记录。Operator 故障通常表现为新 Pod 无法获取 IP 或 Service 后端更新延迟。

3.2 Cilium Agent:策略执行的核心

Cilium Agent 是运行在每个 Kubernetes 节点上的守护进程。它通过监听 Kubernetes API Server 中的 Pod、Service、NetworkPolicy、CiliumNetworkPolicy 等资源变化,动态生成 eBPF 程序并加载到内核。

Agent 的内部工作流程如下:

  1. 监听事件:通过 Informer 机制监听 Pod/Service/Policy 变化。
  2. 端点管理:维护本地节点上所有 Pod 的 端点(Endpoint) 对象,包含身份标识(Security Identity)、标签、IP 地址。
  3. 策略计算:将 Kubernetes NetworkPolicy 和 CiliumNetworkPolicy 翻译为基于身份(Identity)的 eBPF map 条目。
  4. eBPF 加载:通过 bpffs 挂载点将编译好的 eBPF 程序附加到网络设备(如 lxc、eth0)的 tc 或 XDP 钩子上。
  5. 健康检查:定期上报节点状态,维护与 Operator 的心跳。
关键排障命令:
# 查看 Agent 状态
kubectl -n kube-system exec ds/cilium -- cilium status

# 列出本地所有端点及其安全身份
kubectl -n kube-system exec ds/cilium -- cilium endpoint list

# 查看特定端点的策略应用情况
kubectl -n kube-system exec ds/cilium -- cilium endpoint get <endpoint-id>

3.3 eBPF 数据路径:内核态高速转发

eBPF 数据路径是 Cilium 性能的核心。与传统 iptables 或 IPVS 不同,eBPF 程序直接运行在内核事件钩子中,无需上下文切换。Cilium 主要使用以下两种钩子:

  • XDP(eXpress Data Path):在网卡驱动层处理包,性能最高,适用于 DDoS 防护和入口策略。
  • tc(Traffic Control):在协议栈入口/出口处理包,功能更全面,支持 L3/L4/L7 策略。

数据路径的核心逻辑通过 eBPF Map 实现策略查找:

包到达节点
    │
    ▼
XDP/tc 钩子触发
    │
    ▼
查找 "Policy Map" (key: 源身份 + 目标身份 + 端口)
    │
    ├── ALLOW → 放行包,继续协议栈处理
    ├── DROP  → 丢弃包,记录丢弃原因到 "Drop Notification Map"
    └── 无匹配 → 根据默认行为(Deny/Allow)处理
排障陷阱: eBPF 程序一旦加载,即使 Cilium Agent 崩溃,策略仍然在内核中生效。重启 Agent 不会导致流量中断,但策略更新会暂停。这是 Cilium 高可靠性的设计,但也意味着错误的策略会持续生效直到 Agent 恢复。

下图展示了 eBPF 数据路径中策略查找的完整流程:

eBPF 数据路径策略查找流程 网络包到达 XDP / tc 钩子触发 查找 Policy Map ALLOW → 放行 DROP → 丢弃 + 记录 无匹配 → 默认行为 排障关键:使用 cilium bpf policy get 查看当前 Policy Map 内容

3.4 Hubble 可观测性组件

Hubble 是 Cilium 的可观测性层,它利用 eBPF 在内核中直接采集网络事件,无需修改应用代码或 sidecar 代理。Hubble 由三个子组件构成:

  • Hubble Agent:运行在每个节点上,从 Cilium Agent 获取 eBPF 事件,聚合为流日志和指标。
  • Hubble Relay:集群级聚合层,将所有节点的 Hubble Agent 数据合并,提供全局视图。
  • Hubble UI:基于 Web 的可视化界面,展示服务依赖图、流量拓扑和策略审计结果。

在策略排障中,Hubble 最核心的能力是 策略审计(Policy Audit)。当策略被拒绝时,Hubble 会记录:

{
  "time": "2025-03-15T10:30:00Z",
  "verdict": "DROPPED",
  "source": {
    "pod": "frontend-7d8f9c5b6c-xk2l3",
    "identity": 12345,
    "labels": ["app=frontend"]
  },
  "destination": {
    "pod": "backend-6f9d4c7b8a-p9q2r",
    "identity": 67890,
    "labels": ["app=backend"]
  },
  "policy_match": "CiliumNetworkPolicy:deny-frontend-to-backend",
  "reason": "Policy violation"
}
排障命令:
# 实时查看 Hubble 流日志
hubble observe --from-pod frontend-7d8f9c5b6c-xk2l3 --to-pod backend-6f9d4c7b8a-p9q2r

# 查看策略拒绝事件
hubble observe --verdict DROPPED

# 通过 Hubble UI 查看服务依赖图(默认端口 12000)
kubectl port-forward -n kube-system svc/hubble-ui 12000:80

3.5 Cilium Operator:集群级协调者

Cilium Operator 是控制平面的关键组件,负责集群级别的状态管理,不直接参与数据路径转发。其主要职责包括:

功能 说明 故障影响
IPAM(IP 地址管理) 为集群分配 PodCIDR 和单个 Pod IP,支持 CRD-backed、Kuberenetes HostScope 等模式 新 Pod 无法获取 IP,Pending 状态
Service 同步 将 Kubernetes Service 的 EndpointSlice 同步到 eBPF 负载均衡 map Service 访问异常,后端更新延迟
节点间协调 处理节点加入/离开,更新隧道或路由表 跨节点通信中断
CRD 状态维护 更新 CiliumEndpoint、CiliumNode 等 CRD 的状态字段 策略依赖的身份信息过期
排障陷阱: Operator 故障通常不会立即导致现有流量中断,但会引发“渐进式故障”。例如,当新 Pod 启动时无法获取 IP,或者 Service 后端更新后负载均衡不生效。排查时应先检查 Operator Pod 日志:kubectl -n kube-system logs deployment/cilium-operator。

下图展示了 Cilium 各组件的协作关系:

Cilium 核心组件协作架构 Kubernetes API Server Cilium Agent (DaemonSet) Cilium Operator (Deployment) eBPF 数据路径 (内核) Hubble Agent (可观测性) IPAM / Service 同步 排障顺序:Agent 状态 → eBPF Map → Hubble 日志 → Operator 日志

3.6 排障思维导图:组件故障定位

当网络策略出现异常时,可以按照以下组件维度进行快速定位:

故障现象 可能原因 排查组件 快速验证命令
策略完全不生效 Agent 未加载 eBPF 程序 Cilium Agent cilium status
部分 Pod 策略生效 端点身份标识不一致 Cilium Agent cilium endpoint list
流量被静默丢弃 eBPF Policy Map 条目错误 eBPF 数据路径 cilium bpf policy get
无法查看策略审计 Hubble Agent 未运行 Hubble hubble status
新 Pod 无法获取 IP Operator IPAM 故障 Cilium Operator kubectl logs deployment/cilium-operator
Service 访问异常 Operator 未同步 EndpointSlice Cilium Operator cilium service list
最佳实践: 在服务目录平台环境中,建议为 Hubble 配置长期存储(如对接 Prometheus + Grafana),以便回溯历史策略拒绝事件。同时,开启 Cilium Agent 的 --debug 日志级别,但注意在生产环境中仅临时开启,避免日志爆炸。