k8s: 使用metalLB來實現負載均衡Load Balancer


本地自己安裝的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來通過域名和路徑區分不同的服務, 那就是另外的話題了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM