经过 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 ,详细文档请访问 官方文档

相关文章
相关标签/搜索