3. 网络拓扑基础概念:Pod网络、Service网络、Ingress、Egress、网络策略(NetworkPolicy)的核心作用

在 Kubernetes 网络模型中,数据传输效率与网络拓扑的每一层设计紧密相关。理解 Pod 网络、Service 网络、Ingress、Egress 以及网络策略的核心作用,是优化 Helm Values 中网络相关配置的前提。本节将逐一拆解这些基础概念,并揭示它们在数据流路径中的角色。

3.1 网络拓扑五层模型概览

Kubernetes 网络拓扑可抽象为五个核心层次,每一层解决特定的连通性与安全需求。下表总结了各层的作用与典型组件:

层次 核心作用 典型实现/资源 数据流方向
Pod 网络 为每个 Pod 分配唯一 IP,实现 Pod 间直接通信 CNI 插件(Calico、Flannel、Cilium) Pod ↔ Pod
Service 网络 提供稳定的虚拟 IP 和 DNS 名称,实现负载均衡与服务发现 kube-proxy、CoreDNS、Service 对象 Pod → Service → Pod
Ingress 将外部 HTTP/HTTPS 流量路由到集群内部 Service Ingress Controller(Nginx、Traefik、HAProxy) 外部 → Ingress → Service → Pod
Egress 控制 Pod 访问集群外部网络(互联网、外部数据库等) Egress Gateway、NAT、NetworkPolicy Pod → Egress → 外部
网络策略 基于标签选择器定义 Pod 间、Pod 与外部之间的流量规则 NetworkPolicy 资源 控制所有方向
Helm 优化提示: 在 Helm Values 中,网络相关配置通常分布在 networkPolicy、ingress、service 等区块。理解各层职责,有助于在 Values 中精准设置 enabled、annotations、rules 等字段,避免过度开放或遗漏关键策略。

3.2 Pod 网络:通信的原子单元

Pod 网络是 Kubernetes 网络模型的基础。每个 Pod 拥有一个独立的 IP 地址,集群内所有 Pod 可以直接通过该 IP 通信,无需 NAT 转换。这一模型由 CNI(Container Network Interface)插件实现。

  • 核心特性: 每个 Pod 一个 IP,Pod 内所有容器共享该 IP 和网络命名空间。
  • 通信方式: Pod 通过 eth0 接口与宿主机网桥或虚拟网络设备连接。
  • 性能关键点: CNI 插件的封装方式(如 VXLAN、Geneve、直接路由)直接影响吞吐量和延迟。
数据传输效率影响: 在 Helm Values 中,若部署高性能应用(如 AI 训练、实时流处理),应关注 CNI 插件的配置参数(如 MTU、后端类型)。例如,Cilium 的 eBPF 模式可显著降低 Pod 网络延迟。

3.3 Service 网络:稳定的流量入口

由于 Pod 是动态创建和销毁的,其 IP 会频繁变化。Service 网络通过提供一个稳定的虚拟 IP(ClusterIP)和 DNS 名称,解决了 Pod 发现与负载均衡问题。

  • ClusterIP: 默认类型,仅在集群内部可达。
  • NodePort: 在每个节点上开放一个静态端口,外部流量可通过 NodeIP:NodePort 访问。
  • LoadBalancer: 云厂商提供的外部负载均衡器,自动分配公网 IP。
  • Headless Service: 不分配 ClusterIP,直接返回后端 Pod IP 列表,适用于有状态应用。

Service 网络通过 kube-proxy 或 eBPF 实现流量转发,常见的转发模式包括 iptables、IPVS 和 eBPF。其中,IPVS 和 eBPF 在大规模集群中具有更好的性能表现。

3.4 Ingress 与 Egress:南北向流量的控制点

Ingress 和 Egress 分别管理进入和离开集群的流量,是网络拓扑中连接外部世界的关键节点。

Ingress(入站流量)

Ingress 资源定义了从集群外部到内部 Service 的 HTTP/HTTPS 路由规则。它通常需要配合 Ingress Controller(如 Nginx Ingress Controller)才能生效。

  • 核心功能: 基于域名、路径的流量分发、TLS 终止、虚拟主机路由。
  • 性能优化: 调整 Ingress Controller 的 worker 数量、连接超时、缓冲区大小等参数,可显著影响外部请求的响应速度。

Egress(出站流量)

Egress 控制 Pod 访问集群外部资源(如外部 API、数据库、互联网)的流量。在安全要求高的场景中,Egress 流量通常需要经过专用的 Egress Gateway 进行审计、过滤或 NAT。

  • 实现方式: 通过 NetworkPolicy 限制出站目标 IP/端口,或部署 Egress Gateway 组件(如 Istio Egress Gateway)。
  • Helm 配置: 在 Helm Chart 中,Egress 相关配置常与 global.networkPolicy 或 egressGateway 字段关联。

3.5 网络策略:零信任的流量防火墙

NetworkPolicy 是 Kubernetes 原生的网络访问控制机制,基于标签选择器定义 Pod 之间、Pod 与外部端点之间的流量规则。它实现了“零信任”网络模型:默认拒绝所有流量,仅允许显式声明的规则。

  • 核心字段:
    • podSelector:选择策略生效的目标 Pod。
    • policyTypes:指定策略类型(Ingress、Egress 或两者)。
    • ingress:定义允许入站流量的来源(IP 段、命名空间、Pod 标签)。
    • egress:定义允许出站流量的目标。
  • 注意事项: 网络策略由 CNI 插件执行,并非所有 CNI 都支持完整的 NetworkPolicy 功能(如 Flannel 默认不支持)。
常见陷阱: 在 Helm Values 中启用 NetworkPolicy 时,务必确保 CNI 插件支持。若未正确配置,可能导致策略不生效或 Pod 间通信完全中断。建议在 Values 中设置 networkPolicy.enabled: true 前,先验证集群 CNI 的兼容性。

3.6 网络拓扑数据流全景图

下图展示了从外部请求到 Pod 内部,以及 Pod 访问外部服务的完整数据流路径,并标注了各层网络组件的作用位置。

Kubernetes 网络拓扑数据流全景图 外部用户 Ingress Controller Service (ClusterIP) Pod 网络 Pod 网络 Egress Gateway 外部服务/互联网 网络策略 (NetworkPolicy) — 贯穿所有流量的访问控制层 基于标签选择器,定义 Pod 间、Pod 与外部之间的允许/拒绝规则 图例说明: 外部用户/客户端 Ingress 层(入站路由) Service 层(负载均衡) Pod 网络(工作负载) Egress 层(出站控制) 外部服务/互联网 网络策略控制范围

3.7 各层在 Helm Values 中的典型配置映射

在 Helm Chart 中,网络拓扑各层通常对应 Values 文件中的特定区块。下表展示了常见的映射关系,帮助你在优化数据传输效率时快速定位配置项:

网络层 Helm Values 典型路径 关键配置项示例 性能影响
Pod 网络 global.cni.mtu、global.cni.backend mtu: 1500、backend: "vxlan" MTU 过小导致分片,过大导致延迟
Service 网络 service.type、service.annotations type: ClusterIP、externalTrafficPolicy: Local Local 模式保留源 IP,减少跳数
Ingress ingress.enabled、ingress.annotations enabled: true、nginx.ingress.kubernetes.io/proxy-body-size: "10m" 调整 proxy 参数可优化大文件上传
Egress egress.enabled、egress.destinations enabled: true、destinations: ["0.0.0.0/0"] 限制出站范围可减少安全审计开销
网络策略 networkPolicy.enabled、networkPolicy.ingressRules enabled: true、from: [{namespaceSelector: {matchLabels: {name: "monitoring"}}}] 规则过多可能增加 CNI 策略计算延迟

3.8 网络策略的典型规则示例

以下是一个标准的 NetworkPolicy YAML 示例,展示了如何限制特定命名空间中的 Pod 只能被监控命名空间的 Pod 访问:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-monitoring-only
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: web-server
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: monitoring
    ports:
    - protocol: TCP
      port: 8080
Helm 集成建议: 将 NetworkPolicy 模板化到 Helm Chart 中时,建议使用 range 循环动态生成规则,避免硬编码。例如:{{- range .Values.networkPolicy.ingressRules }},这样可以在不修改 Chart 代码的情况下,通过 Values 文件灵活调整策略。