Kubernetes服务发现与负载均衡详解:Service与Ingress
Kubernetes服务发现与负载均衡深度解析
一、Service:服务抽象的基石
Service是Kubernetes中实现服务发现的核心抽象,它为Pod集合提供稳定的访问端点。
1.1 Service核心类型
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
实践建议:
- 生产环境优先使用LoadBalancer+Ingress组合
- 避免直接使用NodePort暴露关键服务
- 跨命名空间访问使用
<service-name>.<namespace>.svc.cluster.local
二、Ingress:智能流量路由
2.1 Ingress与Controller关系
主流Ingress Controller对比:
方案 | 特点 | 适用场景 |
---|---|---|
Nginx | 功能全面,性能优秀 | 通用Web服务 |
Traefik | 动态配置,内置Dashboard | 快速迭代环境 |
ALB | AWS深度集成,无需维护 | 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
高级功能实践:
金丝雀发布:通过annotation实现流量切分
nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "20"
跨域配置:
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选项
Cluster(默认):
- 流量可能跨节点转发
- 保留客户端源IP(需要云厂商支持)
Local:
- 仅路由到本节点Pod
- 保留真实客户端IP
- 需要配合
externalTrafficPolicy: Local
使用
生产建议:
- 需要保留客户端IP时使用Local模式
- 节点数量少时慎用Local模式(可能导致负载不均)
- 结合
service.spec.healthCheckNodePort
实现健康检查
五、实战架构示例
电商系统典型架构:
外部用户 -> CDN -> [LoadBalancer Service] -> [Ingress Nginx]
-> [内部ClusterIP Services] -> [业务Pods]
-> [Redis ClusterIP]
-> [MySQL Headless Service]
性能优化要点:
- 使用
sessionAffinity: ClientIP
保持会话粘性 - 合理设置
terminationGracePeriodSeconds
实现优雅终止 监控指标关注:
- 服务延迟(P99)
- DNS查询耗时
- Ingress Controller吞吐量
六、常见问题排查指南
服务不可达检查清单:
- Service selector是否匹配Pod标签
- Endpoints是否正常(
kubectl get endpoints
) - 网络策略是否放行
- kube-proxy是否正常运行
DNS解析失败处理:
# 检查CoreDNS运行状态 kubectl -n kube-system get pods -l k8s-app=kube-dns # 查看DNS配置 kubectl exec -it <pod> -- cat /etc/resolv.conf
Ingress不生效排查:
- 确认Ingress Controller已安装
- 检查Ingress资源events(
kubectl describe ingress
) - 验证Controller日志
通过本文介绍的核心机制和实战经验,开发者可以构建出高效可靠的Kubernetes服务网络架构。建议在测试环境充分验证不同场景下的流量行为,再应用到生产环境。