在 Amazon EKS 中部署 EMQX
EMQX Operator 支持在 Amazon 容器服务 EKS(Elastic Kubernetes Service)上部署 EMQX。Amazon EKS 是一种托管的 Kubernetes 服务,可让您轻松部署、管理和扩展容器化应用程序。EKS 提供了 Kubernetes 控制平面和节点组,自动处理节点替换、升级和修补。它支持 AWS 服务,如 Load Balancers、RDS 和 IAM,并与其他 Kubernetes 生态系统工具无缝集成。详情请查看 什么是 Amazon EKS (opens new window)
前提条件
在开始之前,您需要准备以下内容:
快速部署一个 EMQX 集群
下面是 EMQX 自定义资源的相关配置。你可以根据你想部署的 EMQX 版本选择相应的 APIVersion。关于具体的兼容性关系,请参考 EMQX 与 EMQX Operator 的兼容性列表
将下面的内容保存成 YAML 文件,并通过 kubectl apply
命令部署它
apiVersion: apps.emqx.io/v1beta4
kind: EmqxEnterprise
metadata:
name: emqx-ee
spec:
persistent:
metadata:
name: emqx-ee
spec:
storageClassName: gp2
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnce
template:
spec:
podSecurityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
fsGroupChangePolicy: Always
supplementalGroups:
- 1000
emqxContainer:
image:
repository: emqx/emqx-ee
version: 4.4.14
serviceTemplate:
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-xxx1, subnet-xxx2
spec:
type: LoadBalancer
loadBalancerClass: service.k8s.aws/nlb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
等待 EMQX 集群就绪,可以通过 kubectl get
命令查看 EMQX 集群的状态,请确保 STATUS
为 Running
,这个可能需要一些时间
$ kubectl get emqxenterprises
NAME STATUS AGE
emqx-ee Running 26m
1
2
3
获取 EMQX 集群的 External IP, 访问 EMQX 控制台
$ kubectl get svc emqx-ee -o json | jq '.status.loadBalancer.ingress[0].ip'
192.168.1.200
1
2
3
通过浏览器访问 http://192.168.1.200:18083
,使用默认的用户名和密码 admin/public
登录 EMQX 控制台。
将下面的内容保存成 YAML 文件,并通过 kubectl apply
命令部署它
apiVersion: apps.emqx.io/v2alpha1
kind: EMQX
metadata:
name: emqx
spec:
image: emqx:5.0
coreTemplate:
spec:
podSecurityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
fsGroupChangePolicy: Always
supplementalGroups:
- 1000
volumeClaimTemplates:
storageClassName: gp2
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnce
dashboardServiceTemplate:
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-xxx1,subnet-xxx2
spec:
type: LoadBalancer
loadBalancerClass: service.k8s.aws/nlb
listenersServiceTemplate:
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-xxx1,subnet-xxx2
spec:
type: LoadBalancer
loadBalancerClass: service.k8s.aws/nlb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
等待 EMQX 集群就绪,可以通过 kubectl get
命令查看 EMQX 集群的状态,请确保 STATUS
为 Running
,这个可能需要一些时间
$ kubectl get emqx
NAME IMAGE STATUS AGE
emqx emqx:5.0 Running 18m
1
2
3
获取 EMQX 集群的 Dashboard External IP, 访问 EMQX 控制台
EMQX Operator 会创建两个 EMQX Service 资源,一个是 emqx-dashboard,一个是 emqx-listeners,分别对应 EMQX 控制台和 EMQX 监听端口。
$ kubectl get svc emqx-dashboard -o json | jq '.status.loadBalancer.ingress[0].ip'
192.168.1.200
1
2
3
通过浏览器访问 http://192.168.1.200:18083
,使用默认的用户名和密码 admin/public
登录 EMQX 控制台。
使用 MQTT X CLI 发布/订阅消息
MQTT X CLI (opens new window) 是一款开源的 MQTT 5.0 命令行客户端工具,旨在帮助开发者在不需要使用图形化界面的基础上,也能更快的开发和调试 MQTT 服务与应用。
获取 EMQX 集群的 External IP
external_ip=$(kubectl get svc emqx-ee -o json | jq '.status.loadBalancer.ingress[0].ip')
1
external_ip=$(kubectl get svc emqx-listeners -o json | jq '.status.loadBalancer.ingress[0].ip')
1
订阅消息
$ mqttx sub -t 'hello' -h ${external_ip} -p 1883
[10:00:25] › … Connecting...
[10:00:25] › ✔ Connected
[10:00:25] › … Subscribing to hello...
[10:00:25] › ✔ Subscribed to hello
1
2
3
4
5
6
创建一个新的终端窗口并发布消息
$ mqttx pub -t 'hello' -h ${external_ip} -p 1883 -m 'hello world'
[10:00:58] › … Connecting...
[10:00:58] › ✔ Connected
[10:00:58] › … Message Publishing...
[10:00:58] › ✔ Message published
1
2
3
4
5
6
查看订阅终端窗口收到的消息
[10:00:58] › payload: hello world
1
使用 LoadBalancer 终结 TLS 加密
在 Amazon EKS 中,您可以使用 NLB 进行 TLS 终结,可以按照以下步骤进行操作:
在 AWS Certificate Manager (opens new window) 控制台中导入相关证书,然后通过单击证书 ID 进入详细信息页面,然后记录 ARN 信息
在 EMQX 自定义资源的 Annotations 中添加如下注释:
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-west-2:xxxxx:certificate/xxxxxxx
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "1883"
1
2
3
4
5
6
7
service.beta.kubernetes.io/aws-load-balancer-ssl-cert
的值是我们在第一步记录的 ARN 信息