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

相关推荐
IguoChan1 小时前
8. Redis Operator (1) —— 单机部署
kubernetes
老实巴交的麻匪2 小时前
可观测性 | Grafana Loki 日志聚合方案快速体验
运维·云原生·容器
weixin_428498492 小时前
Docker run 子命令与运行优化相关的参数
docker·容器
dsd23333 小时前
K8S 专栏 —— Pod 篇
docker·容器·kubernetes
虚妄狼4 小时前
【Docker】docker 常用命令
运维·docker·容器
风清再凯5 小时前
k8s的开篇学习和安装
学习·容器·kubernetes
星融元asterfusion5 小时前
突破AI瓶颈:基于实时感知的智能选路实现智算负载均衡优化
运维·人工智能·负载均衡
我才是鳴海步6 小时前
基于docker技术的单主机环境模拟测试批量客户端
运维·docker·容器
listhi5206 小时前
k8s使用私有harbor镜像源
java·docker·kubernetes
程序员阿超的博客8 小时前
云原生核心技术 (9/12): K8s 实战:如何管理应用的配置 (ConfigMap/Secret) 与数据 (Volume)?
云原生·容器·kubernetes