在 AWS EKS 上部署 EMQX MQTT 集群

简介: 本文以EMQX企业版为例,介绍如何使用EMQX Kubernetes Operator在AWS EKS上创建部署MQTT服务集群,并实现自动化管理与监控。

云进入以「应用为中心」的云原生阶段,Operator 模式的出现,则为 Kubernetes 中的自动化任务创建配置与管理提供了一套行之有效的标准规范。通过将运维知识固化成高级语言 Go/Java 代码,使得运维知识可以像普通软件一样交付,并能支持高可靠、具备高级运维能力的有状态应用批量交付。

针对大规模分布式物联网 MQTT 消息服务器 EMQX 全生命期管理的自动化管理工具 EMQX Kubernetes Operator(本文中简称 EMQX Operator)应运而生。它作为 Kubernetes 上的自定义控制器运行,并与 Kubernetes API 服务器(kube-apiserver)进行通信,将高层描述转换为正常的 Kubernetes 资源,以保持所需的应用程序状态。

EMQX Operator 使 EMQX 的部署、调优和运维变成一种低成本、标准化、可重复性的能力,帮助用户高效实现集群扩容、无缝升级、故障处理和统一监控。
EMQX Operator 集群 图1.png

本文章将以 EMQX 企业版为例,详细讲解如何使用 EMQX Operator 在 AWS EKS 上创建部署 MQTT 服务集群,并实现自动化管理与监控。

云平台简介: AWS EKS

Amazon Elastic Kubernetes Service(Amazon EKS)是 AWS 的 Kubernetes 托管服务,您可以使用它来在AWS 上运行 Kubernetes,而无需安装、操作和维护您自己的 Kubernetes 控制平面或节点。

创建 EKS 服务

使用 EKS 服务,需通过以下两个步骤进行创建。

创建 EKS 集群

登录 EKS 控制台, 点击添加集群。由于 EMQX Operator 要求 Kubernetes 版本 >= 1.20, 因此在进行集群配置时,Kubernetes 版本大于 1.20 即可。其他角色、权限、子网、VPC 等可根据需求添加。

创建 EKS 集群 1 图2.png
创建 EKS 集群 2 图3.png

添加节点组与节点

集群创建成功后,进入集群详细页面,点击计算,选择添加节点组。

配置节点组 图4.png
添加节点组 图5.png
选择实例 图6.png

此处的实例类型根据业务需求自行调整,本文为示例选择了较小的实例规格。

访问 Kubernetes 集群

创建 kubeconfig 文件,可使用 aws cli 来生成。初次使用,根据提示进行相关配置,如权限、区域等,配置好后通过如下命令生成 kubeconfig 文件。

aws eks update-kubeconfig --region region-code --name my-cluster

注:区域与集群名称需替换成自己所在区域与集群名字。

LoadBalancer 相关

在 service 使用LoadBalancer, 需先安装 Load Balancer Controller。

StorageClass 配置

在该方案里, 我们使用 EBS, 因此在使用前我们需安装 EBS CSI 驱动程序。在集群详情页面里,我们点击插件、新增,选择 Amazon EBD CSI 驱动程序进行添加。如下:

StorageClass 配置 1 图7.png
StorageClass 配置 2 图8.png

storageclass yaml 示例:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: Immediate
parameters:
  csi.storage.k8s.io/fstype: xfs
  type: io1
  iopsPerGB: "500"
  encrypted: "true"
allowedTopologies:
- matchLabelExpressions:
  - key: topology.ebs.csi.aws.com/zone
    values:
    - us-east-2c

执行以下命令

$ kubectl apply -f storageclass.yaml

使用 EMQX Operator 进行集群创建

Operator 安装完成后,使用以下 yaml 在 AWS EKS 上进行部署 EMQX 集群

cat << "EOF" | kubectl apply -f -
apiVersion: apps.emqx.io/v1beta3
kind: EmqxEnterprise
metadata:
  name: emqx-ee
  labels:
    "foo": "bar"
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "external"
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    service.beta.kubernetes.io/aws-load-balancer-attributes: load_balancing.cross_zone.enabled=true
    service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true
    service.beta.kubernetes.io/aws-load-balancer-attributes: deletion_protection.enabled=true
spec:
  replicas: 3
  persistent:
     storageClassName: ebs-sc
     resources:
       requests:
         storage: 4Gi
     accessModes:
     - ReadWriteOnce
  emqxTemplate:
    image: emqx/emqx-ee:4.4.6
    serviceTemplate:
      spec:
        type: LoadBalancer
EOF

使用 NLB 进行 TLS 终结

我们推荐在 NLB 上做 TLS 终结,可通过以下几个步骤实现:

证书导入

在 AWS 控制台(https://us-east-2.console.aws.amazon.com/acm/home),导入相关证书,证书导入后点击证书 ID,进入详情页面,复制 ARN 信息,如下图:

复制 ARN 信息 图9.png

修改部署 yaml

cat << "EOF" | kubectl apply -f -
apiVersion: apps.emqx.io/v1beta3
kind: EmqxEnterprise
metadata:
  name: emqx-ee
  labels:
    "foo": "bar"
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "external"
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    service.beta.kubernetes.io/aws-load-balancer-attributes: load_balancing.cross_zone.enabled=true
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-west-2:arn:arn:aws:acm:us-east-1:609217282285:certificate/326649a0-f3b3-4bdb-a478-5691b4ba0ef3
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: 1883,mqtt-tls
    service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true
    service.beta.kubernetes.io/aws-load-balancer-attributes: deletion_protection.enabled=true
spec:
  replicas: 3
  persistent:
     storageClassName: ebs-sc
     resources:
       requests:
         storage: 4Gi
     accessModes:
     - ReadWriteOnce
  emqxTemplate:
    image: emqx/emqx-ee:4.4.6
    serviceTemplate:
      spec:
        type: LoadBalancer
EOF

相比不使用 TLS 证书,我们在 Annotations 里增加了下面三项内容,其中 service.beta.kubernetes.io/aws-load-balancer-ssl-cert 的值为我们第一步中复制的 ARN 信息。

service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-west-2:arn:arn:aws:acm:us-east-1:609217282285:certificate/326649a0-f3b3-4bdb-a478-5691b4ba0ef3
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: 1883,mqtt-tls
版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/deploying-emqx-cluster-on-aws-eks

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
18天前
|
消息中间件 负载均衡 监控
【面试问题】RabbitMQ 的集群
【1月更文挑战第27天】【面试问题】RabbitMQ 的集群
|
18天前
|
消息中间件 Java API
MQ产品使用合集之RocketMQ dledger集群模式的dledgerpeers端口是集群之间通讯吗
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
18天前
|
消息中间件
rabbitMQ集群
rabbitMQ集群
11 0
|
18天前
|
消息中间件 存储 Java
RocketMQ部署文档
RocketMQ部署文档
|
18天前
|
Ubuntu 网络安全 Windows
ubuntu16.04版本安装emqx的mqtt服务
ubuntu16.04版本安装emqx的mqtt服务
|
18天前
|
消息中间件 Kubernetes Docker
KubeSphere 核心实战之三【在kubesphere平台上部署ElasticSearch、应用商店部署RabbitMQ和应用市场部署Zookeeper】(实操篇 3/4)
KubeSphere 核心实战之三【在kubesphere平台上部署ElasticSearch、应用商店部署RabbitMQ和应用市场部署Zookeeper】(实操篇 3/4)
60 0
|
18天前
|
消息中间件 运维 应用服务中间件
容器化运维:构建高可用RabbitMQ集群的Docker Compose指南
容器化运维:构建高可用RabbitMQ集群的Docker Compose指南
310 0
|
18天前
|
消息中间件 Linux RocketMQ
【RocketMq】RocketMq 4.9.4 Windows-docker 部署
【RocketMq】RocketMq 4.9.4 Windows-docker 部署
78 0
|
18天前
|
消息中间件 Shell Linux
RabbitMQ部署指南
RabbitMQ部署指南
68 2
|
18天前
|
消息中间件 存储 缓存
RabbitMQ 集群和镜像队列
【1月更文挑战第11天】 一、clustering(集群) 1、使用集群的原因 2、搭建步骤 2.1、拉取镜像 2.2、创建三个RabbitMQ容器节点 2.3、集群搭建 二、镜像队列 1、使用镜像的原因 2、搭建步骤
250 6

热门文章

最新文章