經過 Helm 在 Kubernetes 上快速部署 EMQ X 集羣

經過 EMQ X 提供的 Helm chart 能夠很簡單地將 EMQ X 部署至 Kubernetes 平臺。在開始以前,請確保遵循 Helm文檔指南 來安裝 Helm。html

關於 Kubernetes

Kubernetes 是普遍應用的提供自動部署、擴展和運行應用程序開源容器編排平臺。node

使用 Kubernetes, 能夠快速高效地響應客戶需求:git

  • 快速、可預測地部署應用程序
  • 擁有即時擴展應用程序的能力
  • 不影響現有業務的狀況下,無縫地發佈新功能
  • 優化硬件資源,下降成本

Kubernetes 具備以下特色:

  • 便攜性: 不管公有云、私有云、混合雲仍是多雲架構都全面支持
  • 可擴展: 它是模塊化、可插拔、可掛載、可組合的,支持各類形式的擴展
  • 自修復: 它能夠自保持應用狀態、可自重啓、自複製、自縮放的,經過聲明式語法提供了強大的自修復能力

Kubernetes 項目由 Google 公司在 2014 年啓動。Kubernetes 創建在 Google 公司超過十餘年的運維經驗基礎之上,Google 全部的應用都運行在容器上, 再與社區中最好的想法和實踐相結合,也許它是最受歡迎的容器平臺。github

關於 Helm

Helm 是一個 kubernetes 應用的包管理工具,用來管理 [charts] (https://github.com/kubernetes...——預先配置好的安裝包資源,有點相似於 Ubuntu 的 APT 和 CentOS 中的 yum 。web

Helm chart 是用來封裝 kubernetes 原生應用程序的 yaml 文件,能夠在部署應用的時候自定義應用程序的一些metadata,便與應用程序的分發。docker

Helm 和 charts 的主要做用:api

  • 應用程序封裝
  • 版本管理
  • 依賴檢查
  • 便於應用程序分發

Setup

  • Kubernetes 1.6+
  • Helm

快速部署一個簡單的 EMQ X 集羣

  • 添加 Helm 倉庫安全

    $ helm repo add emqx https://repos.emqx.io/charts
  • 查詢 EMQ Xwebsocket

    helm search emqx
    NAME         CHART VERSION    APP VERSION      DESCRIPTION
    emqx/emqx    v1.0.0-beta.1    v1.0.0-beta.1    A Helm chart for Emqx
    EMQ X Chart 當前是 Beta 版,因此在執行 helm install 命令的時候須要添加 --devel,正式版的 Chart 無需添加該選項,請讀者注意。
  • 啓動 EMQ X 集羣,設置 service.type=NodePort,並指定使用的 imageemqx/emqx:v3.2.3架構

    $ helm install --devel --name my-emqx --set service.type=NodePort --set image=emqx/emqx:v3.2.3 emqx/emqx
  • 查看 EMQ X 集羣狀況

    $ kubectl get pods
    NAME       READY  STATUS             RESTARTS  AGE
    my-emqx-0  1/1    Running            0         81m
    my-emqx-1  1/1    Running            0         81m
    my-emqx-2  1/1    Running            0         80m
    
    $ kubectl exec -it my-emqx-0 -- emqx_ctl cluster status
    Cluster status: [{running_nodes,['my-emqx@192.168.109.82',
                                     'my-emqx@192.168.71.78',
                                     'my-emqx@192.168.95.126']}]
  • 查看 EMQ X service

    $ kubectl get svc
    NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                                      AGE
    kubernetes           ClusterIP   10.100.0.1      <none>        443/TCP                                                                                      7h26m
    my-emqx              NodePort    10.100.213.62   <none>        1883:30068/TCP,8883:32463/TCP,8080:31854/TCP,8083:32057/TCP,8084:31459/TCP,18083:31539/TCP   57s
    my-emqx-headless     ClusterIP   None            <none>        1883/TCP,8883/TCP,8080/TCP,8083/TCP,8084/TCP,18083/TCP                                       57s

    能夠看到 my-emqx 的 18083 端口對應的宿主機IP是31539。( NodePort 在每次部署的時候都會變化,以實際部署時爲準。)

  • 訪問 Kubernetes 的任意一臺節點IP的31539端口,輸入默認用戶名:admin,默認密碼:public,登錄 EMQ X Dashboard。
  • 刪除 EMQ X 集羣

    $ helm del --purge my-emqx

部署一個持久化的 EMQ X 集羣

EMQ X 經過 建立 PVC 資源掛載 /opt/emqx/data/mnesia 目錄實現持久化 pods在部署 EMQ X 以前,用戶須要部署 Haproxy 或 Nginx-PLUS 等負載均衡器,並自行在 Kubernetes 中建立 PV 資源或是 Storage Classes 資源

  • 添加 Helm 倉庫

    $ helm repo add emqx https://repos.emqx.io/charts
  • 啓動 EMQ X 集羣

    持久化 EMQ X 集羣須要進行如下的設置:

    image=emqx/emqx:v3.2.3
    emqxAddressType=hostname
    persistence.enabled=true

    注意:持久化EMQ X 僅支持 v3.2.1 以上的版本

    • 若是用戶部署了 PV 資源,那麼設置 persistence.existingClaim=your_pv_name

      $ helm install --devel --name my-emqx --set image=emqx/emqx:v3.2.3 --set emqxAddressType=hostname --set persistence.enabled=true --set persistence.existingClaim=your_pv_name  emqx/emqx
    • 若是用戶部署了 Storage Classes 資源,那麼設置persistence.storageClass=your_storageClass_name

      $ helm install --devel --name my-emqx --set image=emqx/emqx:v3.2.3 --set emqxAddressType=hostname --set persistence.enabled=true --set persistence.storageClass=your_storageClass_name emqx/emqx
  • 查看 EMQ X 集羣狀況

    $ kubectl get pods
    NAME       READY  STATUS             RESTARTS  AGE
    my-emqx-0  1/1    Running            0         81m
    my-emqx-1  1/1    Running            0         81m
    my-emqx-2  1/1    Running            0         80m
    
    $ kubectl exec -it my-emqx-0 -- emqx_ctl cluster status
    Cluster status: [{running_nodes,['my-emqx@my-emqx-2.my-emqx-headless.default.svc.cluster.local',
                                     'my-emqx@my-emqx-1.my-emqx-headless.default.svc.cluster.local',
                                     'my-emqx@my-emqx-0.my-emqx-headless.default.svc.cluster.local']}]
  • 以 Storage Classes 爲例,能夠看到 PVC 資源已經成功的創建

    $ kubectl get pvc
    NAME                  STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    emqx-data-my-emqx-0   Bound     pvc-8094cd75-adb5-11e9-80cc-0697b59e8064   1Gi        RWO            gp2            2m11s
    emqx-data-my-emqx-1   Bound     pvc-9325441d-adb5-11e9-80cc-0697b59e8064   1Gi        RWO            gp2            99s
    emqx-data-my-emqx-2   Bound     pvc-ad425e9d-adb5-11e9-80cc-0697b59e8064   1Gi        RWO            gp2            56s

    集羣會將 EMQ X 的 /opt/emqx/data/mnesia 目錄掛載到 PVC 中,當 Pods 被從新調度以後,EMQ X 會從 /opt/emqx/data/mnesia 目錄中獲取數據並恢復

  • 查看 EMQ X 的 ClusterIP

    $ kubectl get svc
    NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                  AGE
    kubernetes           ClusterIP   10.100.0.1      <none>        443/TCP                                                  24h
    my-emqx              ClusterIP   10.100.205.13   <none>        1883/TCP,8883/TCP,8080/TCP,8083/TCP,8084/TCP,18083/TCP   26m
    my-emqx-headless     ClusterIP   None            <none>        1883/TCP,8883/TCP,8080/TCP,8083/TCP,8084/TCP,18083/TCP   26m

    能夠看到 my-emqx 的 ClusterIP 爲 10.100.205.13 ( ClusterIP 在每次部署的時候都會變化,以實際部署時爲準。)

  • 將負載均衡監聽的 URL 的 188三、888三、8080、808三、808四、18083 端口轉發到 my-emqx 的 ClusterIP,若是有 TLS 鏈接的須要,推薦在負載均衡器終結 SSL 鏈接。客戶端與負載均衡器之間 TLS 安全鏈接,LB 與 EMQ X 之間普通 TCP 鏈接。
  • 訪問 URL:18083,輸入默認用戶名:admin,默認密碼:public,登錄 EMQ X dashboard。
  • 使用 helm upgrade 命令能夠輕鬆擴展 EMQ X 集羣,下面以增長 EMQ X 節點爲例展現 helm upgrade命令

    # 將 EMQ X 的節點數量變動爲5個
    # 注意:EMQ X 的節點數量建議爲單數
    $ helm upgrade --set replicas=5 my-emqx emqx/emqx
    $ kubectl get pods
    NAME       READY  STATUS             RESTARTS  AGE
    my-emqx-0  1/1    Running            0         81m
    my-emqx-1  1/1    Running            0         81m
    my-emqx-2  1/1    Running            0         80m
    my-emqx-3  1/1    Running            0         22m
    my-emqx-4  1/1    Running            0         22m
    
    $ kubectl exec -it my-emqx-0 -- emqx_ctl cluster status
    Cluster status: [{running_nodes,['my-emqx@my-emqx-4.my-emqx-headless.default.svc.cluster.local',
                                     'my-emqx@my-emqx-3.my-emqx-headless.default.svc.cluster.local',
                                     'my-emqx@my-emqx-2.my-emqx-headless.default.svc.cluster.local',
                                     'my-emqx@my-emqx-1.my-emqx-headless.default.svc.cluster.local',
                                     'my-emqx@my-emqx-0.my-emqx-headless.default.svc.cluster.local']}]
  • 刪除 EMQ X 集羣

    $ helm del --purge my-emqx

    注意:EMQ X 集羣刪除掉以後 PVC 資源不會自動釋放掉,以便恢復 EMQ X ,確認不須要恢復後須要手動刪除 PVC 資源

    $ kubectl get pvc
    NAME                  STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    emqx-data-my-emqx-0   Bound     pvc-8094cd75-adb5-11e9-80cc-0697b59e8064   1Gi        RWO            gp2            84m
    emqx-data-my-emqx-1   Bound     pvc-9325441d-adb5-11e9-80cc-0697b59e8064   1Gi        RWO            gp2            84m
    emqx-data-my-emqx-2   Bound     pvc-ad425e9d-adb5-11e9-80cc-0697b59e8064   1Gi        RWO            gp2            83m
    emqx-data-my-emqx-3   Bound     pvc-b6c5a565-adbd-11e9-80cc-0697b59e8064   1Gi        RWO            gp2            25m
    emqx-data-my-emqx-4   Bound     pvc-c626cafd-adbd-11e9-80cc-0697b59e8064   1Gi        RWO            gp2            25m
    
    $ kubectl delete pvc emqx-data-my-emqx-0 emqx-data-my-emqx-1 emqx-data-my-emqx-2 emqx-data-my-emqx-3 emqx-data-my-emqx-4                    
    persistentvolumeclaim "emqx-data-my-emqx-0" deleted
    persistentvolumeclaim "emqx-data-my-emqx-1" deleted
    persistentvolumeclaim "emqx-data-my-emqx-2" deleted
    persistentvolumeclaim "emqx-data-my-emqx-3" deleted
    persistentvolumeclaim "emqx-data-my-emqx-4" deleted

部署 EMQ X Edge 集羣和 EMQ X 企業版集羣

EMQ X Edge

部署 EMQ X Edge 集羣指定 image=emqx/emqx-edge:v3.2.3 ,其餘設置與部署 EMQ X 集羣保持一致

$ helm install --devel --name my-emqx --set service.type=NodePort --set image=emqx/emqx-edge:v3.2.3 emqx/emqx

EMQ X EE

部署 EMQ X 企業版集羣首先須要登錄 emqx.io 申請並下載 License 文件,並將 License 文件建立爲 Secret 資源

$ kubectl create secret generic your-license-secret-name --from-file=/path/to/emqx.lic

而後在部署時指定 emqxLicneseSecretName=your-license-secret-nameimage=emqx/emqx-ee:v3.4.0,其餘設置與部署 EMQ X 集羣保持一致

helm install --devel --name my-emqx --set service.type=NodePort --set image=emqx/emqx-ee:v3.2.3 --set emqxLicneseSecretName=your-license-secret-name emqx/emqx

EMQ X Helm Chart 配置項

參數 描述 Default Value
apiserver Kubernates API server https://kubernetes.default.svc:443
namespace kubernetes namespace default
replicas EMQ X 節點數量,建議保持奇數個節點,否則腦裂後沒法自動恢復 3
image EMQ X 鏡像名稱 emqx/emqx:latest
imagePullPolicy 獲取鏡像的策略 IfNotPresent
persistence.enabled 是否啓用 PVC false
persistence.storageClass Storage class 名稱 nil
persistence.existingClaim PV 名稱 ""
persistence.accessMode PVC 訪問模式 ReadWriteOnce
persistence.size PVC 容量 20Mi
resources CPU/內存資源 {}
service.type Emqx 集羣服務類型 ClusterIP
service.mqttPort MQTT 協議端口 1883
service.mqttsslPort MQTT/SSL 端口 8883
service.mgmtPort 管理API 端口 8080
service.websocketPort MQTT/WebSocket 端口 8083
service.wssPort MQTT/WebSocket/SSL 端口 8084
service.dashboardPort Dashboard 端口 18083
emqxAddressType 用於從k8s服務中獲取EMQ X 節點
可選值:ip、dns、hostname
注意:hosename 僅支持 EMQ X v3.2.1 以後的版本
ip
emqxConfig EMQ X 配置項,詳情查看文檔 {}
emqxLicneseSecretName EMQ X 企業版須要手動將 License 文件建立爲 Secret 資源 ""

當須要設置複雜參數的時候,可使用 Yaml 文件來記錄參數

$ helm install --devel --name my-emqx -f values.yaml emqx/emqx
你能夠從 Github 獲取默認的 values.yaml

更多信息請訪問咱們的官網 emqx.io,或關注咱們的開源項目 github.com/emqx/emqx ,詳細文檔請訪問 官方文檔

相關文章
相關標籤/搜索