在 EMQX 中启用 TLS
目标
使用 extraVolumes 和 extraVolumeMounts 字段自定义 TLS 证书。
基于 TLS 证书创建 Secret
Secret 是一种包含少量敏感信息的对象,例如密码、令牌或密钥。在本演示中,我们使用 Secret 存储 TLS 证书信息,因此在创建 EMQX 集群之前需要创建一个 Secret。
有关更多信息,请参阅 Secret 文档。
将以下内容保存为 YAML 文件,并使用 kubectl apply 命令部署:
apiVersion: v1
kind: Secret
metadata:
name: emqx-tls
type: kubernetes.io/tls
stringData:
ca.crt: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
tls.crt: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
tls.key: |
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----TIP
在此示例中,上述三个字段的内容被省略。请填入实际的证书内容。
ca.crt应包含 CA 证书。tls.crt应包含服务器证书。tls.key应包含服务器的私钥。
配置 EMQX 集群
EMQX CRD apps.emqx.io/v3beta1 提供以下字段来为 EMQX 集群配置额外的卷和挂载点:
.spec.coreTemplate.spec.extraVolumes.spec.coreTemplate.spec.extraVolumeMounts.spec.replicantTemplate.spec.extraVolumes.spec.replicantTemplate.spec.extraVolumeMounts
在本演示中,我们将使用这些字段为 EMQX 集群提供 TLS 证书。
Kubernetes 支持多种卷类型。有关详情,请参阅 Volumes 文档。本示例使用 secret 类型的卷。
将以下内容保存为 YAML 文件,并使用
kubectl apply部署:yaml
apiVersion: apps.emqx.io/v3beta1 kind: EMQX metadata: name: emqx spec: image: emqx/emqx:6.3.2 config: # 配置从 emqx-tls 卷挂载的 TLS 监听器证书: roots: 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" gc_after_handshake: true handshake_timeout: "5s" license: key: "..." coreTemplate: spec: extraVolumes: - name: emqx-tls secret: secretName: emqx-tls extraVolumeMounts: - name: emqx-tls mountPath: /mounted/cert replicantTemplate: spec: extraVolumes: # 创建一个名为 emqx-tls 的 secret 卷类型: - name: emqx-tls secret: secretName: emqx-tls extraVolumeMounts: - name: emqx-tls # TLS 证书挂载到 EMQX 节点的目录: mountPath: /mounted/cert dashboardServiceTemplate: spec: type: LoadBalancer listenersServiceTemplate: spec: type: LoadBalancer
2. 等待 EMQX 集群就绪。
使用 `kubectl get` 检查 EMQX 集群的状态,并确保 `STATUS` 为 `Ready`。这可能需要一些时间。
```bash
$ kubectl get emqx
NAME STATUS AGE
emqx Ready 10m使用 MQTTX 验证 TLS 连接
MQTTX CLI 是一款开源的 MQTT 5.0 命令行客户端工具,旨在帮助开发者快速开始使用 MQTT 服务和应用。
获取 EMQX 监听器服务的外部 IP。
bashexternal_ip=$(kubectl get svc emqx-listeners -o json | jq '.status.loadBalancer.ingress[0].ip')使用 MQTTX CLI 订阅消息。连接到 TLS 监听器端口 8883,使用
--insecure标志跳过证书验证。bashmqttx sub -h ${external_ip} -p 8883 -t "hello" -l mqtts --insecure [10:00:25] › … Connecting... [10:00:25] › ✔ Connected [10:00:25] › … Subscribing to hello... [10:00:25] › ✔ Subscribed to hello在单独的终端窗口中发布消息。
bashmqttx pub -h ${external_ip} -p 8883 -t "hello" -m "hello world" -l mqtts --insecure [10:00:58] › … Connecting... [10:00:58] › ✔ Connected [10:00:58] › … Message Publishing... [10:00:58] › ✔ Message published观察订阅客户端接收消息。
bash[10:00:58] › payload: hello world这表明发布客户端和订阅客户端均已通过 TLS 成功与 EMQX 通信。