Building a K8S load balancer yourself
v1.0
2019-07-30
一、前言
看網絡上許多關於 K8S 的文章,談到服務(Service)導出方法的時候,若不想手動操作 expose 或使用 NodePort 的話,其中有一個選項是 LoadBalancer。聽起來是非常 cool 的方式,可惜大部分都是雲端服務商才能提供的服務。這對於一般入門者來說,消費雲端服務是一項奢侈品項,或是單純練習並想花那些成本。
然而,對於成功自架 K8S Cluster 的朋友來說,可以安裝 MetalLB 這個產品提供 local 的負載平衡器,實在是一大福音!
二、安裝步驟
2.1 直接用 kubectl 部署:
kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml成功的話,會多出一個 metallb-system 的 name space,裏面會運行如下兩種 pod:
controller
speaker
2.2 配置 ConfigMap
請以文字編輯器編輯一份 yaml (metallb_configmap.yml),其內容如下:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: my-ip-space
protocol: layer2
addresses:
- 192.168.100.240-192.168.100.249
請注意:將 ip range 修改爲設當的網段:可以連線也不會造成 IP 位置衝突即可。
完成後套用 ConfigMap:
kubectl apply -f metallb_configmap.yml沒錯,就這麼簡單!這樣我們的 MetalLB 就已經設定完成了。
三、測試
如下,我們透過一個簡單的 nginx 服務來測試 LoadBalancer 是否可以運作。
3.1 建立 nginx deployment 設定檔(nginx.yaml),其內容如下:
apiVersion: v1
kind: Namespace
metadata:
name: metallb-test
labels:
app: metallb
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: metallb-test
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment
namespace: metallb-test
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
sessionAffinity: None
type: LoadBalancer
這裏我們獨立建一個 metallb-test 的 name space 以便我們測試用。
3.2 執行部署:
kubeclt apply -f nginx.yaml3.3 假如部署沒有問題,我們就可以執行如下命令來檢查結果:
kubectl -n metallb-test get svc -o wide應該看到類似如下這樣的 EXTERNAL-IP :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx-deployment LoadBalancer 10.103.250.239 192.168.100.240 80:16656/TCP 2m51s app=nginx
這就代表 MetalLB 這個 LoadBalancer 是可以 work 的!
3.4 清除部署:
kubeclt delete -f nginx.yaml四、結論
MetalLB 可以說是窮人的 K8S LoadBalancer,設定非常簡單,部署上沒有太高難度。非常適合自架練習 K8S 服務使用。