MetalLB - 能夠爲私有 Kubernetes 集羣提供LoadBalancer類型的負載均衡支持。nginx
在Kubernetes集羣中,可使用Nodeport、Loadbalancer和Ingress三種方式老來暴露服務給外部訪問(缺省狀況下,內部Pod提供的服務是在相互隔離的子網中,只有同一個Pod內部的幾個容器能夠直接進行網絡訪問)。不過,目前只有Nodeport和Ingress在Kuberntes有內部實現,而要使用Loadbalancer,只能在GCP/AWS等雲服務平臺上使用。Nodeport和Ingress有必定的侷限性,這裏介紹的MetalLB能夠在私有的Kubernetes集羣提供Loadbalancer至此,從而與雲服務商的配置實現徹底一致。git
在私有網絡上運行 Kubernetes,和御三家相比,對 LoadBalancer
類型的服務的支持應該是衆多表面差別中最醒目的一個了。類型爲 LoadBalancer
的服務在 Kubernetes 中並無直接支持,NodePort 和 ExternalIP 方案讓不少私有云用戶成爲了 K8S 世界中的二等公民。接下來介紹的 Metallb
,就給私有 Kubernetes 用戶帶來了一個方便、可用(並且不太成熟)的軟件解決方案。github
該項目發佈於 2017 年末,當前處於 Beta 階段。api
Metallb 會在 Kubernetes 內運行,監控服務對象的變化,一旦察覺有新的 LoadBalancer
服務運行,而且沒有可申請的負載均衡器以後,就會完成兩部分的工做:網絡
用戶須要在配置中提供一個地址池,Metallb 將會在其中選取地址分配給服務。app
根據不一樣配置,Metallb 會以二層(ARP/NDP)或者 BGP 的方式進行地址的廣播。負載均衡
不支持 IPVScurl
網絡插件 | 兼容性 |
---|---|
Calico | 部分支持(有附加文檔) |
Flannel | 支持 |
Kube-router | 不支持(正在跟進) |
Romana | 支持(有附加文檔) |
Weave Net | 支持 |
Metallb 支持 Helm 和 YAML 兩種安裝方法,這裏咱們使用第二種:post
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 供用戶參考。