Kubernetes開源LoadBalancer—Metallb(BGP)
Kubernetes開源LoadBalancer—MetalLB(BGP)
1、背景
最近一年為了迎接亞運(yùn)會(huì),單位開發(fā)了很多大屏展示界面,這些大屏展示頁(yè)面需要提供給外部門訪問,起初使用Ingress方式,但是需要外部門配置DNS,所以我們準(zhǔn)備使用NodePort,但是領(lǐng)導(dǎo)想用LoadBalancer,眾所周知,LoadBalancer大部分情況下只能在提供了外部負(fù)載均衡器的云提供商上使用,而我們是裸機(jī)集群,沒辦法,我們只能找開源的LoadBalancer解決方案。
在尋找資料的時(shí)候我們找到了兩種解決方案,一種是Kubesphere的OpenELB,一種是MetalLB。但是OpenELB的文檔實(shí)在是太少了,而且還是很久之前的文檔,所以我們選擇了MetalLB。
2、Metallb介紹
貼一段官方的介紹
Kubernetes沒有為裸金屬集群提供網(wǎng)絡(luò)負(fù)載均衡器(LoadBalancer)。Kubernetes發(fā)布的網(wǎng)絡(luò)負(fù)載均衡器的實(shí)現(xiàn)都是調(diào)用各種IaaS平臺(tái)的外部負(fù)載均衡器。如果你不是運(yùn)行在一個(gè)受支持的IaaS平臺(tái)上,那么loadbalancer在創(chuàng)建時(shí)就會(huì)無(wú)限期地保持“Pending”狀態(tài)。
裸金屬集群運(yùn)營(yíng)商只剩下兩個(gè)方式來(lái)將用戶流量引入集群,即“NodePort”和“externalIPs”服務(wù)。這兩種選擇對(duì)生產(chǎn)用途都有顯著的不利影響,這使得裸金屬集群在Kubernetes生態(tài)系統(tǒng)中成為二等公民。
MetalLB的目標(biāo)是通過提供一個(gè)與標(biāo)準(zhǔn)網(wǎng)絡(luò)設(shè)備集成的網(wǎng)絡(luò)負(fù)載均衡器實(shí)現(xiàn)來(lái)糾正這種不平衡,這樣裸金屬集群上的外部服務(wù)也可以盡可能地“正常工作”。
MetalLB有兩個(gè)共同提供此服務(wù)的特性:地址分配和外部通知。
3、部署MetalLB(BGP)
(1)部署環(huán)境
這是我們內(nèi)部集群拓?fù)涞囊粋€(gè)簡(jiǎn)化圖:
注意:如果集群的CNI使用的是calico,你需要禁用calico的BGP模式,否則會(huì)影響MetalLB的正常工作。
(2)部署
# 安裝前準(zhǔn)備
# 如果kube-proxy使用的是IPVS模式,你需要啟用staticARP
kubectl edit configmap -n kube-system kube-proxy
# 設(shè)置staticARP為true
mode: "ipvs"
ipvs:
strictARP: true
# 部署metalLB
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml
# 檢查pod運(yùn)行狀態(tài)
[root@node1 ~]# kubectl get pods -n metallb-system
NAME READY STATUS RESTARTS AGE
controller-6554b76d68-gxwml 1/1 Running 0 35d
speaker-p9x5v 1/1 Running 0 35d
speaker-pgxkw 1/1 Running 0 35d
# 配置metalLB
cat > metallb-eip.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
peers:
- peer-address: 192.168.0.254 # BGP鄰居IP(Core Switch的IP)
peer-asn: 50000 # 對(duì)端AS號(hào)
my-asn: 50001 # 本地AS號(hào)
address-pools:
- name: default
protocol: bgp # 協(xié)議使用BGP
addresses: # 地址池
- 10.11.11.1-10.11.11.254
EOF
# 之前我地址池配置成10.11.11.0/24,Metallb分配地址時(shí)會(huì)把10.11.11.0也分配出去。
# 配置核心交換機(jī)
[Core-Switch]bgp 50000
[Core-Switch-bgp]peer 192.168.0.1 as-num 50001
[Core-Switch-bgp]peer 192.168.0.2 as-num 50001
[Core-Switch-bgp]peer 192.168.0.3 as-num 50001
查看BGP鄰居建立情況 [Core-Switch]dis bgp peer。
# 現(xiàn)在使用K8S dashboard做個(gè)實(shí)驗(yàn)
kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.1.189.92 <none> 8000/TCP 35d
kubernetes-dashboard NodePort 10.1.88.59 <none> 443:31956/TCP 35d
# 現(xiàn)在使用的是NodePort,把他修改成LoadBalancer
kubectl edit svc -n kubernetes-dashboard kubernetes-dashboard
type: LoadBalancer
# 保存退出, 再次查看svc
kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.1.189.92 <none> 8000/TCP 35d
kubernetes-dashboard LoadBalancer 10.1.88.59 10.11.11.1 443:31956/TCP 35d
# 可以看到kubernetes-dashboard的EXTERNAL-IP已經(jīng)被分配了一個(gè)地址
現(xiàn)在到交換機(jī)上看一下 [Core-Switch]dis bgp routing-table [Core-Switch]dis ip rou 10.11.11.1。
可以看到交換機(jī)已經(jīng)學(xué)習(xí)到了10.11.11.1的路由 在瀏覽器中訪問https://10.11.11.1。