地端 K8S 設定 MetalLB

  1. 備註
  2. 前言
  3. 以 Layer2 實現 K8S Cluster Loadbalance
  4. 測試結果

備註

因本人是K8S 初學者,文章有可能觀念有誤,若有誤導 請見諒
歡迎留言指正 謝謝

前言

機器環境可參考此篇文章 w4560000 - 以 kubeadm 架設 K8S Cluster

在雲端環境的K8S(ex: GKE),都有跟自有的雲端服務整合(負載平衡器 & 外部IP位址)
但在地端環境,則無法達成負載平衡,需要透過額外套件才能達成

MetalLB 是一個為了地端環境而生的負載平衡套件
有兩種使用方式 Layer2、BGP 說明可參考 Kubernetes 负载均衡器 MetalLB 使用指南

Layer2 可讓相同網段IP 當作 LoadBalance IP,實作起來較簡單
地端K8S,我主要是架設測是環境為用途,在測試環境中,不需要讓外網訪問,故使用L2即可

以 Layer2 實現 K8S Cluster Loadbalance

安裝 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

目前K8S Cluster 集群 IP
10.240.0.11 controller
10.240.0.20 worker-0
10.240.0.21 worker-1
10.240.0.22 worker-2

設定 10.240.0.1-10.240.0.9 作為 Loadbalance address-pools

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 10.240.0.1-10.240.0.9
EOF

測試結果

建立 Type為 LoadBalancer 的 Nginx 服務 用以測試

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: nginx
        image: nginx:1.19.4
        ports:
        - containerPort: 80
EOF

建立成功後 可以發現 EXTERNAL-IP 為 10.240.0.2
因metalLB 的 Controller 會自動分配IP給 LoadBalancer Type 的 Service

kubectl get svc

# 輸出
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          5d3h
myapp-svc    LoadBalancer   10.102.7.250    10.240.0.2    80:30336/TCP     30m


curl -I http://10.240.0.2

# 輸出
HTTP/1.1 200 OK
Server: nginx/1.19.4
Date: Tue, 03 May 2022 17:45:36 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 27 Oct 2020 15:09:20 GMT
Connection: keep-alive
ETag: "5f983820-264"
Accept-Ranges: bytes

轉載請註明來源,若有任何錯誤或表達不清楚的地方,歡迎在下方評論區留言,也可以來信至 leozheng0621@gmail.com
如果文章對您有幫助,歡迎斗內(donate),請我喝杯咖啡

斗內💰

×

歡迎斗內

github