# 在 EMQX 集群中开启持久化

# 任务目标

  • 通过 persistent 字段配置 EMQX 4.x 集群持久化。
  • 通过 volumeClaimTemplates 字段配置 EMQX 5.x 集群 Core 节点持久化。

# EMQX 集群持久化配置

下面是 EMQX Custom Resource 的相关配置,你可以根据希望部署的 EMQX 的版本来选择对应的 APIVersion,具体的兼容性关系,请参考EMQX Operator 兼容性:

apps.emqx.io/v1beta4 EmqxEnterprise 支持通过 .spec.persistent 字段配置 EMQX 集群持久化。.spec.persistent 字段的语义及配置与 Kubernetes 的 PersistentVolumeClaimSpec 一致,其配置可以参考文档:PersistentVolumeClaimSpec (opens new window)

当用户配置了 .spec.persistent 字段时,EMQX Operator 会将 EMQX 容器中 /opt/emqx/data 目录挂载到通过 StorageClass (opens new window) 创建的 PV 和 PVC 中,当 EMQX Pod 被删除时,PV 和 PVC 不会被删除,从而达到保存 EMQX 运行时数据的目的。关于 PV 和 PVC 的更多信息,请参考文档 Persistent Volumes (opens new window)

  • 将下面的内容保存成 YAML 文件,并通过 kubectl apply 命令部署它

    apiVersion: apps.emqx.io/v1beta4
    kind: EmqxEnterprise
    metadata:
      name: emqx-ee
    spec:
      persistent:
        metadata:
          name: emqx-ee
        spec:
          storageClassName: standard
          resources:
            requests:
              storage: 20Mi
          accessModes:
            - ReadWriteOnce
      template:
        spec:
          emqxContainer:
            image:
              repository: emqx/emqx-ee
              version: 4.4.14
      serviceTemplate:
        spec:
          type: LoadBalancer
    
    Copied!
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    storageClassName 字段表示 StorageClass 的名称,可以使用命令 kubectl get storageclass 获取 Kubernetes 集群已经存在的 StorageClass,也可以根据自己需求自行创建 StorageClass。

  • 等待 EMQX 集群就绪,可以通过 kubectl get 命令查看 EMQX 集群的状态,请确保 STATUSRunning,这个可能需要一些时间

    $ kubectl get emqxenterprises
    NAME      STATUS   AGE
    emqx-ee   Running  8m33s
    
    Copied!
    1
    2
    3
  • 获取 EMQX 集群的 External IP,访问 EMQX 控制台

    $ kubectl get svc emqx-ee -o json | jq '.status.loadBalancer.ingress[0].ip'
    
    192.168.1.200
    
    Copied!
    1
    2
    3

    通过浏览器访问 http://192.168.1.200:18083 ,使用默认的用户名和密码 admin/public 登录 EMQX 控制台。

# 验证 EMQX 集群持久化

提示

下文中 Dashboard 的截图来自是 EMQX 5,EMQX 4 Dashboard (opens new window) 也支持相应的功能,请自行操作。

验证方案: 1)在旧 EMQX 集群中通过 Dashboard 创建一条测试规则;2)删除旧集群;3)重新创建 EMQX 集群,通过 Dashboard 查看之前创建的规则是否存在。

  • 通过浏览器访问 EMQX Dashboard 创建测试规则

    external_ip=$(kubectl get svc emqx-ee -o json | jq '.status.loadBalancer.ingress[0].ip')
    
    Copied!
    1

    通过访问 http://${external_ip}:18083 进入 Dashboard 点击 数据集成 → 规则 进入创建规则的页面,我们先点击添加动作的按钮为这条规则添加响应动作,然后点击创建生成规则,如下图所示:

    当我们的规则创建成功之后,在页面会出现一条规则记录,规则 ID 为:emqx-persistent-test,如下图所示:

  • 删除旧 EMQX 集群

    执行如下命令删除 EMQX 集群:

    $ kubectl delete -f  emqx.yaml
    
    emqx.apps.emqx.io "emqx" deleted
    # emqxenterprise.apps.emqx.io "emqx" deleted
    
    Copied!
    1
    2
    3
    4

    emqx-persistent.yaml 是本文中第一次部署 EMQX 集群所使用的 YAML 文件,这个文件不需要做任何的改动。

  • 重新创建 EMQX 集群

    执行如下命令重新创建 EMQX 集群:

    $ kubectl apply -f  emqx.yaml
    
    emqx.apps.emqx.io/emqx created
    # emqxenterprise.apps.emqx.io/emqx created
    
    Copied!
    1
    2
    3
    4

    等待 EMQX 集群就绪,然后通过浏览器访问 EMQX Dashboard 查看之前创建的规则是否存在,如下如图所示:

    从图中可以看出:在旧集群中创建的规则 emqx-persistent-test 在新的集群中依旧存在,则说明我们配置的持久化是生效的。