本地自己安裝的k8s集群, 默認是不支持LoadBlancer的, 需要自己安裝一個組件來支持. 而雲上的k8s, 肯定是都支持LoadBalancer的.
如果自己公司搭建集群, 那肯定也是需要安裝LoadBlancer的, 我們看看都有哪些支持本地集群的實現哪:
- metalLB: Netlify是一家位於舊金山的雲計算公司,為Web應用程序和靜態網站提供托管和無服務器后端服務.
- openelb: 之前是PorterLB, KubeSphere公司開源的, 是有中文文檔的, 不過改名的過程中, 有點亂.
然后這是 OpenELB寫的對比: https://github.com/kubesphere/openelb/blob/master/doc/zh/compared_with_metallb.md
最終我測試了metalLB
- openelb的文檔太亂了
- metalLB使用ConfigMap來配置IP池, openELB使用 eip來配置IP池--方便監控
- metaLB聲明的時候無需特殊設置, openELB必須使用 annotations: lb.kubesphere.io/v1alpha1: porter
我們來看看如何安裝使用metalLB, (其實步驟都很簡單, 切換為openELB也很容易)
確認strictARP模式
如果你的網絡是運行在IPVS模式下(默認是iptables), 那么需要設置strictARP模式:
kubectl edit configmap -n kube-system kube-proxy
修改其中的strictARP為true:
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
安裝 metalLB:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml
如果鏡像來不下來, 就用vpn.... 我發現用k8s就必須學會用vpn或者遷移大法才行...因為好多鏡像都拉不下來...也沒警告!!
手工檢查Pod是否啟動正常, 會不會卡在拉鏡像的步驟?
[root@centos1 ~]# k get pods -n metallb-system
NAME READY STATUS RESTARTS AGE
controller-6b78bff7d9-84cvr 1/1 Running 0 16d
speaker-5n8pm 1/1 Running 0 16d
speaker-5zsbb 1/1 Running 0 16d
speaker-wc47c 1/1 Running 0 16d
如果看到metallb-system命名空間下有controller, speaker等進程已經在Running狀態, 說明正常.
配置IP池
這里我們使用layer2協議, 畢竟本地測試沒有BGP設備, 如果是正式用, 還是要上BGP設備的.
先找網絡管理員申請預留的IP端, 配置如下:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 172.18.0.203-172.18.0.210
然后配置上去
kubectl apply -f metallb.ip.yaml
如果是BGP的話, 文檔在這: https://metallb.universe.tf/configuration/
測試效果
現在我們來部署一個Nginx來看看
kubectl apply -f nginx.test.yaml
其中內容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-metallb-test
spec:
selector:
matchLabels:
app: nginx-metallb-test
template:
metadata:
labels:
app: nginx-metallb-test
spec:
containers:
- name: nginx
image: nginx:1.8
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx-metallb-test
type: LoadBalancer
上面聲明的Service的類型為LoadBalancer, 無其他特殊設置.
服務創建之后, 我們來看看效果:
[root@centos1 metalLB]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
apple-service ClusterIP 10.98.221.159 <none> 5678/TCP 17h app=apple
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23h <none>
nginx-service LoadBalancer 10.103.59.125 172.18.0.203 80:32046/TCP 3s app=nginx-metallb-test
打開瀏覽器, 訪問 172.18.0.203 即可訪問nginx.
如果是正式環境, 則使用DNS解析到此IP, 使用域名訪問服務即可.
當然如果你有多個服務, 你也可以使用Nginx Ingress來通過域名和路徑區分不同的服務, 那就是另外的話題了.