2. Kubernetes 原生通信模型:Pod间通信、Service抽象、Ingress与Gateway API基础

在微服务架构中,服务实例之间的可靠通信是事务边界正确性的前提。Kubernetes 提供了从 Pod 网络直连到南北向流量治理的完整通信模型。理解这一模型的每一层抽象,是设计跨服务 API 事务边界的基础。

2.1 Pod 间通信:扁平网络与 IP 直连

Kubernetes 要求所有 Pod 在同一个扁平网络地址空间中运行,无需 NAT 即可直接通信。这一设计消除了传统微服务中端口映射和地址转换的复杂性。

通信场景 网络规则 典型实现
Pod ↔ Pod(同节点) 通过 cbr0/bridge 直接转发 Flannel VXLAN / Calico BGP
Pod ↔ Pod(跨节点) 通过 overlay 或路由协议互通 Calico IPIP / Cilium eBPF
Pod ↔ Node Pod IP 可达宿主机 kube-proxy + 路由规则
Pod ↔ 外部网络 通过 NodePort / LoadBalancer 出站 iptables MASQUERADE
关键约束:Pod IP 是动态分配的,Pod 重启后 IP 会变化。因此微服务之间不能直接依赖 Pod IP 进行通信,必须引入 Service 抽象层。

2.2 Service 抽象:稳定的通信端点

Service 为一组 Pod 提供稳定的虚拟 IP(ClusterIP)和 DNS 名称,实现客户端与后端实例的解耦。这是微服务事务边界中“服务发现”与“负载均衡”的核心机制。

  • ClusterIP(默认):集群内可达的虚拟 IP,通过 kube-proxy 的 iptables/IPVS 规则转发到后端 Pod。
  • NodePort:在每个节点上开放一个静态端口,外部流量通过 NodeIP:NodePort 进入集群。
  • LoadBalancer:云厂商提供的外部负载均衡器,自动分配公网 IP,流量直达 NodePort 或直接转发到 Pod。
  • Headless Service:不分配 ClusterIP,直接返回后端 Pod IP 列表,适用于 StatefulSet 的有状态通信。
事务边界提示:在跨服务 API 调用中,应始终使用 Service DNS 名称(如 order-service.namespace.svc.cluster.local)作为通信目标,而非 Pod IP。这保证了事务上下文的稳定性。

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

Ingress 是 Kubernetes 原生的七层(HTTP/HTTPS)流量入口资源,负责将外部请求按域名或路径路由到集群内的 Service。对于微服务 API 网关场景,Ingress 是事务边界的“第一道防线”。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-gateway
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /orders(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: order-service
            port:
              number: 8080
      - path: /payments(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: payment-service
            port:
              number: 8080
局限性:Ingress 资源本身不支持高级流量治理(如超时、重试、熔断、速率限制)。这些能力需要依赖 Ingress Controller 的注解或 CRD 扩展,导致配置分散且不可移植。

2.4 Gateway API:下一代流量治理标准

Gateway API 是 Kubernetes SIG-Network 推出的新一代 API,旨在替代 Ingress,提供更丰富的流量治理原语。它将流量管理拆分为三个独立角色:GatewayClass(基础设施提供商)、Gateway(流量入口实例)、HTTPRoute(路由规则)。

对比维度 Ingress Gateway API
资源模型 单一资源 GatewayClass / Gateway / Route 三层分离
协议支持 HTTP/HTTPS 为主 HTTP、gRPC、TCP、UDP、TLS
流量治理 依赖注解/CRD 原生支持超时、重试、镜像、跨命名空间引用
后端路由 仅 Service Service、BackendRef、自定义后端
多团队隔离 弱(共享 Ingress 资源) 强(Route 可跨命名空间绑定 Gateway)
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: order-route
  namespace: orders
spec:
  parentRefs:
  - name: external-gateway
    namespace: infra
  hostnames:
  - "api.example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /orders
    backendRefs:
    - name: order-service
      port: 8080
    timeouts:
      request: 30s
    filters:
    - type: RequestMirror
      requestMirror:
        backendRef:
          name: order-service-shadow
          port: 8080
事务边界价值:Gateway API 的 timeouts、retry、filters 等原生字段,使得 API 事务边界的超时控制、幂等重试、流量镜像等策略可以直接在声明式配置中定义,无需额外 Sidecar 或代理层。

2.5 通信模型全景图

下图展示了从外部客户端到后端 Pod 的完整通信路径,以及每一层在事务边界中的角色。

Kubernetes 原生通信模型全景图 外部客户端 Gateway / Ingress Service (ClusterIP) Pod 副本组 Pod A (10.0.1.5) Pod B (10.0.2.8) Pod C (10.0.3.2) 扁平网络 CNI: Calico / Cilium Pod IP 直连 无 NAT 通信 事务边界通信要点: 1. 外部请求 → Gateway/Ingress:进行 TLS 终止、路径路由、速率限制(事务入口边界) 2. Service 层:提供稳定 DNS 端点,实现负载均衡与故障转移(服务发现边界) 3. Pod 间扁平网络:支持 Sidecar 注入、mTLS、分布式追踪(数据面边界)

2.6 通信模型选择决策矩阵

在实际微服务项目中,应根据事务边界的要求选择合适的通信模型。下表总结了不同场景下的推荐方案。

场景 推荐模型 事务边界考量
集群内服务间同步调用 Service (ClusterIP) + DNS 利用 Service 的稳定端点实现请求重试与超时
外部 HTTP API 暴露 Gateway API + HTTPRoute 原生支持超时、重试、请求镜像,便于事务补偿
gRPC 双向流通信 Headless Service + 客户端负载均衡 直接获取 Pod IP,避免代理层引入的延迟抖动
多集群联邦通信 ServiceExport + Multi-Cluster Service API 跨集群服务发现,保持全局事务上下文一致性
有状态服务(数据库、消息队列) StatefulSet + Headless Service 稳定的网络标识(Pod 名称 + 序号),支持事务日志复制
最佳实践:对于新项目,建议直接采用 Gateway API 替代 Ingress。Gateway API 的 HTTPRoute 支持跨命名空间引用,更适合微服务多团队协作场景,且与 Service Mesh(如 Istio)的集成更加自然。