4. 网络拓扑数据模型:Kubernetes NetworkPolicy、Service Mesh 拓扑、CNI 插件数据源(Calico/Cilium)
在多租户隔离场景下,网络拓扑数据模型是理解流量路径、实施安全策略和进行故障定位的基础。本章深入剖析三种核心数据源:原生的 Kubernetes NetworkPolicy、Service Mesh 的拓扑抽象,以及 CNI 插件(Calico/Cilium)提供的增强数据模型。理解这些模型的差异与互补关系,是构建高效 Argo CD 查询优化策略的前提。
4.1 Kubernetes NetworkPolicy:原生网络隔离模型
Kubernetes NetworkPolicy 是一种声明式的、基于标签选择器的网络访问控制模型。它工作在 L3/L4 层,通过 podSelector、namespaceSelector 和 ipBlock 定义流量规则。
| 属性 | 说明 | 多租户场景示例 |
|---|---|---|
podSelector |
选择策略生效的目标 Pod | app: frontend |
policyTypes |
指定策略类型(Ingress / Egress) | ["Ingress", "Egress"] |
ingress[].from |
定义入站流量的来源 | 允许同 Namespace 内 Pod 访问 |
egress[].to |
定义出站流量的目标 | 允许访问 DNS 服务器 IP |
ports |
限制目标端口和协议 | protocol: TCP, port: 8080 |
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant-a-frontend-policy
namespace: tenant-a
spec:
podSelector:
matchLabels:
app: frontend
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
tenant: tenant-a
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 8080
spec.podSelector 和 metadata.namespace 作为过滤条件,避免全量扫描。对于多租户环境,建议为每个租户的 Namespace 打上统一的标签(如 tenant: tenant-a),以便通过 namespaceSelector 快速聚合策略。
4.2 Service Mesh 拓扑:L7 层精细化流量模型
Service Mesh(如 Istio、Linkerd)在 NetworkPolicy 之上构建了更丰富的 L7 层拓扑模型。它通过 Sidecar Proxy 拦截所有进出 Pod 的流量,并生成详细的遥测数据,包括请求延迟、错误率、HTTP 路由规则和 mTLS 状态。
Service Mesh 拓扑数据模型的核心组件包括:
- VirtualService / DestinationRule: 定义流量路由、超时、重试和熔断策略。
- ServiceEntry: 将外部服务注册到网格内,实现统一治理。
- AuthorizationPolicy: 提供 L7 层的访问控制,支持 JWT、RBAC 等认证方式。
- Telemetry(遥测): 通过 Envoy 的 Access Log 和 Metrics 生成服务依赖图。
--since=5m)和标签过滤条件,否则可能导致 API Server 负载过高或查询超时。
4.3 CNI 插件数据源:Calico 与 Cilium 的增强模型
CNI 插件不仅负责 Pod 网络连通性,还提供了远超原生 Kubernetes 的网络策略能力和拓扑数据源。Calico 和 Cilium 是当前最主流的两个选择,它们在数据模型上各有侧重。
| 特性维度 | Calico | Cilium |
|---|---|---|
| 策略模型 | 基于 iptables / eBPF,支持 NetworkPolicy 增强(GlobalNetworkPolicy) | 基于 eBPF,原生支持 L3-L7 策略,集成 Envoy |
| 拓扑数据 | 通过 calicoctl 或 Felix 日志提供端点、策略命中计数 |
通过 Hubble 提供完整的服务依赖图、流日志、DNS 解析记录 |
| 多租户隔离 | 支持租户级网络策略(通过 Namespace 或标签) | 支持基于 CiliumNetworkPolicy 的租户隔离,支持 ClusterMesh 跨集群 |
| 查询接口 | Kubernetes API + CRD(networkpolicies.crd.projectcalico.org) |
Kubernetes API + Hubble Relay(gRPC / CLI) |
| 样本留存 | Felix 日志可配置留存周期,默认较短 | Hubble 支持流日志持久化到对象存储(如 S3) |
4.3.1 Calico 数据模型
Calico 通过 CRD 扩展了 Kubernetes 网络策略模型,引入了 GlobalNetworkPolicy 和 NetworkPolicy(与原生兼容但功能更强)。其拓扑数据主要来源于:
- Felix: Calico 的代理组件,负责在节点上编程 iptables 或 eBPF 规则,并记录策略命中日志。
- calicoctl: 命令行工具,可查询端点状态、策略应用情况和 IP 池分配。
- Typha: 大规模集群中的通信枢纽,减少 Felix 对 API Server 的压力。
# 查询所有 Calico 网络策略(包括全局策略)
kubectl get globalnetworkpolicies.crd.projectcalico.org -A
# 查看特定策略的详细规则
kubectl describe globalnetworkpolicies.crd.projectcalico.org allow-tenant-a-egress
4.3.2 Cilium 数据模型
Cilium 基于 eBPF 技术,提供了更细粒度的可观测性和策略执行能力。其核心拓扑数据源是 Hubble,它能够捕获所有网络流量的元数据,并构建实时服务依赖图。
# 使用 Hubble CLI 查询最近 5 分钟的流日志
hubble observe --since 5m --namespace tenant-a --protocol http
# 查看服务依赖图(JSON 格式)
hubble observe --since 1h --output json | jq '. | {source: .source.namespace, destination: .destination.namespace, verdict: .verdict}'
4.4 数据模型对比与 Argo CD 查询策略
在实际的多租户环境中,这三种数据模型往往共存。Argo CD 在查询网络拓扑时,需要根据数据源的特点选择最优的查询路径。
| 数据源 | 查询粒度 | 实时性 | 历史留存 | Argo CD 推荐查询方式 |
|---|---|---|---|---|
| NetworkPolicy | L3/L4 策略规则 | 高(实时 CRD) | 无(仅当前状态) | kubectl get networkpolicies -n <ns> -o yaml |
| Service Mesh | L7 路由/遥测 | 中(秒级延迟) | 可配置(Prometheus / 日志) | 通过 Prometheus 查询指标,避免直接查询 Envoy |
| Calico | L3/L4 增强策略 | 高(CRD + Felix 日志) | 短(Felix 日志轮转) | 使用 calicoctl 或 CRD 查询策略状态 |
| Cilium / Hubble | L3-L7 流日志 | 高(eBPF 实时捕获) | 长(对象存储持久化) | 使用 Hubble CLI 或 gRPC API,指定时间范围和标签 |