4、CiliumEndpoint 与 Identity:Endpoint CRD、安全标识(Security Identity)、标签到 Identity 的映射
Cilium 的网络策略与流量管控核心建立在两个关键抽象之上:CiliumEndpoint(CEP) 和 Security Identity(安全标识)。CEP 是 Kubernetes 原生 Endpoint 的增强版,而 Identity 则是 Cilium 实现“身份即网络边界”的基石。理解这两个对象及其映射关系,是掌握 Cilium 可视化排障与安全策略的前提。
4.1 CiliumEndpoint(CEP)CRD
CiliumEndpoint 是一个自定义资源(CRD),为每个 Pod(或节点)提供细粒度的网络与安全状态视图。它比 Kubernetes 原生的 Endpoint 包含更多信息,是 Cilium Agent 与集群状态同步的核心数据结构。
| 字段 | 说明 | 排障用途 |
|---|---|---|
| Identity ID | 分配给该 Endpoint 的安全标识 ID | 确认 Pod 所属的安全组,快速定位策略匹配问题 |
| Labels | 从 Pod 继承的标签集合 | 验证标签是否被正确继承,排查策略未生效的根因 |
| Networking | Pod IP、Node IP、接口索引等 | 确认网络连通性基础信息,排查 IP 冲突或路由错误 |
| Encryption | 是否启用 WireGuard/IPsec 加密 | 验证加密状态,排查加密隧道未建立的问题 |
| State | Endpoint 状态(ready、waiting-for-identity 等) | 快速判断 Pod 是否已就绪,定位启动卡住的原因 |
排障提示: 当 Pod 网络策略不生效时,首先检查对应 CEP 的 state 是否为 ready,以及 identity-id 是否与预期一致。使用 kubectl get cep -n <namespace> 可快速列出所有 CEP。
4.2 Security Identity(安全标识)
Security Identity 是 Cilium 为每个逻辑安全组分配的全局唯一整数 ID。它不是绑定到单个 Pod,而是绑定到一组具有相同标签集合的 Pod。这种设计使得策略规则可以基于“身份”而非“IP”编写,大幅提升动态环境的策略稳定性。
- ID 范围: 1–65535,其中 1–255 为保留 ID(如
host、remote-node、cluster等),256–65535 为动态分配。 - 生命周期: Identity 在标签集合首次出现时创建,在最后一个引用它的 Endpoint 删除后,经过 GC 回收。
- 全局性: 同一集群内,相同标签集合的 Pod 共享同一个 Identity ID,无论它们分布在哪个节点。
核心概念: 在 Cilium 中,网络策略的源/目的不再是 IP 地址,而是 Security Identity。这意味着 Pod 迁移或滚动更新时,只要标签不变,策略自动生效,无需修改任何规则。
4.3 标签到 Identity 的映射机制
Cilium 通过 Label Source 和 Label Selector 实现从 Kubernetes 标签到 Security Identity 的映射。映射过程由 Cilium Operator 和 Cilium Agent 协同完成。
- 标签收集: Cilium Agent 监听 Pod 事件,提取 Pod 的 Labels(包括 Kubernetes 原生标签和 Cilium 自定义标签)。
- 标签规范化: 将标签转换为
key=value格式,并附加来源前缀(如k8s:、container:)。 - Identity 分配: Agent 将规范化后的标签集合发送给 Cilium Operator,Operator 查询本地缓存:
- 若已存在匹配的 Identity,则复用该 ID。
- 若不存在,则分配一个新的全局唯一 ID,并写入 KV 存储(etcd/CRD)。
- CEP 更新: Agent 将获取到的 Identity ID 写入对应 CEP 的
identity-id字段,完成映射。
避坑指南: 标签变更不会自动触发 Identity 重新分配。只有当 Pod 重启或 Endpoint 重建时,才会重新计算 Identity。若需要立即生效,可手动删除 CEP 对象,Cilium 会自动重建并分配新 Identity。
4.4 映射关系可视化
下图展示了从 Pod 标签到 Security Identity 的完整映射流程,以及 CEP 在其中扮演的桥梁角色。
4.5 排障实战:验证 Identity 映射
当网络策略未按预期生效时,可通过以下步骤快速验证 Identity 映射是否正确:
# 1. 查看目标 Pod 的 CEP,确认 identity-id
kubectl get cep <pod-name> -n <namespace> -o yaml | grep identity-id
# 2. 查看该 Identity 对应的标签集合
kubectl get ciliumidentity 1024 -o yaml
# 3. 对比 Pod 标签与 Identity 标签是否一致
kubectl get pod <pod-name> -n <namespace> --show-labels
# 4. 若不一致,手动删除 CEP 触发重建
kubectl delete cep <pod-name> -n <namespace>
可视化排障技巧: 使用 cilium endpoint list 命令可实时查看节点上所有 Endpoint 的 Identity ID 和标签映射状态。结合 Hubble UI 的 Identity 视图,可以直观看到哪些 Pod 属于同一个安全组。
4.6 Identity 与网络策略的关联
Security Identity 是 CiliumNetworkPolicy 和 CiliumClusterwideNetworkPolicy 的匹配基础。策略规则中的 fromEndpoints / toEndpoints 字段实际上是在匹配 Identity 而非 Pod IP。
| 策略字段 | 匹配对象 | 底层机制 |
|---|---|---|
fromEndpoints |
源端 Identity | 匹配源 Pod 所属的 Security Identity |
toEndpoints |
目的端 Identity | 匹配目的 Pod 所属的 Security Identity |
fromCIDR |
IP 地址段 | 直接匹配 IP,不经过 Identity 映射 |
toCIDR |
IP 地址段 | 直接匹配 IP,不经过 Identity 映射 |
最佳实践: 优先使用 fromEndpoints / toEndpoints 编写策略,避免硬编码 IP。这样在 Pod 滚动更新或扩缩容时,策略自动适配,无需人工干预。