使用 Kubernetes 实现负载均衡
使用 Kubernetes 实现负载均衡,可以通过 Kubernetes 的内置服务(Service)资源,配合负载均衡器(如云平台提供的负载均衡器或 Ingress 控制器)来完成。以下是详细的步骤和调优案例。
一、Kubernetes 负载均衡的基本概念
-
ClusterIP(默认类型)
只能在集群内部访问,分发到 Pod 的流量通过 IPtables 或 IPVS 转发。 -
NodePort
通过每个节点的固定端口将流量暴露给外部,适合简单的开发或测试环境。 -
LoadBalancer
在云平台中使用负载均衡服务,将流量从外部分发到节点。 -
Ingress
提供基于域名和路径的 HTTP/HTTPS 负载均衡。
二、实现负载均衡的步骤
1. 创建 Deployment
一个 Deployment 管理 Pod 副本,确保应用具有高可用性。
示例:运行一个 Nginx 服务的 Deployment。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 创建三个副本
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.23
ports:
- containerPort: 80
创建 Deployment:
kubectl apply -f nginx-deployment.yaml
2. 创建 Service
定义 Service 类型为 LoadBalancer
,为 Nginx 提供外部访问能力。
示例:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx # 关联到 Deployment 的标签
type: LoadBalancer # 使用云平台负载均衡器
ports:
- protocol: TCP
port: 80 # Service 端口
targetPort: 80 # Pod 的端口
创建 Service:
kubectl apply -f nginx-service.yaml
3. 使用 Ingress 提供基于域名的访问
Ingress 控制器(如 NGINX-Ingress)用于 HTTP/HTTPS 流量的负载均衡。
安装 NGINX-Ingress 控制器:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
定义 Ingress 资源:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com # 替换为你的域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
创建 Ingress:
kubectl apply -f nginx-ingress.yaml
三、调优案例
1. 调整 Pod 副本数
通过 HPA(Horizontal Pod Autoscaler)实现自动扩缩容:
以下是一个完整的 HPA YAML 文件,将其保存为 nginx-hpa.yaml
:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # CPU 使用率超过 50% 时扩容
2. 优化负载均衡算法
在 Ingress 的注解中 annotations:调整负载均衡策略:
nginx.ingress.kubernetes.io/load-balance: "least_conn" # 使用最少连接算法
常用策略:
- round_robin:默认轮询分发。
- least_conn:最少连接优先。
- ip_hash:基于客户端 IP 哈希。
3. 使用 readinessProbe 健康检查
这段代码用于 Deployment 或 Pod,修改的是容器的 readinessProbe
。
配置 Pod 的健康检查,确保只有健康的实例接收流量:
readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10
4. 优化 Service 的 Session Sticky
通过设置 sessionAffinity
实现会话保持:
spec: sessionAffinity: ClientIP # 基于客户端 IP 保持会话
四、完整部署命令
-
部署 Deployment 和 Service:
kubectl apply -f nginx-deployment.yaml kubectl apply -f nginx-service.yaml
-
部署 Ingress:
kubectl apply -f nginx-ingress.yaml
-
配置 HPA:
kubectl apply -f nginx-hpa.yaml
-
查看负载均衡服务的外部 IP:
kubectl get service nginx-service
五、总结
Kubernetes 提供了灵活的负载均衡机制,从基础的 ClusterIP
到基于域名的 Ingress
,再到云平台的 LoadBalancer
,都可以根据需求进行配置和优化。通过结合 HPA、负载均衡策略以及健康检查,可以实现高性能和高可用的系统架构。