延續上篇的內容,在了解了MetalLB的基本概念之後,我們就進入實際上部署的動作,還沒看過的可以到以下連結先有個基本概念:
本篇針對部署一個最基本的MetalLB的做法,共分成四個部分來進行說明:
準備好您的Kubernetes Cluster之後,那我們就開始吧!!
跟據官網目前文件上所寫的需求如下:
確認了所有預先需求後,就可以開始進行安裝,官方的安裝方式有YAML, Helm, Operator的方式,為了能更清楚元件的內容到底是在做什麼,本篇選擇最基本的YAML方式進行部署作業,實務上可以使用Helm或是Operator的方式來進行部署,在管理上會更加容易(由其是像OpenShift等等商用解決方案)。
#---------------------------------------------------------
# (option) 如果kube-proxy使用ipvs mode,要記得去修成strict arp
#---------------------------------------------------------
[lb01]# kubectl edit configmap -n kube-system kube-proxy
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
#---------------------------------------------------------
# S2-1. 取得YAML
#---------------------------------------------------------
[master]# wget https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml
[master]# wget https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-frr.yaml
#---------------------------------------------------------
# S2-2. 執行
#---------------------------------------------------------
[master]# kubectl create ns metallb-system
[master]# kubectl apply -f metallb-native.yaml -n metallb-system
[master]# kubectl apply -f metallb-frr.yaml -n metallb-system
#---------------------------------------------------------
# S2-3. 建立IP-Pool
#---------------------------------------------------------
[master]# vim ipv4-pool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses: #可分配的 IP 地址,可以指定多个,包括 ipv4、ipv6
- 172.20.175.140-172.20.175.150
[master]# kubectl apply -f ipv4-pool.yaml
#---------------------------------------------------------
# S2-4. 建立L2-Advertrisement,與ipv4pool binding
# L2模式的工作方式是回應本地網路的ARP request,將node MAC提供給客戶端
# (如果不設定與ipaddresspool綁定,預設L2Advertisement會關聯所有可用的IPAdressPool)
#---------------------------------------------------------
[master]# vim L2advertisement.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
spec:
ipAddressPools:
- first-pool
[master]# kubectl apply -f L2advertment.yaml
到此就完成了MetalLB L2模式的基本建置,接下來進行測試,確認是否可以正常以”loadbalancer”的Type取得IP位址。
#---------------------------------------------------------
# S3-1. 建立nginx service
#---------------------------------------------------------
[master]# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: docker.io/nginx:latest
ports:
- containerPort: 80
[master]# kubectl create -f nginx-deployment.yaml
[master]# kubectl get all
#---------------------------------------------------------
# S3-2. 建立nginx svc
#---------------------------------------------------------
[master]# vim nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx2
labels:
app: nginx
spec:
selector:
app: nginx
ports:
- name: nginx-port
protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
[master]# kubectl create -f nginx-svc.yaml
#---------------------------------------------------------
# S3-3. 確認是否已分配externalIP
#---------------------------------------------------------
[master]# kubectl get svc nginx
[master]# curl http://<externalip>
=> 可以訪問表示服務正常
總結而言,使用MetalLB的最大好處在於為Kubernetes集群提供了強大的負載均衡功能,使服務更可靠、可擴展,且更易於管理。對於正式環境上的應用時,建議進行詳細的規劃和測試,確保它符合應用需求與管理需求,因為它也是屬於基礎架構的一環,如果出現問題可能會直接影響服務,記得注意應未來的擴展和負載增長議題。
當然,相較於Cloud Loadbalancer,還是有一些缺點如下:
最後,以下網頁有列出一些類似的產品/工具供大家參考:
綜合上一篇的基本介紹,相信大家都已經可以建構出基本的MetalLB服務,對於沒有上公有雲環境的我,使用MetalLB讓我在地端也可以在這個部分使用到類似公有雲服務的功能,同時在提供服務時,也更為方便對外暴露位址。
好了,本篇就分享到這邊為止,如果對您有任何幫助,也請給我鼓勵,那我們就下期再見囉!!
References: