endpoint 和 pod 的对应关系是如何维护的? 有一对一的关系么

4 阅读4分钟

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 对象包含一个指向对应 PodOwnerReference
    • 这意味着当 Pod 被删除时,K8s 的垃圾回收机制可以级联删除对应的 CEP(虽然 Cilium 也有自己的 GC)。

4. 垃圾回收 (Garbage Collection)

为了处理异常情况(如节点硬关机导致 Agent 无法执行删除操作),Cilium 依赖 Operator 进行清理:

  • Cilium Operator GC:

    • Operator 运行一个 endpoint-gc 控制器。
    • 它定期扫描集群中的 CiliumEndpoint
    • 清理逻辑: 如果发现某个 CEP 指向的 Pod 已经不存在、或者处于完成/失败状态,Operator 会删除这个孤儿 CEP,从而维护 1:1 关系的整洁。
  • Agent 启动清理:

    • Agent 在启动时会运行 endpointcleanup,清理本节点上那些“不再被管理”的 stale CEPs。

代码引用: 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) 关系:

  1. 命名一致性 (Naming Convention)

    • CiliumEndpoint (CEP) 的名称和命名空间必须与其对应的 Pod 完全一致。
  2. 创建与同步 (Sync Loop)

    • Agent 侧EndpointSynchronizer 控制器(pkg/endpointmanager/endpointsynchronizer.go)负责将本地 Endpoint 的状态同步到 K8s 的 CEP 对象。
    • 逻辑:当 Agent 管理一个 Pod 时,它会尝试创建或更新一个同名的 CEP。
  3. 冲突保护 (Conflict Prevention)

    • UID 校验:Agent 在接管 CEP 前,会检查 CEP 的 UID。如果发现同名 CEP 但 UID 不匹配(例如是旧 Pod 的残留),Agent 不会接管,防止错误覆盖。
    • 节点亲和性:Agent 只管理调度到本节点的 Pod 的 CEP,通过对比 Pod 的 HostIP 和本节点 IP 来确保。
  4. 垃圾回收 (Garbage Collection)

    • K8s 层:CEP 拥有指向 Pod 的 OwnerReference,Pod 删除时 K8s 会级联删除 CEP。
    • Operator 层:Cilium Operator 定期清理孤儿 CEP(即 Pod 已不存在的 CEP)。
    • Agent 启动清理:Agent 启动时会运行清理程序 (pkg/endpointcleanup/cleanup.go),删除本节点上不再活跃的 stale CEP。

这种多层机制确保了即使在节点重启、Pod 迁移或异常情况下,Endpoint 和 Pod 的关系依然保持准确的一对一映射。