LoadBalancer 是 Kubernetes Service 的另一种类型,它是专为云环境设计的,用于将服务直接暴露给互联网。
如果说 ClusterIP 是内网地址,NodePort 是在每个节点上开窗户,那么 LoadBalancer 就是云厂商为你专门搭建的一座外部桥梁。它会自动请求云提供商(如阿里云、AWS、腾讯云、Azure 等)创建一个外部的负载均衡器实例,并将流量转发到集群内部。
LoadBalancer 类型严重依赖云提供商的支持。当你创建这种类型的 Service 时,Kubernetes 会通过云控制器管理器(Cloud Controller Manager)调用云厂商的 API,自动申请并配置一个外部的负载均衡器(例如阿里云的 SLB、AWS 的 ELB)。kube-proxy 转发给 Pod。type: LoadBalancer 的 Service。EXTERNAL-IP 字段中。http://<External-IP>:<Port>。<NodeIP>:<NodePort>。kube-proxy 将流量最终转发给目标 Pod。apiVersion: v1
kind: Service
metadata:
name: my-public-service
annotations:
# 不同云厂商可能有特定的注解来配置 LB 的类型、带宽、计费方式等
# 例如阿里云指定负载均衡类型为公网:
service.beta.kubernetes.io/alicloud-loadbalancer-address-type: "internet"
spec:
type: LoadBalancer
selector:
app: my-web-app
ports:
- protocol: TCP
port: 80 # 负载均衡器监听的端口
targetPort: 8080 # 容器端口
# nodePort: 30080 # 通常不需要手动指定,系统会自动分配
loadBalancerIP: "" # (可选) 某些云支持指定固定的公网 IP,留空则自动分配查看状态: 创建后,可以通过以下命令查看分配到的外部 IP:
1kubectl get svc my-public-service输出示例:
1NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
2my-public-service LoadBalancer 10.96.12.34 47.100.xx.xx 80:30567/TCP 2m此时,用户直接访问 http://47.100.xx.xx 即可。
LoadBalancer 类型的 Service 通常对应一个云负载均衡器实例。云厂商通常按实例数量或流量收费。如果你为每个微服务都创建一个 LB,费用会非常高昂。LoadBalancer 的实现依赖于特定的云提供商。如果你在 AWS 上创建的 YAML 文件直接拿到阿里云或本地私有云(如 VMware)运行,通常会失效或需要大量修改。
在生产环境中,不建议为每一个微服务都创建一个 LoadBalancer 类型的 Service,原因主要是成本和管理的复杂性。
推荐架构模式:
LoadBalancer 类型的 Service(或者使用云厂商的 Ingress Controller),作为整个集群的统一流量入口。ClusterIP。api.example.com, www.example.com)和路径(/api, /web)将流量分发到不同的 ClusterIP 服务。总结:
LoadBalancer 是连接 Kubernetes 集群与外部世界的“官方桥梁”,特别适合云环境下的生产应用。但为了节省成本和提高管理效率,通常将其作为总网关使用,配合 Ingress 来实现复杂的流量分发,而不是为每个服务单独开通。