跳转到内容

Kubernetes LoadBalancer

来自代码酷


Kubernetes LoadBalancer 是 Kubernetes 中一种服务类型,用于将外部流量分发到集群内的多个 Pod。它通常与云服务提供商的负载均衡器集成,自动创建外部负载均衡器,并将流量路由到匹配的 Service。本指南将详细介绍 LoadBalancer 的概念、工作原理、配置方法及实际应用场景。

概述[编辑 | 编辑源代码]

LoadBalancer 是 Kubernetes Service 的一种类型,扩展了 NodePort 的功能。当创建一个 LoadBalancer 类型的 Service 时,Kubernetes 会:

  • 分配一个集群内部的 ClusterIP。
  • 在每个节点上开放一个 NodePort。
  • 自动请求云提供商(如 AWS、GCP、Azure)配置一个外部负载均衡器,将流量转发到该 Service。

LoadBalancer 适用于需要从集群外部访问服务的场景,例如公开 Web 应用程序或 API。

工作原理[编辑 | 编辑源代码]

LoadBalancer 的工作流程如下: 1. 用户创建 LoadBalancer 类型的 Service。 2. Kubernetes 控制平面与云提供商 API 交互,请求创建负载均衡器。 3. 云提供商配置负载均衡器,并将其指向集群的 NodePort。 4. 外部流量通过负载均衡器的 IP 或 DNS 名称进入,并分发到各个节点上的 NodePort。 5. 节点上的 kube-proxy 将流量转发到后端 Pod。

graph LR A[External Client] --> B[Cloud Load Balancer] B --> C[NodePort on Node1] B --> D[NodePort on Node2] C --> E[Pod1] D --> F[Pod2]

配置 LoadBalancer Service[编辑 | 编辑源代码]

以下是一个典型的 LoadBalancer Service 的 YAML 配置示例:

apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

字段说明[编辑 | 编辑源代码]

  • type: LoadBalancer:指定 Service 类型为 LoadBalancer。
  • selector:定义哪些 Pod 属于该 Service(通过标签匹配)。
  • ports
 * port:Service 暴露的端口(外部访问的端口)。
 * targetPort:Pod 上监听的端口。

示例:部署 LoadBalancer Service[编辑 | 编辑源代码]

假设我们有一个名为 `my-app` 的 Deployment,运行在端口 8080 上:

1. 创建 Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: nginx:latest
        ports:
        - containerPort: 8080

2. 应用 LoadBalancer Service:

kubectl apply -f loadbalancer-service.yaml

3. 检查 Service 状态:

kubectl get svc my-loadbalancer-service

输出示例:

NAME                      TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
my-loadbalancer-service   LoadBalancer   10.96.123.456   203.0.113.10    80:32456/TCP   1m
  • EXTERNAL-IP 是云提供商分配的负载均衡器 IP。
  • 访问 `http://203.0.113.10` 将流量路由到后端 Pod。

高级配置[编辑 | 编辑源代码]

特定云提供商注解[编辑 | 编辑源代码]

不同云提供商支持通过注解(annotations)自定义负载均衡器行为。例如,在 AWS 上配置 HTTPS 负载均衡器:

metadata:
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:us-west-2:123456789012:certificate/xxxxxx"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"

保留客户端 IP[编辑 | 编辑源代码]

默认情况下,负载均衡器会屏蔽客户端 IP。如需保留,可配置 `externalTrafficPolicy`:

spec:
  externalTrafficPolicy: Local

实际应用场景[编辑 | 编辑源代码]

1. 公开 Web 应用:将前端服务暴露给互联网用户。 2. API 网关:为微服务架构提供统一的入口。 3. 混合云部署:在跨云环境中分发流量。

限制与注意事项[编辑 | 编辑源代码]

  • LoadBalancer 依赖于云提供商的支持,本地集群(如 Minikube)可能需要额外插件。
  • 每个 LoadBalancer Service 通常会产生云服务费用。
  • 对于非云环境,可以考虑 MetalLB 等替代方案。

总结[编辑 | 编辑源代码]

Kubernetes LoadBalancer 提供了一种简单的方式将服务暴露到集群外部,并与云基础设施无缝集成。通过合理配置,可以实现高可用、可扩展的流量分发。初学者应从基础配置开始,逐步探索高级功能如 TLS 终止和客户端 IP 保留。

参见[编辑 | 编辑源代码]