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 的完整通信路径,以及每一层在事务边界中的角色。
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)的集成更加自然。