4. CiliumEndpoint 与 Identity:资源定义与基于标签的安全身份机制

Cilium 的安全模型核心在于 身份(Identity),而非传统的 IP 地址。每个 Kubernetes Pod 在启动时都会被分配一个唯一的安全身份,该身份由其标签决定。CiliumEndpoint(CEP)资源正是连接 Pod 与 Identity 的关键桥梁。理解 CEP 和 Identity 的运作机制,是调试网络策略的前提。

4.1 CiliumEndpoint 资源定义

CiliumEndpoint 是一个集群范围的资源,由 Cilium Agent 为每个运行中的 Pod 自动创建。它记录了 Pod 的网络状态、安全身份以及策略执行结果。

关键字段说明: CEP 的 status 字段是调试的核心入口,包含了 Identity ID、网络地址、以及策略是否被拒绝等信息。
字段路径 类型 描述
metadata.name string 与对应 Pod 名称相同,命名空间与 Pod 一致。
status.identity.id int64 分配给该 Pod 的安全身份数字标识(如 12345)。
status.identity.labels []string 用于计算 Identity 的标签列表(包含 Kubernetes 标签和 Cilium 保留标签)。
status.networking.addressing []AddressPair Pod 的 IP 地址列表(IPv4 和 IPv6)。
status.state string 端点状态:ready、disconnecting、waiting-for-identity 等。
status.policy EndpointPolicy 当前生效的入站/出站策略概览,包括是否被拒绝(denied)。
调试技巧: 使用 kubectl get cep -n <namespace> <pod-name> -o yaml 查看完整 CEP 定义。重点关注 status.identity.labels 是否包含你期望的标签,这是身份计算的基础。

4.2 基于标签的安全身份机制

Cilium 的 Identity 并非静态分配,而是通过 标签选择器 动态计算。当 Pod 的标签发生变化时,Cilium Agent 会重新计算其 Identity,并自动更新所有相关的网络策略规则。

身份计算遵循以下原则:

  • 标签聚合: 将 Pod 的所有 Kubernetes 标签(如 app=frontend、version=v1)与 Cilium 保留标签(如 k8s:io.kubernetes.pod.namespace=default)合并。
  • 哈希映射: 对合并后的标签集合进行哈希运算,生成一个唯一的数字 ID(Identity ID)。
  • 全局唯一: 在同一个 Cilium 集群中,具有完全相同标签集合的 Pod 共享同一个 Identity ID。
常见陷阱: 如果两个 Pod 的标签集合完全相同,它们将拥有相同的 Identity。这意味着针对该 Identity 的网络策略会同时影响这两个 Pod。务必确保不同角色的 Pod 拥有至少一个不同的标签。

4.3 Identity 生命周期与策略映射

下图展示了从 Pod 创建到策略生效的完整身份生命周期:

Cilium Identity 生命周期与策略映射 Cilium Identity 生命周期与策略映射 Pod 创建 标签收集 身份计算 CEP 创建 策略规则匹配 BPF 映射更新 说明: 1. 标签收集:Cilium Agent 监听 Pod 的 Kubernetes 标签变化。 2. 身份计算:基于标签集合的哈希生成全局唯一的 Identity ID。 3. 策略映射:Cilium Agent 将 Identity 与网络策略中的标签选择器进行匹配,并更新 BPF 映射表。

4.4 调试 Identity 的常用命令

以下命令可以帮助你快速定位 Identity 相关问题:

命令 用途
kubectl get cep -A 列出所有 CiliumEndpoint,快速查看 Identity ID 和状态。
kubectl describe cep <pod-name> -n <ns> 查看 CEP 的详细事件,包括身份分配失败的原因。
cilium endpoint list 在 Cilium Agent 节点上查看本地端点列表及其 Identity。
cilium identity get <identity-id> 根据 Identity ID 查询其对应的标签集合。
kubectl get ciliumidentity 列出集群中所有已注册的 CiliumIdentity 资源。
实战案例: 当 Pod 无法通信时,首先检查其 CEP 的 status.identity.id 是否为 0(表示身份未分配)。如果为 0,说明标签计算失败或 Cilium Agent 尚未完成初始化。使用 cilium identity list 确认该标签集合是否已存在。

4.5 身份与策略的关联验证

验证 Identity 是否正确关联到网络策略,是调试的核心步骤。以下是一个典型的验证流程:

  1. 获取目标 Pod 的 Identity: kubectl get cep my-pod -o jsonpath='{.status.identity.id}'
  2. 查看该 Identity 的标签: cilium identity get <id>
  3. 检查网络策略是否匹配: 确认策略中的 matchLabels 或 matchExpressions 是否覆盖了 Identity 的标签集合。
  4. 验证策略生效: 使用 cilium endpoint get <pod-endpoint-id> | jq '.policy' 查看该端点的策略执行结果。
高效调试: 使用 kubectl get cep -o custom-columns=NAME:.metadata.name,IDENTITY:.status.identity.id,STATUS:.status.state 可以快速生成一个简洁的端点状态表格,便于批量排查。