Kubernetes服务发现与负载均衡深度解析

一、Service:服务抽象的基石

Service是Kubernetes中实现服务发现的核心抽象,它为Pod集合提供稳定的访问端点。

1.1 Service核心类型

图1

ClusterIP(默认类型)

  • 特点:集群内部虚拟IP,自动分配
  • 典型场景:微服务间内部通信
  • 示例:

    apiVersion: v1
    kind: Service
    metadata:
    name: backend-service
    spec:
    selector:
      app: backend
    ports:
      - protocol: TCP
        port: 80
        targetPort: 8080

NodePort

  • 特点:在ClusterIP基础上,在每个节点开放静态端口(30000-32767)
  • 典型场景:开发测试环境外部访问
  • 示例:

    apiVersion: v1
    kind: Service
    metadata:
    name: frontend-service
    spec:
    type: NodePort
    selector:
      app: frontend
    ports:
      - port: 80
        targetPort: 80
        nodePort: 30080

LoadBalancer

  • 特点:云厂商集成,自动创建外部负载均衡器
  • 典型场景:生产环境公网暴露服务
  • 示例:

    apiVersion: v1
    kind: Service
    metadata:
    name: api-gateway
    spec:
    type: LoadBalancer
    selector:
      app: gateway
    ports:
      - port: 443
        targetPort: 8443

实践建议

  1. 生产环境优先使用LoadBalancer+Ingress组合
  2. 避免直接使用NodePort暴露关键服务
  3. 跨命名空间访问使用<service-name>.<namespace>.svc.cluster.local

二、Ingress:智能流量路由

2.1 Ingress与Controller关系

图2

主流Ingress Controller对比:

方案特点适用场景
Nginx功能全面,性能优秀通用Web服务
Traefik动态配置,内置Dashboard快速迭代环境
ALBAWS深度集成,无需维护AWS生态

2.2 典型Ingress配置

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

高级功能实践

  1. 金丝雀发布:通过annotation实现流量切分

    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "20"
  2. 跨域配置:

    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: "*"

三、CoreDNS:集群DNS解析

Kubernetes DNS解析规则:

  • Service:<svc>.<ns>.svc.cluster.local
  • Pod:<pod-ip>.<ns>.pod.cluster.local

调试技巧

# 检查DNS解析
kubectl run -it --rm --image=infoblox/dnstools:latest dnstools
> nslookup backend-service.default

四、外部流量策略精要

4.1 ExternalTrafficPolicy选项

图3

  • Cluster(默认):

    • 流量可能跨节点转发
    • 保留客户端源IP(需要云厂商支持)
  • Local

    • 仅路由到本节点Pod
    • 保留真实客户端IP
    • 需要配合externalTrafficPolicy: Local使用

生产建议

  1. 需要保留客户端IP时使用Local模式
  2. 节点数量少时慎用Local模式(可能导致负载不均)
  3. 结合service.spec.healthCheckNodePort实现健康检查

五、实战架构示例

电商系统典型架构:

外部用户 -> CDN -> [LoadBalancer Service] -> [Ingress Nginx] 
-> [内部ClusterIP Services] -> [业务Pods]
                -> [Redis ClusterIP] 
                -> [MySQL Headless Service]

性能优化要点

  1. 使用sessionAffinity: ClientIP保持会话粘性
  2. 合理设置terminationGracePeriodSeconds实现优雅终止
  3. 监控指标关注:

    • 服务延迟(P99)
    • DNS查询耗时
    • Ingress Controller吞吐量

六、常见问题排查指南

  1. 服务不可达检查清单:

    • Service selector是否匹配Pod标签
    • Endpoints是否正常(kubectl get endpoints
    • 网络策略是否放行
    • kube-proxy是否正常运行
  2. DNS解析失败处理:

    # 检查CoreDNS运行状态
    kubectl -n kube-system get pods -l k8s-app=kube-dns
    
    # 查看DNS配置
    kubectl exec -it <pod> -- cat /etc/resolv.conf
  3. Ingress不生效排查:

    • 确认Ingress Controller已安装
    • 检查Ingress资源events(kubectl describe ingress
    • 验证Controller日志

通过本文介绍的核心机制和实战经验,开发者可以构建出高效可靠的Kubernetes服务网络架构。建议在测试环境充分验证不同场景下的流量行为,再应用到生产环境。

添加新评论