Kubernetes无内置负载均衡器为何仍能实现跨Pod流量分发?
核心概念澄清
你混淆了Kubernetes中两类不同的负载均衡能力:
- 第一类是所有Service默认自带的集群内四层负载均衡:这个能力由kube-proxy组件原生实现,只要流量进入集群匹配到Service规则,kube-proxy就会按照配置的转发策略(默认是轮询)将流量分发到后端关联的多个Pod上。你测试时访问8080端口能拿到不同节点上的Pod响应,就是这个原生能力的体现,这个确实是K8s自带的。
- 第二类是LoadBalancer类型Service依赖的外部入口负载均衡:业界常说的「Kubernetes本身不提供负载均衡能力」特指这部分。原生K8s没有内置实现这类负载均衡的资源供给能力,如果你在裸金属服务器或者无云厂商适配的原生集群中创建
type=LoadBalancer的Service,你会看到Service的EXTERNAL-IP字段会一直处于<pending>状态,没有可用的外部访问入口,无法从集群外直接访问该Service。
为什么本地集群可以正常使用LoadBalancer类型Service?
Minikube、kind这类本地开发用的集群工具,为了降低本地开发门槛,都默认额外集成了LoadBalancer适配实现:
- Minikube内置了
tunnel组件,会自动将LoadBalancer类型的Service映射到本地可访问的地址 - kind默认适配了MetalLB作为LoadBalancer实现,会从预留的本地网段中给Service分配可用IP
你本地测试能直接访问LoadBalancer类型的Service,是集群工具额外提供的能力,不是原生K8s自带的功能。
对应操作命令说明
你执行的三个命令的作用分别是:
# 创建名为kiada的Deployment,使用指定镜像 kubectl create deployment kiada --image=luksa/kiada:0.1 # 将kiada的副本数扩容到3个 kubectl scale deployment kiada --replicas=3 # 为kiada创建类型为LoadBalancer的Service,暴露8080端口 kubectl expose deployment kiada --type=LoadBalancer --port 8080
内容的提问来源于stack exchange,提问作者mnj
相关产品推荐
相关产品推荐

