爲私有Kubernetes集羣建立LoadBalancer服務

爲私有Kubernetes集羣建立LoadBalancer服務

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 供用戶參考。

相關文章
相關標籤/搜索