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 地址。
Endpoint 与 Identity 映射关系 Endpoint A Pod: frontend-v1-abc Endpoint B Pod: frontend-v1-xyz Endpoint C Pod: backend-v2-def Identity: 16789 Labels: app=frontend Identity: 45231 Labels: app=backend 映射规则 • A→Identity 16789 • B→Identity 16789 • C→Identity 45231 A与B共享同一 Identity,因为 Label 集合相同 (app=frontend)

3.3 Service 与 Flow 的映射关系

Service 在 Hubble 中被映射为流量路径中的 负载均衡跳转点。当一个 Flow 经过 Service 时,Hubble 会记录其 源 Endpoint、目的 Service 以及 后端 Endpoint 的三元组关系。

运维洞察: 在 Hubble 的 Flow 记录中,destination.service 字段直接显示 Service 名称,而 destination.endpoint 显示实际处理请求的 Pod。这种映射关系帮助运维人员快速区分“流量发往 Service”与“流量到达具体 Pod”两个阶段。

Service 与 Flow 映射关系 源 Endpoint Pod: client-7f8c9d Service my-svc:8080 ClusterIP: 10.96.1.1 后端 Endpoint A Pod: backend-v1-abc 后端 Endpoint B Pod: backend-v1-xyz Hubble Flow 记录示例 src=client-7f8c9d → dst=my-svc:8080 → backend=backend-v1-abc | Verdict: FORWARDED

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 映射关系在准入策略评审中的应用

在进行容器网络准入策略评审时,上述映射关系帮助运维人员回答以下关键问题:

  1. 谁在访问? → 通过 source.endpoint 和 source.identity 确定源 Pod 及其安全身份。
  2. 访问了什么? → 通过 destination.service_name 和 destination.endpoint 确定目标服务及具体后端。
  3. 策略是否允许? → 通过 verdict 和 policy_name 判断流量是否被策略放行。
  4. 为什么被拒绝? → 通过 verdict: DROPPED 结合 destination.identity 反查未匹配的策略规则。

最佳实践: 在 Hubble UI 中,使用 identity 作为过滤条件进行流量审计,比使用 IP 地址更准确。因为 Pod 重启后 IP 会变化,但基于 Label 的 Identity 保持不变,这保证了策略评审结果的可复现性。