MetalLB 新手攻略:零壓力實現無縫部署

2023/12/07閱讀時間約 11 分鐘

延續上篇的內容,在了解了MetalLB的基本概念之後,我們就進入實際上部署的動作,還沒看過的可以到以下連結先有個基本概念:

讓我們一步一步建構出我們需要的服務

讓我們一步一步建構出我們需要的服務

本篇針對部署一個最基本的MetalLB的做法,共分成四個部分來進行說明:

  1. 安裝前確認
  2. 部署
  3. 測試
  4. 結論

準備好您的Kubernetes Cluster之後,那我們就開始吧!!


1.安裝前確認

跟據官網目前文件上所寫的需求如下:

  • K8S 版本在1.13.0以上,並且沒有安裝其他的Loadbalancer
  • 相容於MetalLB的CNI(參考:https://metallb.universe.tf/installation/network-addons/),我的環境是使用Calico,屬於”大部分”功能相容。
  • 配置給MetalLB分配的數個IP位址
  • 如果使用BGP模式,確認硬體是否支援(本篇使用L2模式)
  • 使用L2模式時,確認每個節點的7946 Port允許通過(TCP/UDP),memberlist功能使用。
  • 在v0.13.0版之後,MetalLB也支援CRD的方式,如果還是用configmap的方式,可以用以下方式進行轉換:

2.部署

確認了所有預先需求後,就可以開始進行安裝,官方的安裝方式有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
raw-image
#---------------------------------------------------------
# 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
建立好的IP Pool

建立好的IP Pool

#---------------------------------------------------------
# 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位址。


3.測試

#---------------------------------------------------------
# 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
raw-image
#---------------------------------------------------------
# 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>
=> 可以訪問表示服務正常
raw-image
確認功能正常,可以從IP Pool取得IP

確認功能正常,可以從IP Pool取得IP


4.結論

總結而言,使用MetalLB的最大好處在於為Kubernetes集群提供了強大的負載均衡功能,使服務更可靠、可擴展,且更易於管理。對於正式環境上的應用時,建議進行詳細的規劃和測試,確保它符合應用需求與管理需求,因為它也是屬於基礎架構的一環,如果出現問題可能會直接影響服務,記得注意應未來的擴展和負載增長議題。

當然,相較於Cloud Loadbalancer,還是有一些缺點如下:

  1. MetalLB可能不如某些雲端提供的負載均衡服務功能強大,並且可能無法滿足某些高級需求,如全球負載均衡。
  2. 需要一定的網路知識:配置MetalLB可能需要一定的網路知識,尤其是在BGP模式下。
  3. 安全性:如果不正確配置,MetalLB可能會導致安全風險,因為它公開了一些Kubernetes服務,這需要謹慎的設定。

最後,以下網頁有列出一些類似的產品/工具供大家參考:

綜合上一篇的基本介紹,相信大家都已經可以建構出基本的MetalLB服務,對於沒有上公有雲環境的我,使用MetalLB讓我在地端也可以在這個部分使用到類似公有雲服務的功能,同時在提供服務時,也更為方便對外暴露位址。

好了,本篇就分享到這邊為止,如果對您有任何幫助,也請給我鼓勵,那我們就下期再見囉!!


References:





8會員
39內容數
記錄IT社畜的自我學習筆記,如同專題名稱,主要是怕自已忘記自已做過什麼、學到什麼。索性就分享我自已在學習Kubernetes這條路上的各種測試、學習心得。
留言0
查看全部
發表第一個留言支持創作者!