使用 Kubernetes 实现负载均衡

使用 Kubernetes 实现负载均衡,可以通过 Kubernetes 的内置服务(Service)资源,配合负载均衡器(如云平台提供的负载均衡器或 Ingress 控制器)来完成。以下是详细的步骤和调优案例。


一、Kubernetes 负载均衡的基本概念

  1. ClusterIP(默认类型)

    只能在集群内部访问,分发到 Pod 的流量通过 IPtables 或 IPVS 转发。

  2. NodePort

    通过每个节点的固定端口将流量暴露给外部,适合简单的开发或测试环境。

  3. LoadBalancer

    在云平台中使用负载均衡服务,将流量从外部分发到节点。

  4. Ingress

    提供基于域名和路径的 HTTP/HTTPS 负载均衡。


二、实现负载均衡的步骤

1. 创建 Deployment

一个 Deployment 管理 Pod 副本,确保应用具有高可用性。

示例:运行一个 Nginx 服务的 Deployment。

bash 复制代码
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 提供外部访问能力。

示例:

bash 复制代码
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 资源:

bash 复制代码
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

bash 复制代码
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 健康检查

这段代码用于 DeploymentPod ,修改的是容器的 readinessProbe

配置 Pod 的健康检查,确保只有健康的实例接收流量:
复制代码
readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10 
4. 优化 Service 的 Session Sticky

通过设置 sessionAffinity 实现会话保持:

复制代码
spec: sessionAffinity: ClientIP # 基于客户端 IP 保持会话 

四、完整部署命令

  1. 部署 Deployment 和 Service:

    复制代码
    kubectl apply -f nginx-deployment.yaml kubectl apply -f nginx-service.yaml 
  2. 部署 Ingress:

    复制代码
    kubectl apply -f nginx-ingress.yaml 
  3. 配置 HPA:

    复制代码
    kubectl apply -f nginx-hpa.yaml 
  4. 查看负载均衡服务的外部 IP:

    复制代码
    kubectl get service nginx-service 

五、总结

Kubernetes 提供了灵活的负载均衡机制,从基础的 ClusterIP 到基于域名的 Ingress,再到云平台的 LoadBalancer,都可以根据需求进行配置和优化。通过结合 HPA、负载均衡策略以及健康检查,可以实现高性能和高可用的系统架构。

相关推荐
hwj运维之路3 小时前
k8s监控方案实践(三):部署与配置Grafana可视化平台
云原生·kubernetes·grafana
yt948323 小时前
Docker-基础(数据卷、自定义镜像、Compose)
运维·docker·容器
Hfc.4 小时前
docker-daemon.json
docker·容器·json
和计算机搏斗的每一天4 小时前
k8s之探针
云原生·容器·kubernetes
JAVA坚守者7 小时前
API 网关核心功能解析:负载均衡、容灾、削峰降级原理与实战摘要
gateway·负载均衡·微服务架构·容灾备份·api 网关·削峰降级·云原生技术
项目題供诗10 小时前
黑马k8s(四)
云原生·容器·kubernetes
杰克逊的日记10 小时前
大项目k8s集群有多大规模,多少节点,有多少pod
云原生·容器·kubernetes
小张童鞋。10 小时前
k8s之k8s集群部署
云原生·容器·kubernetes
long_214510 小时前
k8s中ingress-nginx介绍
kubernetes·ingress-nginx
luck_me510 小时前
k8s v1.26 实战csi-nfs 部署
linux·docker·云原生·容器·kubernetes