Kubernetes MetalLB LoadBalancer 电脑版发表于:2022/9/1 14:06  >#Kubernetes MetalLB LoadBalancer [TOC] ## 介绍 tn2>熟悉k8s的都知道,k8s的LoadBalancer类型的Service依赖于外部的云提供的Load Balancer。 当我们把k8s部署在裸机上面时,或者是测试环境时,需要简单的LoadBalancer来验证工作,开源的metallb就是一个不错的选择。 ## 工作模式 tn2>Metallb支持两种工作模式,一种是Layer2模式。  tn2>这是我在实验环境下面常用的模式,只需要一段跟K8s管理网相同网段的地址即可。 Metallb在这种模式下,会从k8s节点中选一个Leader节点,在这个节点上面响应LB地址段的ARP请求,从而使上层路由把发往LB的流量都发到Leader节点。 缺点也很明显,所有对LB的请求都会发往Leader节点。如果当前Service下面的Pod分布在不同节点,那么这个流量还会从Leader发往相应的节点。 不过用在实验环境里这个模式真是太好用了,不需要路由器支持BGP。 另一种是BGP模式。  tn2>这种情况的话就需要路由器支持接收Metallb的BGP广播,从而把请求分布到正确的节点上。 跟L2模式的区别就是能够通过BGP协议正确分布流量了,不再需要一个Leader节点。 缺点就是需要上层路由器支持BGP。而且因为BGP单session的限制,如果Calico也是使用的BGP模式,就会有冲突从而导致metallb无法正常工作。 ## 安装 tn2>安装metallb ```bash # 创建metallb kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.4/config/manifests/metallb-native.yaml ``` tn2>我这里已经安装完成了。  tn2>接着我们查看与我们主机之间相联的网络。 我这里是`enth0`,这台master主机的地址是:`10.211.55.11`  tn2>然后我们这里通过安装一个`sipcalc`小工具,来查看我们的网络段。 ```bash # 先安装epel源. yum -y install epel-release yum -y install sipcalc # 查看网段 sipcalc 10.211.55.11/24 ```  tn2>我们只需要取靠后的二十个ip地址作为我们的LoadBalancer就可以了。 ## 启动L2模式 tn2>我们通过定义`IPAddressPool`资源,来指定k8s分配段的IP。 (`vim ippool.yaml`) ```yaml apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: production namespace: metallb-system spec: addresses: - 10.211.55.230-10.211.55.250 ``` tn2>我们看到`addresses`接收的参数是一个集合,所以如果你嫌麻烦可以直接将IP大段赋值上去。(如下举例) ```bash spec: addresses: - 10.211.55.0/24 - 10.211.55.230-10.211.55.250 ``` tn2>然后我们通过`L2Advertisement`来创建我们的L2模式。 (`vim l2.yaml`) ```yaml apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2 namespace: metallb-system ``` tn2>最后通过`Community`资源类型开通vpn隧道可以使得集群外局域网中的网站可以访问。 (`vim com.yaml`) ```yaml apiVersion: metallb.io/v1beta1 kind: Community metadata: name: communities namespace: metallb-system spec: communities: - name: vpn-only value: 1234:1 ``` tn2>部署L2模式。 ```bash kubectl apply -f ippool.yaml kubectl apply -f l2.yaml kubectl apply -f com.yaml ```  ## 测试 ```bash kubectl run nginx --image=nginx --port=80 # 创建服务 kubectl expose pod nginx --port=80 --name=nginx --type=LoadBalancer # 查看pod kubectl get pod,svc ```  tn2>测试集群内部访问。  tn2>测试局域网内部的访问。  ## 设置BGP tn2>我们可以设置 BGP 的创建。 首先创建我们外部路由器或路由防火墙的地址池。 这里我们使用Juniper SSG5防火墙配置举例,ip为:`10.211.55.210`。 接着我们配置lb的bgp配置清单 ```bash vim prodbgppool.yaml ``` ```yaml apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | peers: - peer-address: 10.211.55.254 peer-asn: 64500 my-asn: 64500 address-pools: - name: default protocol: bgp addresses: - 10.211.55.11/29 ``` tn2>然后我们设置Juniper SSG5 防火墙的配置 ```bash firewall-> set vrouter trust-vr # 设置bgp 为64500与lb的配置保持一致 firewall(trust-vr)-> set protocol bgp 64500 # 设置两个work node的节点地址 firewall(trust-vr)-> set neighbor 10.211.55.11 remote-as 64500 local-ip 10.211.55.254/24 firewall(trust-vr)-> set neighbor 10.211.55.11 enable firewall(trust-vr)-> set neighbor 10.211.55.12 remote-as 64500 local-ip 10.211.55.254/24 firewall(trust-vr)-> set neighbor 10.211.55.12 enable firewall(trust-vr)-> set interface ethernet0/6 protocol bgp ``` tn2>然后进行部署。 ```bash kubectl apply -f prodbgppool.yaml ``` tn2>在防火墙上查看是否获取到路由。 ```bash firewall-> get vrouter trust-vr protocol bgp rib i: IBGP route, e: EBGP route, >: best route, *: valid route Prefix Nexthop Wt Pref Med Orig AS-Path -------------------------------------------------------------------------------------- Total ipv4 routes in rib-in: 4 (0 in flap-damping history) -------------------------------------------------------------------------------------- >i 10.211.55.64/32 10.211.55.11 100 0 0 INC i 10.211.55.64/32 10.211.55.11 100 0 0 INC >i 10.211.55.65/32 10.211.55.12 100 0 0 INC i 10.211.55.65/32 10.211.55.12 100 0 0 INC Total no. of ipv4 entries shown: 4 ```