EMQX Operator 如何快速创建弹性伸缩的 MQTT 集群

简介: 本文将通过对EMQX Kubernetes Operator核心特性及应用实操的详细讲解,帮助读者进一步掌握如何快速创建部署及自动化管理可弹性伸缩的MQTT集群。

引言:拥抱云原生的 EMQX 5.0

云原生理念逐渐深入到各企业关键业务的应用开发中。对于一个云原生应用来说,水平扩展和弹性集群是其应具备的重要特性。

作为积极拥抱云原生的大规模分布式开源物联网 MQTT 消息服务器EMQX 最新发布的 5.0 版本采用了新的后端存储架构 Mria 数据库,并重构了数据复制逻辑,增加了 Replicant 节点角色,使用户可以摆脱有状态节点的限制,对 EMQX 集群进行更加弹性的水平扩展,打造更加符合云原生理念的物联网应用。

详情请查看: 《Mria + RLOG 新架构下的 EMQX 5.0 如何实现 1 亿 MQTT 连接》

用户可以通过 EMQ 发布的管理工具 EMQX Kubernetes Operator,利用 EMQX 5.0 的 Replicant 节点特性,在 Kubernetes 上通过 Deployment 资源实现无状态节点的部署,快速创建并管理可以承载大规模 MQTT 连接和消息吞吐的 EMQX 集群。

本文将通过对 EMQX Kubernetes Operator 核心特性及应用实操的详细讲解,帮助读者进一步掌握如何快速创建部署及自动化管理可弹性伸缩的 EMQX 集群,充分利用 EMQX 5.0 对云原生的支持特性,拥抱云原生。

什么是 EMQX Kubernetes Operator

相信大家对于 Kubernetes(K8s)已并不陌生。它是一个用于自动化部署、扩展和管理容器化应用程序的广泛使用的开源平台。

在 Kubernetes 上,Operator 是对 Kubernetes API 的软件扩展,它使用自定义资源定义(CRD)来提供一个特定于应用程序的 API。Operator 遵循基本的 Kubernetes 原则,如使用 Controllers( Controller loops )来调节系统的状态。

Operator 模式结合了自定义资源(CRD)和自定义控制器,将应用程序的领域知识编码为 Kubernetes API 的扩展,可以自动完成常见的协调任务。

Kubernetes MQTT.png

EMQX Kubernetes Operator 则是一个特定于 EMQX 的控制器,它允许 DevOps 在 Kubernetes 中管理 EMQX 集群部署的生命周期。EMQX Kubernetes Operator 作为 Kubernetes 上的自定义控制器运行,并与 Kubernetes API 服务器(kube-apiserver)进行通信,将高层描述转换为正常的 Kubernetes 资源,以保持所需的应用程序状态。

简单来讲,EMQX Kubernetes Operator 可以帮助用户在 Kubernetes 环境上快速创建和管理 EMQX 集群,不仅极大简化部署和管理流程,也降低了管理和配置的专业技能要求。

EMQX 历经多年迭代,我们也积累了丰富的 EMQX 部署、调优和运维的经验。EMQX Kubernetes Operator 便是我们将这些经验转换为代码的一种成果体现。它使部署和管理工作变成一种低成本、标准化、可重复性的能力,帮助用户高效实现集群扩容、无缝升级、故障处理和统一监控。

EMQX Kubernetes Operator VS EMQX Helm Chart

对大多数人来说,手工编写 YAML 文件并不有趣,而且每次需要在 Kubernetes 集群中部署应用或修改配置设置时都要手工编写自定义 YAML,这是一项复杂而且容易出错的工作。

Kubernetes 中的 Helm Chart 和 Operator 则解决了这一难题。这两种用于自动化任务的便捷工具为管理员提供了一种简单的方法,将应用程序或配置部署到 Kubernetes 集群中。这样一来,他们就可以更好地利用 Kubernetes。不过,尽管它们做类似的事情,并不意味着它们是完全可以互换的。

除了 Operator,EMQX 在 Kubernetes 上也提供了 Helm Chart 部署方式,用户可以根据自己的需求选择更合适的部署方式:

  • EMQX Helm Chart

    Helm 是 Kubernetes 的包管理系统。使用称为 Helm Chart 的打包格式,某人可以将应用程序(例如 Apache HTTP)打包成任何其他人都可以通过几条命令部署到 Kubernetes 集群上的格式,同时只需很少或无需手动更改 YAML 文件。

    如果您熟悉 Linux 环境中的包管理,Helm 图表应该很容易理解。它们类似于 Debian 或 RPM 软件包,而 Helm 本身类似于 apt 或 dnf。就像你可以在 Ubuntu 上 apt-get install [some package]一样,你可以在 Kubernetes 上helm install [some package] 来让应用程序快速启动并运行。

    EMQX 从 4.0 版本开始就提供了 EMQX Helm Chart,通过 EMQX Helm Chart ,用户可以快速在 Kubernetes 上部署一套 EMQX 集群,并完成初始化操作。Helm Chart 的使用足够简单,适合第一次接触 EMQX 的用户部署和尝鲜。

    不过,Helm Chart 虽然容易上手,但是它只能提供最基本的部署能力。对于 EMQX 这种有状态集群的运维,Kubernetes Operator 是个更好的选择。

  • EMQX Kubernetes Operator

    如上文所述,通过 Kubernetes 自定义资源(CRD),用户可以使用声明式 API 描述 EMQX 集群,EMQX Kubernetes Operator 会不停调度 Kubernetes 的资源,使 EMQX 集群最终与用户所声明的保持一致。其中大量的运维和更新操作是由 EMQX Kubernetes Operator 自动完成的,用户并不需要关心。

    EMQX Kubernetes Operator 可以让我们更灵活地管理和运维 EMQX 集群,可以让我们摆脱掉复杂而且容易出错的配置修改工作,从而节约大量成本。

    EMQX Helm Chart 与 EMQX Kubernetes Operator 并不是互相竞争,而是互补的关系。EMQX 同时提供这两种部署方式,就是为了让用户可以在不同的场景下选择最适合自己的那一种。

随 EMQX 5.0 一同升级的 EMQX Kubernetes Operator

随着 EMQX 5.0 在全新 HOCON 格式配置、Replicant 角色节点等方面的更新,我们也为用户在 Kubernetes 的复杂环境中轻松部署和运维 EMQX 提供了捷径——即将发布的 EMQX Kubernetes Operator 2.0 可以完美支持 EMQX 5.0 的部署管理,在集群策略、配置格式等方面进行了优化升级:

  • 全新的集群策略

    EMQX Kubernetes Operator 2.0 依然使用了 Statefulset 资源部署 EMQX Core 节点,这与之前的特性是保持一致的。用户依然可以通过 StoreClass 等 Kubernetes 资源持久化 EMQX 的业务数据,并保证节点的有序性。

    与之前有所不同的是,EMQX Kubernetes Operator 2.0 利用了 Deployment 资源来部署 EMQX Replicant 节点。相比于 Core 节点,Replicant 节点彼此独立,只向 Core 节点发起请求并组成集群,Replicant 节点没有绑定任何持久化的资源,这意味着他们可以随时被销毁和重建。用户可以通过修改 EMQX 自定义资源快速的伸缩 Replicant 节点的数量,更灵活地处理自己的业务。

    EMQX 集群策略.png

EMQX Kubernetes Operator 2.0 会将所有的管理请求(如 Dashboard、API)路由到 Core 节点,同时将所有的业务请求路由到 Replicant 节点,提高集群的稳定性。

  • 全新的配置格式

    在之前的版本中,EMQX Kubernetes Operator 是通过环境变量将配置传递给 EMQX 的,这意味着如果修改配置就会导致 Pod 的重启,而且需要用户熟练掌握 EMQX 的配置与环境变量的转换规则,并不十分友好。EMQX Kubernetes Operator 2.0 将利用 EMQX 全新的 HOCON 配置和 Dashboard 的热配置功能,允许用户将原生的 EMQX 配置写入 EMQX 自定义资源中,并鼓励用户在 EMQX 运行时通过 EMQX Dashboard 的热配置功能来修改 EMQX 的配置。这些配置都会在整个集群中生效,并且会在新的节点加入集群时将配置同步过去,保证所有节点的一致性。

  • 全新的升级管理

    在 EMQX 5.0 中,因为引入了不同的集群角色,所以集群升级/降级变得更加复杂。用户需要先升级 EMQX Core 节点,等待所有的 Core 节点升级完毕并且恢复集群后,再升级 Replicant 节点。

    为了简化这一流程,EMQX Kubernetes Operator 2.0 提供了升级管理的能力,当用户想升级 / 降级 EMQX 时,只需要直接修改 EMQX 自定义资源中的 Image,EMQX Kubernetes Operator 就会自动完成所有的工作。

使用 EMQX Kubernetes Operator 快速部署 EMQX 5.0

通过 EMQX Kubernetes Operator,只需要简单的数行 YAML 就可以部署一个 EMQX 集群。

$ cat << "EOF" | kubectl apply -f -                
  apiVersion: apps.emqx.io/v2alpha1
  kind: EMQX
  metadata:
    name: emqx 
  spec:                      
    emqxTemplate:   
      image: emqx/emqx:5.0.6
EOF
emqx.apps.emqx.io/emqx applied

EMQX Kubernetes Operator 默认部署 3 个 Core 节点以及 3 个 Replicant 节点,用户可以通过修改 EMQX 自定义资源来伸缩节点的数量。

$ kubectl get pods 
NAME                              READY   STATUS    RESTARTS        AGE
emqx-core-0                       1/1     Running   0               75s
emqx-core-1                       1/1     Running   0               75s
emqx-core-2                       1/1     Running   0               75s
emqx-replicant-6c8b4fccfb-bkk4s   1/1     Running   0               75s
emqx-replicant-6c8b4fccfb-kmg9j   1/1     Running   0               75s
emqx-replicant-6c8b4fccfb-zc929   1/1     Running   0               75s
$ kubectl get emqx emqx -o json | jq ".status.emqxNodes"
[
  {
    "node": "emqx@172.17.0.11",
    "node_status": "running",
    "otp_release": "24.2.1-1/12.2.1",
    "role": "replicant",
    "version": "5.0.6"
  },
  {
    "node": "emqx@172.17.0.12",
    "node_status": "running",
    "otp_release": "24.2.1-1/12.2.1",
    "role": "replicant",
    "version": "5.0.6"
  },
  {
    "node": "emqx@172.17.0.13",
    "node_status": "running",
    "otp_release": "24.2.1-1/12.2.1",
    "role": "replicant",
    "version": "5.0.6"
  },
  {
    "node": "emqx@emqx-core-0.emqx-headless.default.svc.cluster.local",
    "node_status": "running",
    "otp_release": "24.2.1-1/12.2.1",
    "role": "core",
    "version": "5.0.6"
  },
  {
    "node": "emqx@emqx-core-1.emqx-headless.default.svc.cluster.local",
    "node_status": "running",
    "otp_release": "24.2.1-1/12.2.1",
    "role": "core",
    "version": "5.0.6"
  },
  {
    "node": "emqx@emqx-core-2.emqx-headless.default.svc.cluster.local",
    "node_status": "running",
    "otp_release": "24.2.1-1/12.2.1",
    "role": "core",
    "version": "5.0.6"
  }
]

结语

除了更强大的水平扩展能力,EMQX 5.0 还通过全新改版的 Dashboard 提供了更清晰全面的数据监控与管理能力,提升了可观测性。此外,对 MQTT over QUIC 支持的实现,将使得基于 QUIC 协议的 MQTT 连接 在 Pod 被调度时可以做到无感知切换到另一个 Pod 上,从而进一步提高集群的可用性。这些都将使用户可以借助 EMQX 5.0 构建更加云原生的应用。

EMQX Kubernetes Operator 则为用户创建和管理 EMQX 集群提供了更加便捷的途径,帮助用户更轻松地体验到 EMQX 5.0 的云原生特性。

未来 EMQ 将持续在云原生方向发力,将 EMQX 进化为一个弹性的、无状态的 MQTT Broker,同时配合 eKuiper、Neuron 等 EMQ 边缘计算产品,进一步探索分布式云原生的落地。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/create-a-scalable-mqtt-cluster-with-emqx-operator

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
消息中间件 Ubuntu Java
SpringBoot整合MQTT实战:基于EMQX实现双向设备通信
本教程指导在Ubuntu上部署EMQX 5.9.0并集成Spring Boot实现MQTT双向通信,涵盖服务器搭建、客户端配置及生产实践,助您快速构建企业级物联网消息系统。
470 1
|
7月前
|
边缘计算 负载均衡 NoSQL
FreeMQTT Plus: 一个新型 MQTT Broker 集群的实现
FreeMQTT Plus 是一款基于 MQTT 协议的高性能消息中间件,采用分布式架构解决单点瓶颈问题。其核心由 Nginx 负载均衡器、黑(A)节点(MQTT Broker)、白(B)节点(消息路由)和日志(L)节点组成。通过无主从设计,支持高可用性、负载均衡与灵活扩展。针对会话同步、消息路由等挑战,FreeMQTT Plus 利用 MQTT5 特性定义元命令,实现节点间高效通信,无需依赖第三方组件。适用于物联网海量设备接入与高并发场景,为未来边缘计算和多级集群部署提供坚实基础。
1265 74
|
8月前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
1105 91
|
9月前
|
SQL 弹性计算 分布式计算
阿里云 EMR 发布托管弹性伸缩功能,支持自动调整集群大小,最高降本60%
阿里云开源大数据平台 E-MapReduce 重磅推出托管弹性伸缩功能,基于 EMR 托管弹性伸缩功能,您可以指定集群的最小和最大计算限制,EMR 会持续对与集群上运行的工作负载相关的关键指标进行采样,自动调整集群大小,以获得最佳性能和资源利用率。
423 15
|
10月前
|
消息中间件 存储 运维
2024最全RabbitMQ集群方案汇总
本文梳理了RabbitMQ集群的几种方案,主要包括普通集群、镜像集群(高可用)、Quorum队列(仲裁队列)、Streams集群模式(高可用+负载均衡)和插件方式。重点介绍了每种方案的特点、优缺点及适用场景。搭建步骤包括安装Erlang和RabbitMQ、配置集群节点、修改hosts文件、配置Erlang Cookie、启动独立节点并创建集群,以及配置镜像队列以提高可用性和容错性。推荐使用Quorum队列与Streams模式,其中Quorum队列适合高可用集群,Streams模式则同时支持高可用和负载均衡。此外,还有Shovel和Federation插件可用于特定场景下的集群搭建。
2040 2
|
10月前
|
消息中间件 RocketMQ
2024最全RocketMQ集群方案汇总
在研究RocketMQ集群方案时,发现网上存在诸多不一致之处,如组件包含NameServer、Broker、Proxy等。通过查阅官方文档,了解到v4.x和v5.x版本的差异。v4.x部署模式包括单主、多主、多主多从(异步复制、同步双写),而v5.x新增Local与Cluster模式,主要区别在于Broker和Proxy是否同进程部署。Local模式适合平滑升级,Cluster模式适合高可用需求。不同模式下,集群部署方案大致相同,涵盖单主、多主、多主多从等模式,以满足不同的高可用性和性能需求。
1466 0
|
消息中间件 存储 负载均衡
|
消息中间件 存储 负载均衡
"RabbitMQ集群大揭秘!让你的消息传递系统秒变超级英雄,轻松应对亿级并发挑战!"
【8月更文挑战第24天】RabbitMQ是一款基于AMQP的开源消息中间件,以其高可靠性、扩展性和易用性闻名。面对高并发和大数据挑战时,可通过构建集群提升性能。本文深入探讨RabbitMQ集群配置、工作原理,并提供示例代码。集群由多个通过网络连接的节点组成,共享消息队列,确保高可用性和负载均衡。搭建集群需准备多台服务器,安装Erlang和RabbitMQ,并确保节点间通信顺畅。核心步骤包括配置.erlang.cookie文件、使用rabbitmqctl命令加入集群。消息发布至任一节点时,通过集群机制同步至其他节点;消费者可从任一节点获取消息。
196 2
|
网络协议 Java 物联网
MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图
MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图
2116 3
|
Linux 数据安全/隐私保护 Docker
MQTT(EMQX) - Linux CentOS Docker 安装
MQTT(EMQX) - Linux CentOS Docker 安装
742 0