2. Kubernetes 网络基础回顾:Pod网络模型、Service与Ingress、网络策略(NetworkPolicy)基础

2.1 Pod 网络模型:IP-per-Pod 与扁平网络

Kubernetes 网络模型的核心原则是 “每个 Pod 拥有一个独立的集群内 IP 地址”,且所有 Pod 之间无需 NAT 即可直接通信。这种设计被称为 IP-per-Pod 模型,它极大地简化了应用从虚拟机/物理机向容器迁移时的网络拓扑。

关键约束:Kubernetes 不内置实现网络,而是依赖 CNI(Container Network Interface)插件(如 Calico、Flannel、Cilium)来满足以下三个基本要求:
  1. 所有 Pod 可以不通过 NAT 与所有其他 Pod 通信。
  2. 所有节点可以不通过 NAT 与所有 Pod 通信。
  3. Pod 看到的自身 IP 与其他人看到的 Pod IP 相同。

下图展示了 Kubernetes 扁平网络模型的核心拓扑:Pod 通过 veth 对连接到节点上的网桥(如 cbr0),CNI 插件负责将 Pod IP 路由到正确的节点,从而实现跨节点通信。

Kubernetes 扁平网络模型:Pod 跨节点通信 Worker Node 1 Pod A 10.1.1.2 Pod B 10.1.1.3 cbr0 (网桥) / 10.1.1.1 eth0 / 192.168.1.10 Worker Node 2 Pod C 10.1.2.2 Pod D 10.1.2.3 cbr0 (网桥) / 10.1.2.1 eth0 / 192.168.1.20 Pod 通过 veth 对连接到节点网桥,CNI 插件维护路由表实现跨节点 Pod IP 可达

2.2 Service:稳定的网络抽象层

Pod 是临时性的,其 IP 地址会随重建而改变。Service 提供了一种 稳定的虚拟 IP(ClusterIP) 和 DNS 名称,将一组 Pod 暴露为单一网络端点。Service 通过标签选择器(Selector)动态关联 Pod,并利用 kube-proxy 实现流量转发。

Service 类型 访问范围 典型用途 实现机制
ClusterIP 集群内部 内部微服务间调用 kube-proxy (iptables/IPVS)
NodePort 集群外部(节点端口) 开发调试、简单外部访问 NodePort → ClusterIP → Pod
LoadBalancer 集群外部(云负载均衡器) 生产环境对外暴露服务 云厂商 LB → NodePort → ClusterIP → Pod
ExternalName 集群外部(DNS CNAME) 将外部服务映射为集群内 DNS CoreDNS 返回 CNAME 记录
网络拓扑视角:Service 的 ClusterIP 是一个虚拟 IP,不绑定任何物理网卡。kube-proxy 在集群所有节点上写入 iptables/IPVS 规则,将发往 ClusterIP 的流量 DNAT 到后端 Pod IP。这意味着 Service 的流量路径是:客户端 → ClusterIP → 节点 iptables 规则 → 后端 Pod。

2.3 Ingress:七层流量入口与路由

Ingress 是 Kubernetes 的 七层(HTTP/HTTPS)流量入口,它位于集群边缘,负责将外部请求根据域名、路径等规则路由到集群内部的 Service。与 Service 的四层转发不同,Ingress 能够识别 HTTP 头部、实现 SSL 终止、基于路径的流量切分等高级功能。

一个典型的 Ingress 资源定义如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 8080
      - path: /web
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

Ingress 控制器(如 NGINX Ingress Controller、Traefik、HAProxy)是实际运行在集群中的 Pod,它读取 Ingress 资源并动态配置反向代理规则。

Ingress 七层流量路由路径 外部用户 DNS 解析 Ingress Controller Service (ClusterIP) Pod 后端 Ingress 路由规则示例 myapp.example.com/api → api-service:8080 myapp.example.com/web → web-service:80 Ingress Controller 根据 Ingress 资源中的 host 和 path 规则,将外部 HTTP/HTTPS 请求 路由到对应的 Service,再由 Service 负载均衡到后端 Pod

2.4 网络策略(NetworkPolicy):Pod 级防火墙

默认情况下,Kubernetes 集群中的网络是“全通”的——任何 Pod 都可以与任何其他 Pod 通信。NetworkPolicy 是一种 以 Pod 为中心的防火墙规则,它通过标签选择器定义哪些 Pod 可以访问目标 Pod,以及目标 Pod 可以访问哪些外部端点。

重要前提:NetworkPolicy 必须由支持它的 CNI 插件(如 Calico、Cilium、Weave Net)实现。Flannel 默认不支持 NetworkPolicy。如果集群未安装支持策略的 CNI,NetworkPolicy 资源会被创建但不会生效。

2.4.1 NetworkPolicy 核心结构

一个 NetworkPolicy 资源包含以下关键字段:

字段 作用 示例值
podSelector 选择策略作用的 Pod(目标 Pod) matchLabels: { app: web }
policyTypes 指定策略类型:Ingress(入站)、Egress(出站) ["Ingress", "Egress"]
ingress[].from 允许哪些来源访问目标 Pod ipBlock、namespaceSelector、podSelector
egress[].to 允许目标 Pod 访问哪些目的地 ipBlock、namespaceSelector、podSelector
ports 限制允许的端口和协议 protocol: TCP, port: 80

2.4.2 典型策略示例:隔离前端与后端

以下策略实现:只允许带有 app: frontend 标签的 Pod 访问带有 app: backend 标签的 Pod 的 8080 端口:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-allow-frontend
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

2.4.3 网络策略的拓扑影响

在 Helm 网络拓扑资源配额配置中,NetworkPolicy 是 资源配额之外的安全控制层。资源配额(ResourceQuota)限制 Pod 的 CPU/内存,而 NetworkPolicy 限制 Pod 的网络可达性。两者结合可以实现“资源隔离 + 网络隔离”的双重保障。

Helm 集成要点:在 Helm Chart 的 values.yaml 中,可以设计 networkPolicy.enabled 开关,并通过模板动态生成 NetworkPolicy 资源。例如:
{{- if .Values.networkPolicy.enabled }}
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: {{ include "myapp.fullname" . }}
spec:
  podSelector:
    matchLabels:
      {{- include "myapp.selectorLabels" . | nindent 6 }}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          {{- toYaml .Values.networkPolicy.allowedLabels | nindent 10 }}
{{- end }}

2.5 网络基础与 Helm 配额策略的关联

理解上述网络基础对于实现 Helm 网络拓扑资源配额配置至关重要:

  • Pod 网络模型决定了每个 Pod 拥有独立 IP,资源配额(如 pods、count/pods)直接影响集群 IP 地址的消耗密度。
  • Service 与 Ingress 是流量入口,配额策略需要确保每个命名空间下的 Service 数量、Ingress 数量不超过集群负载能力,避免控制平面过载。
  • NetworkPolicy 是网络隔离的基石,在 Helm Chart 中通过模板化生成策略,可以实现“按租户/环境”的精细化网络访问控制,与资源配额形成互补。