MetalLB自建私有Kubernetes的LoadBalancer負載均衡類型服務


簡介

在私有網絡上運行 Kubernetes,和御三家相比,對 LoadBalancer 類型的服務的支持應該是眾多表面差異中最醒目的一個了。類型為 LoadBalancer 的服務在 Kubernetes 中並沒有直接支持,NodePort 和 ExternalIP 方案讓很多私有雲用戶成為了 K8S 世界中的二等公民。接下來介紹的 Metallb,就給私有 Kubernetes 用戶帶來了一個方便、可用(而且不太成熟)的軟件解決方案。https://metallb.universe.tf/

該項目發布於 2017 年底,當前處於 Beta 階段。

Metallb 會在 Kubernetes 內運行,監控服務對象的變化,一旦察覺有新的 LoadBalancer 服務運行,並且沒有可申請的負載均衡器之后,就會完成兩部分的工作:

地址分配

用戶需要在配置中提供一個地址池,Metallb 將會在其中選取地址分配給服務。

地址廣播

根據不同配置,Metallb 會以二層(ARP/NDP)或者 BGP 的方式進行地址的廣播。

支持范圍

不支持 IPVS

網絡插件 兼容性
Calico 部分支持(有附加文檔)
Flannel 支持
Kube-router 不支持(正在跟進)
Romana 支持(有附加文檔)
Weave Net 支持

一個小測試

安裝

Metallb 支持 Helm 和 YAML 兩種安裝方法,這里我們使用第二種:

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.1/manifests/metallb.yaml

很簡單,Metallb 就會開始安裝,會生成自己的命名空間以及 RBAC 配置。

$ kubectl get pods -n metallb-system
NAME                         READY     STATUS    RESTARTS   AGE
controller-b7896bf94-g449l   1/1       Running   0          51m
speaker-mt6kd                1/1       Running   0          51m
speaker-sqbn4                1/1       Running   0          51m

配置

接下來我們要生成一個 Configmap 文件,為 Metallb 設置網址范圍以及協議相關的選擇和配置,這里以一個簡單的二層配置為例:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: my-ip-space
      protocol: layer2
      addresses:
      - 10.211.55.240/28

注意:這里的 IP 地址范圍需要跟集群實際情況相對應。

使用 kubectl apply 命令應用之后,使用 kubectl logs -f [metallb-controller-pod] 會看到配置更新過程。

測試

創建一個 Nginx 的服務,服務類型為 LoadBalancer

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1
        ports:
        - name: http
          containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

服務創建運行之后,可以列出服務信息:

kubectl get svc
NAME       TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)         AGE
kube-dns   ClusterIP      10.96.0.10      <none>          53/UDP,53/TCP   7d
nginx      LoadBalancer   10.96.245.212   10.211.55.240   80:32207/TCP    54m

這里就發現,LoadBalancer 類型的服務,分配到了我們地址池中的第一個 IP。

用 curl http://10.211.55.240 驗證,就會發現返回了 Nginx 的歡迎信息。

補充

除了這里提到的一點點簡單配置之外,Metallb 的配置能力還是比較強大的,這點可以參考官網,其中談及了不少較為務實的案例,另外還提到了部分 Issue 供用戶參考。

原文:https://blog.fleeto.us/post/intro-metallb/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM