在 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 的工作原理是:
- 用户在 Kubernetes 中通过 Service 的 .spec.type=LoadBalancer类型创建 LoadBalancer 服务。
- Kubernetes 根据配置找到支持的云服务商或自建 LB,并创建一个负载均衡器。
- 云服务商分配一个外部 IP 或 DNS 到负载均衡器。
- Kubernetes 将这个 IP/DNS 暴露在服务的 .status.loadBalancer.ingress 字段。
- 云服务商在后端将流量转发至 Kubernetes Node 节点。
- Node 上的 kube-proxy 根据LB服务配置的Podselector,将流量转发至目标 Pod。
- 外部通过 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
它的工作流程是:
- 创建 LoadBalancer 服务,需要云服务商提供 LB 支持。
- 云服务商分配 IP,如 120.0.0.1。
- Kubernetes 将 120.0.0.1 暴露在服务的 status.loadBalancer.ingress 下。
- 访问 120.0.0.1 会转发至后端 Node。
- Node 上的 kube-proxy 根据选择器将请求转发至 app=example 的 Pod。
- 多个 Pod 分摊 120.0.0.1 的访问流量。
所以总结来说,LoadBalancer 服务的主要作用是向外暴露固定入口的服务,其主要特征是:
- 使用固定 IP 或 DNS 访问。
- 在后端 Pod 上进行负载均衡。
- 支持多种 LB,需要云服务商或自建 LB 支持。
- 只支持TCP/UDP协议,四层代理。
它的工作原理是:
- 创建 LoadBalancer 服务,需要 LB 提供商支持。
- 获得一个外部IP/DNS,暴露在服务状态中。
- 访问该 IP/DNS 会被转发至 Node。
- Node 上的 kube-proxy 根据选择器转发至后端 Pod。
- 后端多个 Pod 分摊流量。