Metallb介紹
一般只有雲平台支持LoadBalancer,如果脫離雲平台,自己搭建的K8S集群,Service的類型使用LoadBalancer是沒有任何效果的。為了讓私有網絡中的K8S集群也能體驗到LoadBalabcer,Metallb成為了解決方案。
Metallb運行在K8S集群中,監視集群內LoadBalancer類型的服務,然后從配置的IP池中為其分配一個可用IP,以ARP/NDP或BGP的方式將其廣播出去,這個可用IP成為了LoadBalancer的Url,可供集群外訪問。
Metallb搭建過程
創建命名空間 metallb-system:
vim metallb-namespace.yaml
寫入文件內容:
apiVersion: v1
kind: Namespace
metadata:
name: metallb-system
下載metallb.yaml文件
wget https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml -O metallb.yaml --no-check-certificate
定義LoadBalancer的IP池,先創建configmap
vim metallb-configMap.yaml
寫入文件內容:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.115.140-192.168.115.199
注意:IP池的網絡需要和K8S集群的IP處於同一網段,我的K8S集群網絡是192.168.115.13x,這里IP池則是給到192.168.115.140-192.168.115.199的范圍。
執行命令:
kubectl apply -f metallb-namespace.yaml
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
kubectl apply -f metallb.yaml
kubectl apply -f metallb-configMap.yaml
LoadBalancer測試
我們使用類型為LoadBalancer的Service進行測試,以nginx服務為例。
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
查看nginx服務:
[root@k8s-master01 test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 11h
nginx LoadBalancer 10.0.0.82 192.168.115.140 80:31610/TCP 8s
可以看到,已經為nginx服務分配了一個192.168.115.140
的IP,直接在瀏覽器中訪問,一切正常。