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

相关推荐
2601_961875244 小时前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj4 小时前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
程序员老赵5 小时前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops
正经教主5 小时前
【docker基础】 第八周:容器监控与应用更新策略
运维·docker·容器
kiros_wang6 小时前
Docker 使用完整指南
运维·docker·容器
正经教主6 小时前
【docker基础】第九周:Docker安全与镜像优化
运维·docker·容器
qq_452396237 小时前
第十三篇:《K8s 安全基础:RBAC、ServiceAccount、Pod Security》
java·安全·kubernetes
睡不醒男孩0308239 小时前
云原生运维实战:高并发架构下的云原生可观测性、韧性降级与自动化干预体系
数据库·kubernetes·高并发·prometheus·devops·sre·缓存调优
qq_452396239 小时前
第十四篇:《K8s 网络模型与 CNI 插件(Calico、Flannel、Cilium)》
网络·kubernetes·php
正经教主9 小时前
【docker基础】第十三周:学习总结与进阶方向【完结】
运维·docker·容器