
Kubernetes MetalLB LoadBalancer
介绍
熟悉k8s的都知道,k8s的LoadBalancer类型的Service依赖于外部的云提供的Load Balancer。
当我们把k8s部署在裸机上面时,或者是测试环境时,需要简单的LoadBalancer来验证工作,开源的metallb就是一个不错的选择。
工作模式
Metallb支持两种工作模式,一种是Layer2模式。
这是我在实验环境下面常用的模式,只需要一段跟K8s管理网相同网段的地址即可。
Metallb在这种模式下,会从k8s节点中选一个Leader节点,在这个节点上面响应LB地址段的ARP请求,从而使上层路由把发往LB的流量都发到Leader节点。
缺点也很明显,所有对LB的请求都会发往Leader节点。如果当前Service下面的Pod分布在不同节点,那么这个流量还会从Leader发往相应的节点。
不过用在实验环境里这个模式真是太好用了,不需要路由器支持BGP。
另一种是BGP模式。
这种情况的话就需要路由器支持接收Metallb的BGP广播,从而把请求分布到正确的节点上。
跟L2模式的区别就是能够通过BGP协议正确分布流量了,不再需要一个Leader节点。
缺点就是需要上层路由器支持BGP。而且因为BGP单session的限制,如果Calico也是使用的BGP模式,就会有冲突从而导致metallb无法正常工作。
安装
安装metallb
# 创建metallb
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.4/config/manifests/metallb-native.yaml
我这里已经安装完成了。
接着我们查看与我们主机之间相联的网络。
我这里是enth0
,这台master主机的地址是:10.211.55.11
然后我们这里通过安装一个sipcalc
小工具,来查看我们的网络段。
# 先安装epel源.
yum -y install epel-release
yum -y install sipcalc
# 查看网段
sipcalc 10.211.55.11/24
我们只需要取靠后的二十个ip地址作为我们的LoadBalancer就可以了。
启动L2模式
我们通过定义IPAddressPool
资源,来指定k8s分配段的IP。
(vim ippool.yaml
)
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: production
namespace: metallb-system
spec:
addresses:
- 10.211.55.230-10.211.55.250
我们看到addresses
接收的参数是一个集合,所以如果你嫌麻烦可以直接将IP大段赋值上去。(如下举例)
spec:
addresses:
- 10.211.55.0/24
- 10.211.55.230-10.211.55.250
然后我们通过L2Advertisement
来创建我们的L2模式。
(vim l2.yaml
)
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2
namespace: metallb-system
最后通过Community
资源类型开通vpn隧道可以使得集群外局域网中的网站可以访问。
(vim com.yaml
)
apiVersion: metallb.io/v1beta1
kind: Community
metadata:
name: communities
namespace: metallb-system
spec:
communities:
- name: vpn-only
value: 1234:1
部署L2模式。
kubectl apply -f ippool.yaml
kubectl apply -f l2.yaml
kubectl apply -f com.yaml
测试
kubectl run nginx --image=nginx --port=80
# 创建服务
kubectl expose pod nginx --port=80 --name=nginx --type=LoadBalancer
# 查看pod
kubectl get pod,svc
测试集群内部访问。
测试局域网内部的访问。
设置BGP
我们可以设置 BGP 的创建。
首先创建我们外部路由器或路由防火墙的地址池。
这里我们使用Juniper SSG5防火墙配置举例,ip为:10.211.55.210
。
接着我们配置lb的bgp配置清单
vim prodbgppool.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
然后我们设置Juniper SSG5 防火墙的配置
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
然后进行部署。
kubectl apply -f prodbgppool.yaml
在防火墙上查看是否获取到路由。
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
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

