GKE、EKS等K8s云服务LoadBalancer Service分配外部IP原理及自建集群配置方法
自建K8s集群LoadBalancer Service外部IP配置方案
原生K8s默认没有内置LoadBalancer类型Service的IP分配能力,自建场景下最主流的实现方案是部署MetalLB控制器,配置流程如下:
- 提前准备一段企业内网未被占用、且和集群节点网络可达的IP段,作为LoadBalancer的地址池
- 安装MetalLB组件,执行命令:
kubectl apply -f metallb-native.yaml
等待metallb-system命名空间下的所有Pod进入Running状态 - 配置IP地址池资源,示例配置如下:
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: internal-lb-pool namespace: metallb-system spec: addresses: - 172.16.20.100-172.16.20.200 # 替换为你自己预留的IP段 - 配置二层通告规则(绝大多数内网二层网络场景使用该模式即可):
apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2-advertise namespace: metallb-system spec: ipAddressPools: - internal-lb-pool
配置完成后,新建LoadBalancer类型的Service时,MetalLB会自动从地址池中分配可用IP填入Service的EXTERNAL-IP字段,内网可直接访问该IP访问服务。如果你的集群是跨网段的三层架构,也可以配置MetalLB的BGP模式,和上层路由器打通BGP邻居实现跨网段路由。
公有云托管K8s LoadBalancer分配实现逻辑
GKE、EKS这类公有云托管K8s的LoadBalancer分配能力,是通过云厂商内置的Cloud Controller Manager(CCM)组件实现的,核心流程如下:
- 用户创建LoadBalancer类型的Service后,集群apiserver产生资源创建事件
- 云厂商的CCM组件监听到LoadBalancer类型Service的变更事件,拉取Service的端口、后端选择器、自定义注解等配置
- CCM调用云厂商的负载均衡产品API,自动创建符合配置要求的公网/私网负载均衡实例,同时将Service对应的后端节点(或Pod,若使用支持直接绑定Pod的CNI插件)加入负载均衡的后端组,配置对应的端口转发、健康检查、安全组等规则
- 负载均衡实例创建完成后,CCM将实例的公网/私网IP回写到Service的
EXTERNAL-IP字段,分配流程结束
内容的提问来源于stack exchange,提问作者Duc Vo
相关产品推荐
相关产品推荐

