toolName: no_need_execute
status: no_need_execute
toolName: search_codebase
status: success
query: Cilium endpoint pod relationship one-to-one maintenance
toolName: search_codebase
status: success
query: Pod to Endpoint mapping and synchronization logic
toolName: search_codebase
status: success
query: How Cilium ensures one endpoint per pod
Cilium 通过多层机制来维护 Endpoint (端点) 与 Pod 之间严格的 一对一 (1:1) 关系。这种关系不仅体现在数据平面(IP 分配、策略),也体现在控制平面(CiliumEndpoint CRD)。
以下是 Cilium 维护这种一对一关系的具体机制:
1. 核心概念与映射 (Concept)
- 1 Pod = 1 Endpoint: 每个由 Cilium 管理的 Pod 都会对应一个内部的
Endpoint对象。 - 1 Endpoint = 1 CiliumEndpoint (CEP): Cilium 会在 Kubernetes 中创建一个名为
CiliumEndpoint(简称 CEP) 的自定义资源 (CRD)。 - 命名一致性:
CiliumEndpoint与其对应的 Pod 必须拥有相同的名称和相同的命名空间。这是最基础的 1:1 约束。
2. 创建与同步机制 (Creation & Synchronization)
Cilium Agent 内部运行着一个同步控制器来确保持久化这种关系:
- EndpointSynchronizer:
- 位置:
pkg/endpointmanager/endpointsynchronizer.go - 功能: 每个本地 Endpoint 都有一个关联的控制器,负责将本地状态同步到 K8s 的
CiliumEndpoint对象。 - 逻辑: Agent 监听到 Pod 创建事件后,生成本地 Endpoint,然后
EndpointSynchronizer会尝试在 K8s API Server 中创建或更新对应的 CEP。
- 位置:
代码引用: pkg/endpointmanager/endpointsynchronizer.go:L51 (RunK8sCiliumEndpointSync 控制器)
3. 冲突保护与所有权维护 (Enforcement)
为了防止多个 Agent 错误地管理同一个 CEP,或者防止旧的 CEP 干扰新的 Pod,Cilium 实现了严格的检查:
- UID 校验:
- Agent 在接管或更新一个 CEP 之前,会检查 CEP 的 UID 是否与本地记录的 UID 匹配。
- 如果发现同名的 CEP 已经存在但 UID 不匹配(例如是旧 Pod 残留的 CEP),Agent 可能会拒绝接管,直到旧的被清理。
- 代码逻辑中会检查 Pod 的
HostIP是否与当前节点 IP 一致,确保只有运行该 Pod 的节点才能管理其 CEP。
代码引用: pkg/endpointmanager/endpointsynchronizer.go:L479 (UID 校验逻辑)
- OwnerReference (所有者引用):
CiliumEndpoint对象包含一个指向对应Pod的OwnerReference。- 这意味着当 Pod 被删除时,K8s 的垃圾回收机制可以级联删除对应的 CEP(虽然 Cilium 也有自己的 GC)。
4. 垃圾回收 (Garbage Collection)
为了处理异常情况(如节点硬关机导致 Agent 无法执行删除操作),Cilium 依赖 Operator 进行清理:
-
Cilium Operator GC:
- Operator 运行一个
endpoint-gc控制器。 - 它定期扫描集群中的
CiliumEndpoint。 - 清理逻辑: 如果发现某个 CEP 指向的 Pod 已经不存在、或者处于完成/失败状态,Operator 会删除这个孤儿 CEP,从而维护 1:1 关系的整洁。
- Operator 运行一个
-
Agent 启动清理:
- Agent 在启动时会运行
endpointcleanup,清理本节点上那些“不再被管理”的 stale CEPs。
- Agent 在启动时会运行
代码引用: pkg/endpointcleanup/cleanup.go:L229 (Agent 启动清理)
总结
Cilium 通过 命名规范 (同名同命名空间)、UID 锁定 (防止节点间冲突)、OwnerReference (K8s 层级关联) 以及 Operator GC (兜底清理) 这四重手段,严格维护了 Endpoint 与 Pod 的一对一关系。
toolName: view_files
status: success
filePath: /root/f/cilium/pkg/endpointmanager/manager.go
toolName: view_files
status: success
filePath: /root/f/cilium/pkg/endpoint/endpoint.go
toolName: view_files
status: success
filePath: /root/f/cilium/pkg/endpointmanager/endpointsynchronizer.go
toolName: view_files
status: success
filePath: /root/f/cilium/pkg/endpointcleanup/cleanup.go
toolName: manage_core_memory
status: success
Cilium 通过以下机制严格维护 Endpoint 和 Pod 之间的一对一 (1:1) 关系:
-
命名一致性 (Naming Convention):
CiliumEndpoint(CEP) 的名称和命名空间必须与其对应的 Pod 完全一致。
-
创建与同步 (Sync Loop):
- Agent 侧:
EndpointSynchronizer控制器(pkg/endpointmanager/endpointsynchronizer.go)负责将本地 Endpoint 的状态同步到 K8s 的 CEP 对象。 - 逻辑:当 Agent 管理一个 Pod 时,它会尝试创建或更新一个同名的 CEP。
- Agent 侧:
-
冲突保护 (Conflict Prevention):
- UID 校验:Agent 在接管 CEP 前,会检查 CEP 的 UID。如果发现同名 CEP 但 UID 不匹配(例如是旧 Pod 的残留),Agent 不会接管,防止错误覆盖。
- 节点亲和性:Agent 只管理调度到本节点的 Pod 的 CEP,通过对比 Pod 的
HostIP和本节点 IP 来确保。
-
垃圾回收 (Garbage Collection):
- K8s 层:CEP 拥有指向 Pod 的
OwnerReference,Pod 删除时 K8s 会级联删除 CEP。 - Operator 层:Cilium Operator 定期清理孤儿 CEP(即 Pod 已不存在的 CEP)。
- Agent 启动清理:Agent 启动时会运行清理程序 (
pkg/endpointcleanup/cleanup.go),删除本节点上不再活跃的 stale CEP。
- K8s 层:CEP 拥有指向 Pod 的
这种多层机制确保了即使在节点重启、Pod 迁移或异常情况下,Endpoint 和 Pod 的关系依然保持准确的一对一映射。