Cilium 架构概览:核心组件与通信方式
Cilium 基于 eBPF(extended Berkeley Packet Filter)技术构建,其架构由多个协同工作的组件组成。理解这些组件及其通信方式是进行证书轮换作业与故障排查的基础。本章将详细拆解 Cilium 的四大核心组件:Agent、Operator、CNI 插件以及 Hubble,并分析它们之间的数据流与控制流。
2.1 核心组件总览
Cilium 采用去中心化的设计,每个 Kubernetes 节点上运行一个 Agent,而 Operator 则作为集群级别的控制器。下表总结了各组件的职责与部署形态:
| 组件 | 部署形态 | 核心职责 | 关键依赖 |
|---|---|---|---|
| Cilium Agent | DaemonSet(每节点一个) | 管理 eBPF 程序、实现网络策略、服务负载均衡、与 kubelet 交互 | kubelet、containerd/CRI-O、内核 eBPF 能力 |
| Cilium Operator | Deployment(通常 1-2 副本) | 处理集群级任务:IPAM(IP 地址管理)、身份管理、Endpoint 同步 | Kubernetes API Server |
| Cilium CNI | 二进制插件(由 kubelet 调用) | 将 Pod 接入 Cilium 网络,配置网络接口与路由 | Cilium Agent(通过 Unix Socket) |
| Hubble | DaemonSet + Deployment | 可观测性:流量捕获、服务依赖图、网络策略审计 | Cilium Agent(通过 gRPC) |
/var/run/secrets/kubernetes.io/serviceaccount/ 或自定义 Secret 卷中。
2.2 组件通信方式与数据流
Cilium 组件间的通信分为控制面通信与数据面通信。控制面负责策略下发、身份同步;数据面负责实际的 Pod 流量转发。下图展示了组件间的核心通信路径:
2.3 组件通信细节拆解
2.3.1 Cilium Agent ↔ kubelet
这是故障排查中最关键的通信对。当 kubelet 需要创建 Pod 时,会调用 Cilium CNI 插件。CNI 插件通过 Unix Socket(默认路径 /var/run/cilium/cilium.sock)向本节点的 Cilium Agent 请求网络配置。Agent 随后执行以下操作:
- IPAM 分配: 从节点可用 IP 池中分配 IP 地址。
- eBPF 程序加载: 为 Pod 创建网络命名空间并加载对应的 eBPF 程序。
- 策略应用: 根据身份标签应用网络策略。
此过程涉及 资源争抢:当节点上 Pod 创建/删除频率极高时,Agent 的 eBPF 资源(如 Map 大小、程序数量)可能与 kubelet 的 Pod 管理产生竞争,导致 CNI 调用超时或失败。
2.3.2 Cilium Agent ↔ Kubernetes API Server
Agent 通过 Watch 机制监听 Pod、Service、Endpoint、NetworkPolicy 等资源的变化。每个 Agent 都会与 API Server 建立长连接。在证书轮换场景中,如果 Agent 的 ServiceAccount 证书过期,Watch 连接会中断,导致 Agent 无法感知策略更新。
certificate has expired or is not yet valid。此时需检查 Agent 日志中的 TLS 握手错误,并确认证书挂载路径是否正确。
2.3.3 Cilium Operator ↔ Kubernetes API Server
Operator 负责集群级别的协调工作,包括:
- 身份管理: 为每个安全身份(Security Identity)分配全局唯一的 ID。
- IPAM 池管理: 在集群范围内分配 CIDR 块给各节点。
- Endpoint 同步: 确保所有节点的 Endpoint 信息一致。
Operator 与 API Server 的通信同样依赖 TLS 证书。如果 Operator 的证书轮换失败,可能导致 IPAM 分配停滞,新 Pod 无法获取 IP 地址。
2.3.4 Hubble ↔ Cilium Agent
Hubble 通过 gRPC 流从每个节点的 Cilium Agent 拉取流量元数据。Agent 将 eBPF 捕获的包信息(源/目的 IP、端口、协议、Verdict)实时推送给 Hubble。此通信使用本地 gRPC 连接,通常不涉及跨节点 TLS,但在 Hubble Relay(集群级聚合)场景下,需要 TLS 加密。
2.4 组件通信协议与端口清单
下表列出了组件间通信使用的协议与默认端口,便于故障排查时进行网络抓包或连接检查:
| 通信对 | 协议 | 默认端口 | 用途 |
|---|---|---|---|
| Agent ↔ API Server | HTTPS (TLS) | 6443 | Watch 资源、CRD 操作 |
| Agent ↔ kubelet | Unix Socket | /var/run/cilium/cilium.sock | CNI 调用 |
| Agent ↔ Operator | gRPC (TLS) | 9964 | 身份分配、IPAM 请求 |
| Hubble ↔ Agent | gRPC (明文/TLS) | 9965 | 流量元数据流 |
| Operator ↔ API Server | HTTPS (TLS) | 6443 | 集群状态管理 |
2.5 证书轮换影响范围
证书轮换作业主要影响 控制面通信,特别是涉及 TLS 的连接。以下是一个简化的影响范围示意图: