通过 EMQ X 提供的 Helm chart 可以很简单地将 EMQ X 部署至 Kubernetes 平台。在开始之前,请确保遵循 Helm文档指南 来安装 Helm。
关于 Kubernetes
Kubernetes 是广泛应用的提供自动部署、扩展和运行应用程序开源容器编排平台。
使用 Kubernetes, 可以快速高效地响应客户需求:
- 快速、可预测地部署应用程序
- 拥有即时扩展应用程序的能力
- 不影响现有业务的情况下,无缝地发布新功能
- 优化硬件资源,降低成本
Kubernetes 具有如下特点:
- 便携性: 无论公有云、私有云、混合云还是多云架构都全面支持
- 可扩展: 它是模块化、可插拔、可挂载、可组合的,支持各种形式的扩展
- 自修复: 它可以自保持应用状态、可自重启、自复制、自缩放的,通过声明式语法提供了强大的自修复能力
Kubernetes 项目由 Google 公司在 2014 年启动。Kubernetes 建立在 Google 公司超过十余年的运维经验基础之上,Google 所有的应用都运行在容器上, 再与社区中最好的想法和实践相结合,也许它是最受欢迎的容器平台。
关于 Helm
Helm 是一个 kubernetes 应用的包管理工具,用来管理 [charts] (https://github.com/kubernetes/charts)——预先配置好的安装包资源,有点类似于 Ubuntu 的 APT 和 CentOS 中的 yum 。
Helm chart 是用来封装 kubernetes 原生应用程序的 yaml 文件,可以在部署应用的时候自定义应用程序的一些metadata,便与应用程序的分发。
Helm 和 charts 的主要作用:
- 应用程序封装
- 版本管理
- 依赖检查
- 便于应用程序分发
Setup
- Kubernetes 1.6+
- Helm
快速部署一个简单的 EMQ X 集群
-
添加 Helm 仓库
$ helm repo add emqx https://repos.emqx.io/charts
-
查询 EMQ X
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
,并指定使用的image
为emqx/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,['[email protected]', '[email protected]', '[email protected]']}]
-
查看 EMQ X service
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1
443/TCP 7h26m my-emqx NodePort 10.100.213.62 1883:30068/TCP,8883:32463/TCP,8080:31854/TCP,8083:32057/TCP,8084:31459/TCP,18083:31539/TCP 57s my-emqx-headless ClusterIP 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,['[email protected]', '[email protected]', '[email protected]']}]
-
以 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
443/TCP 24h my-emqx ClusterIP 10.100.205.13 1883/TCP,8883/TCP,8080/TCP,8083/TCP,8084/TCP,18083/TCP 26m my-emqx-headless ClusterIP None 1883/TCP,8883/TCP,8080/TCP,8083/TCP,8084/TCP,18083/TCP 26m 可以看到
my-emqx
的 ClusterIP 为10.100.205.13
( ClusterIP 在每次部署的时候都会变化,以实际部署时为准。) 将负载均衡监听的 URL 的 1883、8883、8080、8083、8084、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,['[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]']}]
-
删除 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-name
,image=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