Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

发布于:2025-06-10 ⋅ 阅读:(21) ⋅ 点赞:(0)

Pod IP 的本质与特性

Pod IP 的定位

  • 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2
  • 无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”
  • 生命周期:与 Pod 绑定,随 Pod 重建而改变
分配
分配
Pod
Pod IP
CNI 插件
子网 10.244.0.0/16

Pod IP 的关键特性

  1. 直接可达性
    • 集群内任何节点/Pod 可直接访问
    • 无需 NAT(取决于网络插件)
  2. 临时性
    • Pod 重建时 IP 会改变
    • 不适合直接用于服务发现
  3. 网络隔离
    • 不同命名空间的 Pod 默认互通
    • 可通过 NetworkPolicy 限制访问

Service:智能负载均衡抽象层

Service 本质上是为一组 Pod 提供的负载均衡抽象。具体来说:

Service 的三种核心 IP/Port 类型

类型 访问范围 实现方式 示例
ClusterIP 仅集群内部 虚拟 IP + iptables/IPVS 10.96.91.238:8000
NodePort 全网可访问 节点端口映射 <NodeIP>:30948
LoadBalancer 外部流量 云厂商负载均衡器集成 云厂商提供的公网 IP

Service 负载均衡架构

NodePort
ClusterIP
外部用户
Node:30948
Pod客户端
Service:10.96.91.238:8000
负载均衡
Pod 10.244.1.2:80
Pod 10.244.1.3:80
Pod 10.244.2.4:80

负载均衡实现细节

  1. Endpoint 自动管理

    # kubectl get endpoints my-dep
    NAME     ENDPOINTS                                   AGE
    my-dep   10.244.1.2:80,10.244.1.3:80,10.244.2.4:80  1d
    
  2. 流量分发算法

    • 默认:随机轮询(RR)
    • 可选:会话保持(sessionAffinity)
    • 高级:Istio 的权重分流
  3. 健康检查机制

    • 自动移除不健康的 Pod
    • 通过 readinessProbe 判断
    readinessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    

为什么需要 Service 抽象层?

解决 Pod 直连的四大问题

  1. 动态性问题
    Pod 可能随时扩缩容/重建,IP 不可靠

  2. 服务发现问题
    客户端如何知道哪些 Pod 可用?

  3. 负载均衡需求
    流量如何均匀分发到多个副本?

  4. 访问策略统一
    如何实施一致的流量策略(如超时、重试)?

Service 的解决方案

更新
固定地址
负载均衡
Pod变化
Endpoint控制器
Service
客户端

实际访问场景对比

场景 1:集群内部访问

# 通过 ClusterIP 访问
curl http://10.96.91.238:8000

# 通过 DNS 访问(推荐)
curl http://my-dep.default.svc.cluster.local:8000

路径
客户端 → Service 虚拟 IP → iptables 规则 → 后端 Pod

场景 2:外部用户访问

# 通过 NodePort 访问
curl http://<任意节点IP>:30948

路径
用户 → 节点 IP:30948 → kube-proxy → Service → 后端 Pod

场景 3:云环境访问

# 通过 LoadBalancer IP
curl http://<云负载均衡IP>

路径
用户 → 云 LB → NodePort → Service → 后端 Pod

高级负载均衡模式

1. 拓扑感知路由

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  topologyKeys: ["topology.kubernetes.io/zone"]

2. 流量镜像

apiVersion: networking.k8s.io/v1
kind: Service
metadata:
  name: mirror-service
spec:
  ports:
  - port: 80
  selector:
    app: frontend
  trafficPolicy:
    mirror:
      service: debug-service

3. 基于权重的金丝雀发布

apiVersion: split.smi-spec.io/v1alpha1
kind: TrafficSplit
metadata:
  name: canary-split
spec:
  service: my-service
  backends:
  - service: v1
    weight: 90
  - service: v2
    weight: 10

生产环境实践

1. 服务命名规范

# 好名字:明确表达服务功能
metadata:
  name: payment-service

# 坏名字:无意义标识
metadata:
  name: svc-1234

2. 端口管理策略

ports:
- name: http   # 使用命名端口
  port: 8080
  targetPort: web
- name: metrics
  port: 9090
  targetPort: 9090

3. 结合 Ingress 使用

apiVersion: networking.k8s.io/v1
kind: Ingress
spec:
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /v1/payments
        pathType: Prefix
        backend:
          service:
            name: payment-service
            port:
              number: 8080

4. 网络策略加固

kind: NetworkPolicy
spec:
  podSelector:
    matchLabels:
      app: payment-service
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          env: prod
    ports:
    - protocol: TCP
      port: 8080

结论:Service 的核心价值

这种设计解决了分布式系统中的关键问题:

  1. 稳定性
    提供固定访问端点,隔离 Pod 变化

  2. 可发现性
    通过 DNS 实现服务自动发现

  3. 扩展性
    无缝支持 Pod 水平扩缩容

  4. 流量管理
    内置负载均衡和会话保持能力

  5. 策略统一
    在单一入口实施安全/监控策略

理解 Pod IP 作为基础网络端点与 Service 作为智能抽象层的关系,是掌握 Kubernetes 服务网络的核心。这种分层设计使 Kubernetes 既能保持基础设施的灵活性,又能为应用提供稳定的服务访问体验。