簡介
在私有網絡上運行 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/