2. Cilium架构总览

Cilium 的控制面由多个独立部署但紧密协作的组件构成。理解每个组件的职责及其通信方式是进行故障排查的基础。本章将逐一解析 Cilium Agent、Cilium Operator、CNI 插件、Hubble 组件以及 KVStore (etcd) 的角色与交互流程。

2.1 核心组件角色一览

下表总结了各组件在 Cilium 控制面中的核心定位与关键职责:

组件 部署形态 核心职责 故障排查关注点
Cilium Agent DaemonSet (每节点一个) 管理 eBPF 程序、同步网络策略、维护端点状态 与 API Server 通信、eBPF map 状态、本地策略一致性
Cilium Operator Deployment (通常 1-2 副本) 集群级协调:IPAM、身份管理、故障恢复 Leader 选举状态、IP 池耗尽、身份泄漏
CNI 插件 二进制文件 (由 kubelet 调用) Pod 网络接入:分配 IP、配置接口、调用 Agent 二进制版本、Agent 响应超时、接口配置失败
Hubble 组件 DaemonSet + Deployment 可观测性:流量抓取、服务依赖图、事件导出 gRPC 连接、流丢失、Hubble Relay 缓存
KVStore (etcd) 外部集群 / 内置 分布式状态存储:身份、IP 分配、集群配置 读写延迟、watch 事件丢失、租约过期

2.2 组件交互流程与架构图

下图展示了 Cilium 控制面各组件之间的主要数据流与控制流。箭头方向表示通信发起方或数据流向。

Cilium 控制面组件交互架构图 Cilium 控制面组件交互架构 Kubernetes 集群 Kubernetes API Server Cilium Agent DaemonSet (每节点) Cilium Operator Deployment (1-2 副本) CNI 插件 (二进制) 由 kubelet 调用 Hubble Relay Deployment Hubble Agent DaemonSet (每节点) KVStore (etcd) 外部 / 内置集群 Watch / 更新 Watch / 更新 gRPC 调用 身份 / IP 同步 IPAM 分配 gRPC 流 服务发现 图例:实线 = 主要数据/控制流;虚线 = 服务发现/辅助流;颜色区分组件类型。

2.3 关键组件深度解析

2.3.1 Cilium Agent — 数据面执行者

Agent 是 Cilium 中最核心的组件,以 DaemonSet 方式运行在每个 Kubernetes 节点上。它的主要工作包括:

  • eBPF 程序管理:编译、加载并附着 eBPF 程序到网络接口(如 veth、cilium_host)。
  • 网络策略同步:从 API Server 监听 NetworkPolicy 和 CiliumNetworkPolicy 资源,转换为 eBPF map 中的规则。
  • 端点状态维护:跟踪本地所有 Pod 的标识、IP、安全身份(Security Identity)。
  • KVStore 交互:将本地端点身份发布到 KVStore,并订阅全局身份变化。
故障排查提示: 当 Pod 网络不通时,首先检查 cilium agent status 输出中的 K8s 和 KVStore 状态。若显示 Failure,说明 Agent 与 API Server 或 etcd 的连接中断。

2.3.2 Cilium Operator — 集群级协调者

Operator 负责全局性的控制面任务,不直接参与数据面转发。其关键职责包括:

  • IP 地址管理 (IPAM):从 CIDR 池中分配 Pod IP,回收已删除 Pod 的 IP。
  • 身份管理:为每个安全标签组合分配全局唯一的 Security Identity。
  • 故障恢复:监控 Agent 健康状态,清理残留的端点或身份。
  • Leader 选举:多副本部署时,仅 Leader 执行 IPAM 和身份分配操作。
Operator 功能 依赖组件 故障影响
IPAM KVStore, API Server 新 Pod 无法获取 IP,Pending 状态
身份分配 KVStore 网络策略无法生效,流量被默认拒绝
Leader 选举 API Server (Lease 对象) 多 Operator 冲突,IPAM 混乱

2.3.3 CNI 插件 — Pod 网络接入点

CNI 插件是 kubelet 在创建 Pod 时调用的二进制文件。它不常驻运行,而是通过以下流程完成网络接入:

  1. kubelet 调用 cilium-cni 二进制,传入 Pod 的 namespace/name 和网络配置。
  2. CNI 插件通过 gRPC 请求本地 Cilium Agent 分配 IP 并配置接口。
  3. Agent 创建 veth pair,将一端放入 Pod 网络命名空间,另一端挂载到 cilium_host 或 lxc 接口。
  4. Agent 加载针对该 Pod 的 eBPF 程序,设置网络策略和转发规则。
常见问题: CNI 插件版本与 Agent 版本不匹配会导致 gRPC 协议不兼容。排查时检查 /var/log/cilium-cni.log 中的 rpc error: code = Unimplemented 错误。

2.3.4 Hubble 组件 — 可观测性层

Hubble 提供基于 eBPF 的流量可观测性,由两个子组件构成:

  • Hubble Agent:运行在每个节点上,从 Cilium Agent 的 eBPF map 中读取流量事件,通过 gRPC 流实时上报。
  • Hubble Relay:集群级聚合器,连接所有 Hubble Agent,提供统一的查询接口(hubble observe 命令的后端)。

Hubble 不参与数据面转发,但它的数据流对排查网络策略问题至关重要:

  • 通过 hubble observe --verdict DROPPED 快速定位被策略拒绝的流量。
  • 通过 hubble observe --identity 验证源/目的安全身份是否正确。

2.3.5 KVStore (etcd) — 分布式状态中枢

KVStore 存储 Cilium 的全局状态,是控制面一致性的基石。存储的关键数据包括:

  • Security Identity:标签到身份 ID 的映射。
  • IP 分配记录:已分配的 Pod IP 及其所属节点。
  • 节点状态:各节点的 Agent 心跳和健康信息。
  • 集群配置:Cilium 全局配置(如隧道模式、原生路由)。

Agent 和 Operator 通过 watch 机制 监听 KVStore 中的变化。当 etcd 出现高延迟或 leader 切换时,可能导致:

  • 身份分配延迟,新 Pod 长时间处于 Init 状态。
  • 网络策略更新滞后,旧策略残留导致流量异常。
  • Agent 误判自身状态,触发不必要的重新加载。

2.4 组件交互时序总结

以下时序图展示了 Pod 创建过程中各组件的典型交互顺序:

Pod 创建时组件交互时序 Pod 创建时组件交互时序 kubelet CNI 插件 Cilium Agent Operator KVStore 1. 调用 CNI ADD 2. gRPC 请求 IP 3. 分配身份 (watch) 4. 返回身份 ID 5. 返回 IP + 身份 6. 返回接口配置 7. 发布端点状态 8. 通知 Operator 说明:步骤 3-4 涉及身份分配,若 KVStore 延迟高,Pod 将卡在 Init 状态。

2.5 故障排查关键路径

基于上述架构,当控制面出现故障时,建议按以下路径排查:

  1. 检查 Agent 状态:cilium status 确认与 API Server、KVStore 的连接。
  2. 检查 Operator 日志:kubectl logs -n kube-system -l io.cilium/app=operator 查找 IPAM 或身份分配错误。
  3. 检查 KVStore 健康:cilium kvstore health 查看延迟和 watch 事件数量。
  4. 检查 Hubble 流:hubble observe --since 5m --verdict DROPPED 确认策略是否按预期执行。
  5. 检查 CNI 日志:查看 /var/log/cilium-cni.log 中是否有 gRPC 调用失败记录。
最佳实践: 在生产环境中,建议为 KVStore 配置独立的 etcd 集群,并启用 etcd-operator 的自动备份。Cilium Agent 的 --debug 模式仅在排查问题时临时开启,避免日志爆炸。