FlexLB:一个开源负载均衡器,自建K8S必备负载均衡组件

网友投稿 326 2022-10-21

FlexLB:一个开源负载均衡器,自建K8S必备负载均衡组件

K8S的Service有三种:ClusterIP、NodePort、LoadBalancer,其中Cluster IP只能在集群内部访问,外部流量无法进入;NodePort可以将Pod端口映射到节点端口,外部流量通过节点端口访问,但这种方式有两个缺点,一是没可用性保证,二是节点端口太多,难以管理,对外暴露的端口号也很奇怪;LoadBalancer类型的Service可以通过外部负载均衡器引流到集群内部,但K8S并没有提供负载均衡器,需要依赖于IaaS层提供,各云厂商都会提供。

如果自建K8S有三种负载均衡方案可以选择:

1、在K8S内部提供VIP,通过路由协议引流到NodePort,例如开源组件MetalLB

2、在K8S外部搭建负载均衡器,引流到集群内部,这种取决于负载均衡器的实现方式,可以在L3/L4/L7层实现均衡转发,例如VMware Tanzu的HAProxy方案是在L4层进行转发

3、在K8S内部通过Ingress实现L7负载均衡,通过DNS记录引流到Service,例如开源组件Traefik

第一种方案的典型实现是MetalLB,虽然还处于Beta阶段,但已经很火爆了,官方文档很全,网上介绍的文章也很多,不多赘述。MetalLB支持两种模式,Layer2和BGP:Layer2模式在集群节点上绑定VIP,通过ARP在二层广播地址,每个Service的流量只能通过单个节点进入,再通过kubeproxy转发到PodIP,节点间通过memberlist选主,只是实现了高可用,没有做到节点间均衡;BGP模式需要配合L3路由器使用,在路由器层通过多路径实现节点间均衡,但也有缺点,例如不能和Callico CNI的BGP一起使用,且在节点宕机时,会造成短暂的中断。MetalLB还有一个缺点是没有支持多网卡,因此MetalLB分配的External IP实际上和节点IP在一个网络上,造成节点IP直接暴露到“外网”。

第三种方案可选Traefik,不需要使用LoadBalancer类型的Service,Traefik在每个节点上均Listen到80和443,在DNS上添加指向节点的记录,在Traefik上配置URL地址指向的后端的Service(可基于Path指向不同的Service,同一个Path也可以指向多个Service,按照多种L7均衡策略进行流向分发),入口流量进入Traefik之后,根据DNS地址、URL、Header等转发到后端Service。Traefik的主要约束是工作在L7,不支持L4层服务,且需要配合DNS使用,但流量均衡或分发策略非常灵活,可以满足应用的金丝雀升级、灰度发布等需求。

第二种方案是经典方案,实际上所有云提供商都是这种模式,如果自建K8S,可以参考VMware Tanzu的HAProxy方案,在集群外部署虚拟机安装HAProxy,并开发控制面API和K8S Controller,实现自动分配外部IP并配置HAProxy到后端NodePort的代理。

可以参考开源项目FlexLB,利用经典的Keepalived+HAProxy实现负载均衡,通过FlexLB API Server提供控制面API实现外部IP的分配和HAProxy代理的配置,通过FlexLB Kube Controller监控Service和EndpointSlice的增删改事件,调用FlexLB API操作LB实例。

项目地址:是一个灵活的负载均衡器控制面,用于管理LB实例,通过操作Keepalived和HAProxy实现外部负载均衡代理。

- flexlb-api: 用于管理LB实例的控制面API

- flexlb-client-go: 用于调用flexlb-api的Go客户端SDK

- flexlb-kube-controler: kubernetes控制器,用于监控LB类型的Service并分配外部IP

FlexLB的机制:

FlexLB的目的是提供一个具有高可靠性、扩展性和灵活性的负载均衡集群,并提供一个k8s控制器给LB类型的Service分配外部IP。

下图展示了FlexLB的机制。FlexLB集群一般包含两个或两个以上节点(单节点也支持),节点一般有三个网络平面,管理网(mgmt)提供控制面API服务, 业务网(traffic)提供应用网络负载,外部网( external)提供外部访问入口。节点上安装 Keepalived和HAProxy,FlexLB API Server在每个节点上运行,节点间通过Gossip协议自动同步配置。FlexLB API Server在启动后自动启动一个管理网的VIP,提供FlexLB集群Endpoint,实现控制面高可用和均衡。FlexLB Kube Controller监控k8s Service,调用FlexLB API启动LB实例。FlexLB API Server给每个LB实例分配一个外部IP,启动HAProxy实例,转发外部前端流量到后端Pod所在的K8S节点上,然后在集群内部转发到Pod IP。

Flexlb API Server:

Flexlb Kube Controller:

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Docker的网络模式
下一篇:Docker容器实战四:使用介绍
相关文章

 发表评论

暂时没有评论,来抢沙发吧~