开启 TLS
任务目标
通过 extraVolumes
和 extraVolumeMounts
字段自定义 TLS 证书。
基于 TLS 证书创建 Secret
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象,其文档可以参考:Secret (opens new window)。在本文中我们使用 Secret 保存 TLS 证书信息,因此在创建 EMQX 集群之前我们需要基于 TLS 证书创建好 Secret。
配置 EMQX 集群
下面是 EMQX Custom Resource 的相关配置,你可以根据希望部署的 EMQX 的版本来选择对应的 APIVersion,具体的兼容性关系,请参考 EMQX Operator 兼容性:
EMQX CRD 支持通过 .spec.template.spec.volumes
和 .spec.template.spec.emqxContainer.volumeMounts
字段给 EMQX 集群配置卷和挂载点。在本文中我们可以使用这个两个字段为 EMQX 集群配置 TLS 证书。
Volumes 的类型有很多种,关于 Volumes 描述可以参考文档:Volumes (opens new window)。在本文中我们使用的是 secret
类型。
将下面的内容保存成 YAML 文件,并通过 kubectl apply
命令部署它
apiVersion: apps.emqx.io/v1beta4
kind: EmqxEnterprise
metadata:
name: emqx-ee
spec:
template:
spec:
emqxContainer:
image:
repository: emqx/emqx-ee
version: 4.4.14
emqxConfig:
listener.ssl.external.cacertfile: /mounted/cert/ca.crt
listener.ssl.external.certfile: /mounted/cert/tls.crt
listener.ssl.external.keyfile: /mounted/cert/tls.key
listener.ssl.external: "0.0.0.0:8883"
volumeMounts:
- name: emqx-tls
mountPath: /mounted/cert
volumes:
- name: emqx-tls
secret:
secretName: emqx-tls
serviceTemplate:
spec:
type: LoadBalancer
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
.spec.template.spec.volumes
字段配置了卷的类型为:secret,名称为:emqx-tls。
.spec.template.spec.emqxContainer.volumeMounts
字段配置了 TLS 证书挂载到 EMQX 的目录为:/mounted/cert
。
.spec.template.spec.emqxContainer.emqxConfig
字段配置了 TLS 监听器证书路径,更多 TLS 监听器的配置可以参考文档:tlsexternal (opens new window)。
等待 EMQX 集群就绪,可以通过 kubectl get
命令查看 EMQX 集群的状态,请确保 STATUS
为 Running
,这个可能需要一些时间
$ kubectl get emqxenterprises
NAME STATUS AGE
emqx-ee Running 8m33s
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 控制台。
EMQX CRD 支持使用 .spec.coreTemplate.extraVolumes
和 .spec.coreTemplate.extraVolumeMounts
以及 .spec.replicantTemplate.extraVolumes
和 .spec.replicantTemplate.extraVolumeMounts
字段给 EMQX 集群配置额外的卷和挂载点。在本文中我们可以使用这个两个字段为 EMQX 集群配置 TLS 证书。
Volumes 的类型有很多种,关于 Volumes 描述可以参考文档:Volumes (opens new window)。在本文中我们使用的是 secret
类型。
将下面的内容保存成 YAML 文件,并通过 kubectl apply
命令部署它
apiVersion: apps.emqx.io/v2alpha1
kind: EMQX
metadata:
name: emqx
spec:
image: emqx:5.0
bootstrapConfig: |
listeners.ssl.default {
bind = "0.0.0.0:8883"
ssl_options {
cacertfile = "/mounted/cert/ca.crt"
certfile = "/mounted/cert/tls.crt"
keyfile = "/mounted/cert/tls.key"
}
}
coreTemplate:
spec:
extraVolumes:
- name: emqx-tls
secret:
secretName: emqx-tls
extraVolumeMounts:
- name: emqx-tls
mountPath: /mounted/cert
replicantTemplate:
spec:
extraVolumes:
- name: emqx-tls
secret:
secretName: emqx-tls
extraVolumeMounts:
- name: emqx-tls
mountPath: /mounted/cert
dashboardServiceTemplate:
spec:
type: LoadBalancer
listenersServiceTemplate:
spec:
type: LoadBalancer
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
.spec.coreTemplate.extraVolumes
字段配置了卷的类型为:secret,名称为:emqx-tls。
.spec.coreTemplate.extraVolumeMounts
字段配置了 TLS 证书挂载到 EMQX 的目录为:/mounted/cert
。
.spec.bootstrapConfig
字段配置了 TLS 监听器证书路径,更多 TLS 监听器的配置可以参考文档:ssllistener (opens new window)。
等待 EMQX 集群就绪,可以通过 kubectl get
命令查看 EMQX 集群的状态,请确保 STATUS
为 Running
,这个可能需要一些时间
$ kubectl get emqx
NAME IMAGE STATUS AGE
emqx emqx:5.0 Running 10m
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 验证 TLS 连接
MQTT X CLI (opens new window) 是一款开源的 MQTT 5.0 命令行客户端工具,旨在帮助开发者在不需要使用图形化界面的基础上,也能更快的开发和调试 MQTT 服务与应用。