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 创建到策略生效的完整身份生命周期:
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 是否正确关联到网络策略,是调试的核心步骤。以下是一个典型的验证流程:
- 获取目标 Pod 的 Identity:
kubectl get cep my-pod -o jsonpath='{.status.identity.id}' - 查看该 Identity 的标签:
cilium identity get <id> - 检查网络策略是否匹配: 确认策略中的
matchLabels或matchExpressions是否覆盖了 Identity 的标签集合。 - 验证策略生效: 使用
cilium endpoint get <pod-endpoint-id> | jq '.policy'查看该端点的策略执行结果。
高效调试: 使用
kubectl get cep -o custom-columns=NAME:.metadata.name,IDENTITY:.status.identity.id,STATUS:.status.state 可以快速生成一个简洁的端点状态表格,便于批量排查。