Kubernetes 中的 LoadBalancer 是什么?

在 Kubernetes 中,LoadBalancer 是一种服务类型,用于向外暴露服务。它会以固定的 IP 和 DNS进行访问,并在后端进行流量负载分发。

LoadBalancer 的主要特征是:

  • 固定入口:外部可以通过一个固定的 IP 或 DNS 访问服务。
  • 负载均衡:可以在多个 Pod 或后端任务上进行流量分发。
  • 支持多种负载均衡器:公有云 LB、私有云 LB、自建 LB 等。
  • 只支持TCP/UDP:只能代理这两种协议,无法是像 HTTP 一样七层代理。

LoadBalancer 需要云服务商或负载均衡器提供商的支持,以提供真实的负载均衡功能。它可以代理的类型包括:

  • 公有云 LB:AWS ELB、Azure LB、GCP LB、阿里云等。
  • 私有云 LB:OpenStack Octavia、VMware NSX 等。
  • 自建 LB:Keepalived、HAProxy、NGINX 等。

LoadBalancer 的工作原理是:

  1. 用户在 Kubernetes 中通过 Service 的 .spec.type=LoadBalancer类型创建 LoadBalancer 服务。
  2. Kubernetes 根据配置找到支持的云服务商或自建 LB,并创建一个负载均衡器。
  3. 云服务商分配一个外部 IP 或 DNS 到负载均衡器。
  4. Kubernetes 将这个 IP/DNS 暴露在服务的 .status.loadBalancer.ingress 字段。
  5. 云服务商在后端将流量转发至 Kubernetes Node 节点。
  6. Node 上的 kube-proxy 根据LB服务配置的Podselector,将流量转发至目标 Pod。
  7. 外部通过 IP/DNS 可以访问到 LoadBalancer 后端的多个 Pod。

例如,这个 LoadBalancer 服务:

yaml
apiVersion: v1
kind: Service
metadata: 
  name: example
spec: 
  type: LoadBalancer
  selector:
    app: example
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

它的工作流程是:

  1. 创建 LoadBalancer 服务,需要云服务商提供 LB 支持。
  2. 云服务商分配 IP,如 120.0.0.1。
  3. Kubernetes 将 120.0.0.1 暴露在服务的 status.loadBalancer.ingress 下。
  4. 访问 120.0.0.1 会转发至后端 Node。
  5. Node 上的 kube-proxy 根据选择器将请求转发至 app=example 的 Pod。
  6. 多个 Pod 分摊 120.0.0.1 的访问流量。

所以总结来说,LoadBalancer 服务的主要作用是向外暴露固定入口的服务,其主要特征是:

  1. 使用固定 IP 或 DNS 访问。
  2. 在后端 Pod 上进行负载均衡。
  3. 支持多种 LB,需要云服务商或自建 LB 支持。
  4. 只支持TCP/UDP协议,四层代理。

它的工作原理是:

  1. 创建 LoadBalancer 服务,需要 LB 提供商支持。
  2. 获得一个外部IP/DNS,暴露在服务状态中。
  3. 访问该 IP/DNS 会被转发至 Node。
  4. Node 上的 kube-proxy 根据选择器转发至后端 Pod。
  5. 后端多个 Pod 分摊流量。