# 使用 EMQX Operator 在阿里云 ACK 上部署 EMQX 集群

# 名词解释

EMQX:The most scalable open-source MQTT broker for IoT,EMQX 文档 (opens new window)

EMQX Operator:A Kubernetes Operator for EMQX,EMQX Operator 文档 (opens new window)

ACK:Alibaba Cloud Container Service for Kubernetes,简称容器服务 ACK, ACK 文档 (opens new window)

CLB:传统型负载均衡 CLB(Classic Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器的流量分发控制服务,CLB 文档 (opens new window)

# 创建 ACK 集群

登录阿里云,选择云产品 -> 容器服务 Kubernets 版,点击创建, 选择标准集群,EMQX Operator 要求Kubernetes 版本>=1.20.0,因此我们在此选择 Kubernetes 选择 1.22.10,网络与其他资源信息根据自身需求来制定。具体创建步骤参考: 创建标准集群 (opens new window)

# LoadBalancer 配置

支持在 Terway 网络模式下,通过 annotation 将 Pod 直接挂载到 CLB 后端,提升网络转发性能。:通过Annotation配置负载均衡 (opens new window)

service.beta.kubernetes.io/backend-type:"eni"
1

# StorageClass 配置

使用如下命令查看当前集群可用的 storageClass:

kubectl get sc
1

可以看到集群默认创建了多个可用的 storageClass, 本文档部署 EMQX 时选取的第一个 storageClass: alibabacloud-cnfs-nas, 其他 StorageClass 可参考文档存储-CSI (opens new window)

# 使用 EMQX Operator 部署 EQMX 集群

EMQX Operator 安装参考:EMQX Operator 安装 (opens new window)

EMQX Operator 安装完成后,使用以下命令在 ACK 上进行部署 EMQX 集群:

cat << EOF | kubectl apply -f -
apiVersion: apps.emqx.io/v1beta3
kind: EmqxEnterprise
metadata:
  name: emqx-ee
  labels:
    "apps.emqx.io/instance": "emqx-ee"
  annotations:
    service.beta.kubernetes.io/backend-type: "eni"
spec:
  emqxTemplate:
    image: emqx/emqx-ee:4.4.8
    serviceTemplate:
      metadata:
        name: emqx-ee
        namespace: default
        labels:
          "apps.emqx.io/instance": "emqx-ee"
      spec:
        type: LoadBalancer
        selector:
          "apps.emqx.io/instance": "emqx-ee"
  persistent:
    accessModes: 
      - ReadWriteOnce
    resources:
        requests:
          storage: 10Gi 
    storageClassName: alibabacloud-cnfs-nas
EOF
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

# 使用 LB 终结 TCP TLS 方案

我们推荐通过 Aliyun NLB (opens new window) 进行 TLS 终结,如需在 NLB 上实现 TLS 终结,你可以通过以下几个步骤实现

备注: 此文档详细解释了使用 EMQX Operator 在阿里云 ACK 上部署 EMQX 集群的步骤,另外还支持配置 LB 直连 Pod, 进一步提升转发性能。

使用 NLB 要求 k8s 版本不低于v1.24且 CCM 版本不低于v2.5.0。有关 CCM 的版本升级说明请查看官方文档 (opens new window)

# 证书导入

在 Aliyun 数字证书管理服务 (opens new window)控制台,导入自签名或者购买证书, 证书导入后点击证书详情,获取证书ID(纯数字)。如下图:

由于每次重新创建 NLB 时,其关联的 DNS 域名会发生变化,如果采用自签名证书,为方便测试,这里建议将证书绑定的域名设置为*.cn-shanghai.nlb.aliyuncs.com

# 修改部署yaml

cat << "EOF" | kubectl apply -f -
apiVersion: apps.emqx.io/v1beta3
kind: EmqxEnterprise
metadata:
  name: emqx-ee
  labels:
    "apps.emqx.io/instance": "emqx-ee"
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-name: "nlb"
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "tcpssl:8883"
    # 如集群为中国内地 Region 时,组合后的证书ID为${your-cert-id}-cn-hangzhou。
    # 如集群为除中国内地以外的其他Region时,组合后的证书ID为${your-cert-id}-ap-southeast-1,例如:6134-ap-southeast-1。
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${组合后的证书ID}"
    # NLB 支持的地域及可用区可以登录 NLB 控制台查看,至少需要两个可用区。
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-zone-maps: cn-hangzhou-k:vsw-i123456,cn-hangzhou-j:vsw-j654321
spec:
  emqxTemplate:
    image: emqx/emqx-ee:4.4.8
    serviceTemplate:
      metadata:
        name: emqx-ee
        namespace: default
        labels:
          "apps.emqx.io/instance": "emqx-ee"
      spec:
        type: LoadBalancer
        loadBalancerClass: "alibabacloud.com/nlb"
        externalTrafficPolicy: Local
        ports:
        - name: tcpssl
          port: 8883
          protocol: TCP
          targetPort: 1883
          
        selector:
          "apps.emqx.io/instance": "emqx-ee"
EOF
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

可用区域的组成规则为服务器所在区域+专有网络中交换机 (opens new window)的实例ID

查看官方文档 (opens new window)以了解更多的参数说明

部署成功后,可在网络型负载均衡 NLB (opens new window)中查看自动创建的 NLB 实例