OpenELB負載均衡器
OpenELB 是一款適用于物理機部署 Kubernetes 的負載均衡器,該負載均衡器使用物理交換機實現(xiàn),利用 BGP 和 ECMP 從而達到性能最優(yōu)和高可用性。我們知道在云上部署的 Kubernetes 環(huán)境下,通常云服務(wù)廠商會提供 cloud LB 插件暴露 Kubernetes 服務(wù)到外網(wǎng),但在物理機部署環(huán)境下由于沒有云環(huán)境,服務(wù)暴露給外網(wǎng)非常不方便,Porter 是一個提供用戶在物理環(huán)境暴露服務(wù)和在云上暴露服務(wù)一致性體驗的插件。該插件提供兩大功能模塊:
- LB controller 和 agent: controller 負責(zé)同步 BGP 路由到物理交換機;agent 以 DaemonSet 方式部署到節(jié)點上負責(zé)維護引流規(guī)則;
- EIP service,包括 EIP pool 管理和 EIP controller,controller 會負責(zé)更新服務(wù)的 EIP 信息。
OpenELB 是 KubeSphere 的一個子項目。
物理部署架構(gòu)
下圖是物理部署架構(gòu)圖,假設(shè)有一個服務(wù)部署在 node1 (192.168.0.2) 和 node2 (192.168.0.6) 上,需要通過公網(wǎng) IP 1.1.1.1 訪問該服務(wù),服務(wù)部署人員按照示例部署該服務(wù)后,Porter 會自動同步路由信息到 leaf 交換機,進而同步到 spine,border 交換機,互聯(lián)網(wǎng)用戶就可以通過 EIP 1.1.1.1 直接訪問該服務(wù)了。
插件部署架構(gòu)
插件通過一個Manager監(jiān)控集群中的 Service 的變化,廣播相關(guān)路由。同時集群中所有節(jié)點都部署有一個 Agent,每當(dāng)有一個 EIP 被使用時,就會在主機上添加一條主機路由規(guī)則,將發(fā)往這個 EIP 的 IP 報文引流到本地。
插件邏輯
該插件以服務(wù)的形式部署在 Kubernetes 集群中時,會與集群的邊界路由器(三層交換機)建立 BGP 連接。每當(dāng)集群中創(chuàng)建了帶有特定注記(一個 annotation 為 lb.kubesphere.io/v1apha1: porter,見示例)的服務(wù)時,就會為該服務(wù)動態(tài)分配 EIP (用戶也可以自己指定 EIP),LB controller 創(chuàng)建路由,并通過 BGP 將路由傳導(dǎo)到公網(wǎng)(私網(wǎng))中,使得外部能夠訪問這個服務(wù)。
OpenELB controller 是基于 Kubernetes controller runtime 實現(xiàn)的 custom controller,通過 watch service 的變化自動變更路由信息。
部署插件
從代碼構(gòu)建新的插件
軟件需求
- go 1.11,插件使用了 gobgp 創(chuàng)建 BGP 服務(wù)端,gobgp 需要 go 1.11
- docker,無版本限制
- kustomize,插件使用了 kustomize 動態(tài)生成集群所需的 k8s yaml 文件
- 如果插件會推送到遠端私有倉庫,需要提前執(zhí)行
docker login
步驟
-
git clone https://github.com/kubesphere/porter.git, 進入代碼目錄 - 按照上面教程的要求修改 config.toml (位于
config/bgp/下) - (optional)根據(jù)自己需要修改代碼
- (optional)根據(jù)自己的需求修改鏡像的參數(shù)(位于
config/manager下) - (optional)按照模擬教程部署一個Bird主機,修改
hack/test.sh中的BirdIP,然后運行make e2e-test進行e2e測試 - 修改 Makefile中 的 IMG 名稱,然后
make release,最終的 yaml 文件在deploy目錄下 -
kubectl apply -f deploy/release.yaml部署插件
開源許可
OpenELB is licensed under the Apache License, Version 2.0. See LICENSE for the full license text.
