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 资源 | 控制所有方向 |
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、直接路由)直接影响吞吐量和延迟。
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 默认不支持)。
networkPolicy.enabled: true 前,先验证集群 CNI 的兼容性。
3.6 网络拓扑数据流全景图
下图展示了从外部请求到 Pod 内部,以及 Pod 访问外部服务的完整数据流路径,并标注了各层网络组件的作用位置。
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
range 循环动态生成规则,避免硬编码。例如:{{- range .Values.networkPolicy.ingressRules }},这样可以在不修改 Chart 代码的情况下,通过 Values 文件灵活调整策略。