3. Hubble 基础概念:Endpoint、Identity、Service、Flow、Policy 在 Hubble 中的映射关系
在 Hubble 的观测体系中,Cilium 的底层网络对象被映射为可观测的语义单元。理解 Endpoint、Identity、Service、Flow 与 Policy 这五个核心概念在 Hubble 中的映射关系,是进行流量可视化和准入策略评审的基础。这些映射将内核层的 eBPF 事件转化为运维人员能够直接理解的网络通信视图。
3.1 核心概念映射总览
下表展示了 Cilium 内部对象与 Hubble 观测层之间的对应关系,以及它们在运维场景中的实际含义:
| Cilium 内部对象 | Hubble 观测层映射 | 运维语义 | 关键标识 |
|---|---|---|---|
| Endpoint | 流量源/目的节点 | 容器/Pod 的网络接口 | Pod Name + Namespace + IP |
| Identity | 安全标签集合 | 基于 Label 的身份标识 | Security ID (Numeric) |
| Service | 负载均衡入口 | ClusterIP / NodePort 抽象 | Service Name + Port |
| Flow | 网络事件记录 | 一次完整的请求-响应交互 | 5-tuple + Verdict + Timestamp |
| Policy | 准入规则判定依据 | 允许/拒绝流量的规则集 | Ingress/Egress Rules + Labels |
3.2 Endpoint 与 Identity 的映射关系
Endpoint 是 Hubble 观测的最小单元,代表一个运行中的容器网络接口。每个 Endpoint 在 Cilium 内部都关联一个唯一的 Identity,该 Identity 由 Pod 的 Kubernetes Label 集合通过哈希计算得出。
关键映射规则:
- 一个 Endpoint 有且仅有一个 Identity。
- 多个拥有相同 Label 集合的 Endpoint 共享同一个 Identity。
- Identity 是 Policy 判定时的核心依据,而非 IP 地址。
3.3 Service 与 Flow 的映射关系
Service 在 Hubble 中被映射为流量路径中的 负载均衡跳转点。当一个 Flow 经过 Service 时,Hubble 会记录其 源 Endpoint、目的 Service 以及 后端 Endpoint 的三元组关系。
运维洞察: 在 Hubble 的 Flow 记录中,destination.service 字段直接显示 Service 名称,而 destination.endpoint 显示实际处理请求的 Pod。这种映射关系帮助运维人员快速区分“流量发往 Service”与“流量到达具体 Pod”两个阶段。
3.4 Policy 在 Flow 中的映射与判定
Policy 在 Hubble 中并不直接存储为 Flow 的一部分,而是通过 Verdict 字段映射到每条 Flow 记录。当一条流量经过 Cilium 的 eBPF 程序时,Policy 的判定结果会直接写入 Flow 的 Verdict 字段。
| Policy 判定结果 | Hubble Verdict 值 | 运维含义 | 常见原因 |
|---|---|---|---|
| 允许通过 | FORWARDED |
流量被策略明确允许 | Ingress/Egress 规则匹配 |
| 明确拒绝 | DROPPED |
流量被策略明确拒绝 | Deny 规则命中 / 无 Allow 规则 |
| 策略未覆盖 | FORWARDED (默认允许模式) 或 DROPPED (默认拒绝模式) |
取决于 Cilium 的全局配置 | 未匹配任何 NetworkPolicy |
| HTTP 策略拒绝 | DROPPED (L7 策略) |
L7 协议或路径不匹配 | HTTP Method / Path 违规 |
准入策略评审要点: 在 Hubble 中查看 Flow 时,务必关注 verdict 和 policy_name 字段。如果一条 Flow 的 Verdict 为 DROPPED 但 policy_name 为空,说明流量被全局默认拒绝策略拦截,而非某个具体的 CiliumNetworkPolicy 规则。
3.5 五元组映射与 Hubble Flow 结构
Hubble 将 eBPF 捕获的网络事件映射为结构化的 Flow 对象。以下是一个典型的 Hubble Flow 在 JSON 格式下的关键字段映射:
{
"time": "2025-01-15T10:30:00.123456789Z",
"verdict": "FORWARDED",
"ethernet": {
"source": "0a:0b:0c:0d:0e:0f",
"destination": "1a:2b:3c:4d:5e:6f"
},
"IP": {
"source": "10.0.1.5",
"destination": "10.0.2.10"
},
"l4": {
"TCP": {
"source_port": 34567,
"destination_port": 8080
}
},
"source": {
"endpoint": "endpoint-abc123", // 映射到 Endpoint
"identity": 16789, // 映射到 Identity
"labels": ["k8s:app=frontend"],
"pod_name": "frontend-v1-abc",
"namespace": "prod"
},
"destination": {
"endpoint": "endpoint-def456", // 映射到 Endpoint
"identity": 45231, // 映射到 Identity
"service_name": "my-svc", // 映射到 Service
"pod_name": "backend-v1-xyz",
"namespace": "prod"
},
"policy_name": "allow-frontend-to-backend" // 映射到 Policy
}
3.6 映射关系在准入策略评审中的应用
在进行容器网络准入策略评审时,上述映射关系帮助运维人员回答以下关键问题:
- 谁在访问? → 通过
source.endpoint和source.identity确定源 Pod 及其安全身份。 - 访问了什么? → 通过
destination.service_name和destination.endpoint确定目标服务及具体后端。 - 策略是否允许? → 通过
verdict和policy_name判断流量是否被策略放行。 - 为什么被拒绝? → 通过
verdict: DROPPED结合destination.identity反查未匹配的策略规则。
最佳实践: 在 Hubble UI 中,使用 identity 作为过滤条件进行流量审计,比使用 IP 地址更准确。因为 Pod 重启后 IP 会变化,但基于 Label 的 Identity 保持不变,这保证了策略评审结果的可复现性。