在 EMQX 5.0 中,EMQX 集群中的节点可以分成两个角色:核心(Core)节点和 复制(Replicant)节点。Core 节点负责集群中所有的写操作,作为 EMQX 数据库 Mria (opens new window) 的真实数据源来存储路由表、会话、配置、报警以及 Dashboard 用户信息等数据。而 Replicant 节点被设计成无状态的,不参与数据的写入,添加或者删除 Replicant 节点不会改变集群数据的冗余。因此在 EMQX CRD 里面,我们仅支持 Core 节点的持久化。
EMQX CRD 支持通过 .spec.coreTemplate.spec.volumeClaimTemplates
字段配置 EMQX 集群 Core 节点持久化。.spec.coreTemplate.spec.volumeClaimTemplates
字段的语义及配置与 Kubernetes 的 PersistentVolumeClaimSpec
一致,其配置可以参考文档:PersistentVolumeClaimSpec (opens new window) 。
当用户配置了 .spec.coreTemplate.spec.volumeClaimTemplates
字段时,EMQX Operator 会为 EMQX 集群中的 每一个 Core 节点创建一个固定的 PVC(PersistentVolumeClaim)来表示用户对持久化的请求。当 Pod 被删除时,其对应的 PVC 不会自动清除。当 Pod 被重建时,会自动和已存在的 PVC 进行匹配。如果不想再使用旧集群的数据,需要手动清理 PVC。
PVC 表达的是用户对持久化的请求,而负责存储的则是持久卷(PersistentVolume (opens new window),PV),PVC 和 PV 通过 PVC Name 一对一绑定。PV 是集群中的一块存储,可以根据需求手动制备,也可以使用存储类(StorageClass (opens new window))来动态制备。当用户不再使用 PV 资源时,可以手动删除 PVC 对象,从而允许该 PV 资源被回收再利用。目前,PV 的回收策略有两种:Retained(保留)和 Deleted(删除),其回收策略细节可以参考文档:Reclaiming (opens new window)。
EMQX Operator 使用 PV 持久化 EMQX 集群 Core 节点 /opt/emqx/data
目录下的数据。EMQX Core 节点 /opt/emqx/data
目录存放的数据主要包含:路由表、会话、配置、报警以及 Dashboard 用户信息等数据。
apiVersion: apps.emqx.io/v2alpha1
kind: EMQX
metadata:
name: emqx
spec:
image: emqx:5.0
coreTemplate:
spec:
volumeClaimTemplates:
storageClassName: standard
resources:
requests:
storage: 20Mi
accessModes:
- ReadWriteOnce
replicas: 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
storageClassName
字段表示 StorageClass 的名称,可以使用命令 kubectl get storageclass
获取 Kubernetes 集群已经存在的 StorageClass,也可以根据自己需求自行创建 StorageClass。accessModes 字段表示 PV 的访问模式,默认使用 ReadWriteOnce
模式,更多访问模式可以参考文档:AccessModes (opens new window)。.spec.dashboardServiceTemplate
字段配置了 EMQX 集群对外暴露服务的方式为:NodePort,并指定了 EMQX Dashboard 服务 18083 端口对应的 nodePort 为 32016(nodePort 取值范围为:30000-32767)。
将上述内容保存为:emqx.yaml
,并执行如下命令部署 EMQX 集群:
$ kubectl apply -f emqx.yaml
emqx.apps.emqx.io/emqx created
1
2
3
检查 EMQX 集群状态,请确保 STATUS
为 Running
,这可能需要一些时间等待 EMQX 集群准备就绪。
$ kubectl get emqx emqx
NAME IMAGE STATUS AGE
emqx emqx:5.0 Running 10m
1
2
3
4
EMQX CRD 支持通过 .spec.persistent
字段配置 EMQX 集群持久化。.spec.persistent
字段的语义及配置与 Kubernetes 的 PersistentVolumeClaimSpec
一致,其配置可以参考文档:PersistentVolumeClaimSpec (opens new window)。
当用户配置了 .spec.persistent
字段时,EMQX Operator 会为 EMQX 集群中的 每一个 Pod 创建一个固定的 PVC(PersistentVolumeClaim)来表示用户对持久化的请求。当 Pod 被删除时,其对应的 PVC 不会自动清除。当 Pod 被重建时,会自动和已存在的 PVC 进行匹配。如果不想再使用旧集群的数据,需要手动清理 PVC。
PVC 表达的是用户对持久化的请求,而负责存储的则是持久卷(PersistentVolume (opens new window),PV),PVC 和 PV 通过 PVC Name 一对一绑定。PV 是集群中的一块存储,可以根据需求手动制备,也可以使用存储类(StorageClass (opens new window))来动态制备。当用户不再使用 PV 资源时,可以手动删除 PVC 对象,从而允许该 PV 资源被回收再利用。目前,PV 的回收策略有两种:Retained(保留)和 Deleted(删除),其回收策略细节可以参考文档:Reclaiming (opens new window)。
EMQX Operator 使用 PV 持久化 EMQX 节点 /opt/emqx/data
目录下的数据。EMQX 节点 /opt/emqx/data
目录存放的数据主要包含:loaded_plugins(已加载的插件信息),loaded_modules(已加载的模块信息),mnesia 数据库数据(存储 EMQX 自身运行数据,例如告警记录、规则引擎已创建的资源和规则、Dashboard 用户信息等数据)。
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
storageClassName
字段表示 StorageClass 的名称,可以使用命令 kubectl get storageclass
获取 Kubernetes 集群已经存在的 StorageClass,也可以根据自己需求自行创建 StorageClass。accessModes 字段表示 PV 的访问模式,默认使用 ReadWriteOnce
模式,更多访问模式可以参考文档:AccessModes (opens new window)。.spec.serviceTemplate
字段配置了 EMQX 集群对外暴露服务的方式为:NodePort,并指定了 EMQX Dashboard 服务 18083 端口对应的 nodePort 为 32016(nodePort 取值范围为:30000-32767)。
将上述内容保存为:emqx.yaml,执行如下命令部署 EMQX 集群:
$ kubectl apply -f emqx.yaml
emqxenterprise.apps.emqx.io/emqx-ee created
1
2
3
检查 EMQX 集群状态,请确保 STATUS
为 Running
,这可能需要一些时间等待 EMQX 集群准备就绪。
$ kubectl get emqxenterprises
NAME STATUS AGE
emqx-ee Running 8m33s
1
2
3
4