使用 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、负载均衡策略以及健康检查,可以实现高性能和高可用的系统架构。

相关推荐
-L79 小时前
【Kubernetes】常见面试题汇总(十九)
云原生·容器·kubernetes
Gss77712 小时前
Docker 公有仓库使用、Docker 私有仓库(Registry)使用总结
docker·容器
暴富奥利奥12 小时前
完成docker方式的ros环境配置
linux·学习·docker·容器
红尘客栈213 小时前
K8s-kubeadmin 1.28安装
java·网络·kubernetes
红尘客栈213 小时前
K8S基本命令操作
linux·容器·kubernetes
我好饿113 小时前
部署k8s集群+containerd+dashboard
云原生·容器·kubernetes
hello_25013 小时前
动手模拟k8s网络-vxlan模式
网络·容器·kubernetes
海海思思14 小时前
解决Docker "exec format error":架构不匹配问题分析
docker·容器
hzylyh14 小时前
【Java实现单例模式的五种方式及其优缺点分析】
负载均衡
小马爱打代码15 小时前
Kubernetes:控制器 - ReplicaSet
容器·kubernetes