Skip to content

使用 Helm Chart 在 Kubernetes 中部署 EMQX

本页面提供了使用 EMQX 官方 Helm Chart 在 Kubernetes 集群中部署 EMQX 的详细步骤。

EMQX Helm Chart 将部署所需的所有 Kubernetes 资源(如 StatefulSet、Service、ConfigMap、Ingress 规则和 Gateway API 路由)打包为一个可配置的 Helm Chart,从而简化了基于 Kubernetes 的部署过程。

前提条件

开始之前,请确保已安装并配置以下组件:

  • 一个可用的 Kubernetes 集群(版本 ≥ 1.6)
  • Helm

安装 EMQX Helm Chart

你可以从 EMQX 的 GitHub 仓库或官方 Helm Chart 仓库安装 EMQX Helm Chart。

从 GitHub 安装

从 GitHub 安装并命名为 my-emqx 的 Chart:

bash
$ git clone https://github.com/emqx/emqx.git
$ cd emqx/deploy/charts/emqx-enterprise
$ helm install my-emqx .

从 Helm 仓库安装

从官方 Helm 仓库安装并命名为 my-emqx 的 Chart:

bash
helm repo add emqx https://repos.emqx.io/charts
helm install my-emqx emqx/emqx-enterprise

如果你希望安装不稳定版本,请添加 --devel 标志:

bash
helm install my-emqx emqx/emqx-enterprise --devel

卸载 Chart

要删除名为 my-emqx 的 Helm 部署并清理所有关联的 Kubernetes 资源:

Helm v3 及以上版本

bash
$ helm uninstall my-emqx

Helm v2(旧版)

bash
$ helm del my-emqx

配置参数

EMQX Helm Chart 通过 values.yaml 文件提供丰富的可配置参数。下表列出了一些关键参数及其默认值:

参数描述默认值
replicaCount建议集群中的节点数为奇数,否则在发生网络分裂时,EMQX 集群将无法自动愈合。3
image.repository使用的 EMQX 镜像仓库地址emqx/emqx-enterprise
image.pullPolicy镜像拉取策略IfNotPresent
image.pullSecrets 镜像拉取密钥[] (不为部署的 Pod 添加镜像拉取密钥)
serviceAccount.create如果为 true,则创建一个新的服务账户true
serviceAccount.name要使用的服务账户。如果未设置且 serviceAccount.createtrue,则使用完整名称模板生成一个名称。
serviceAccount.annotations要添加到服务账户的注解
envFromSecret在同一 Kubernetes 命名空间中拉取一个 Secret,其中包含将添加到环境中的值nil
recreatePods在升级期间强制重新创建 Pod,这对于始终应用最新配置很有用。false
podAnnotations Pod 的注解{}
podManagementPolicy要使用现有的 PVC 重新部署 Chart,该值必须设置为 Parallel 以避免死锁。Parallel
persistence.enabled是否启用持久化存储。false
persistence.storageClass后端 PVC 的存储类名称nil (使用 alpha 存储类注解)
persistence.existingClaimEMQX 数据持久卷的现有声明名称,作为模板进行评估""
persistence.accessModeEMQX 卷的 PVC 访问模式ReadWriteOnce
persistence.sizeEMQX 卷的 PVC 存储请求20Mi
initContainers在创建 EMQX 容器之前运行的容器。它们可以包含实用程序或设置脚本。{}
resourcesCPU/内存资源请求/限制{}
extraVolumeMounts到默认后端容器的额外 volumeMounts。[]
extraVolumes到默认后端 Pod 的额外 volumes。[]
nodeSelector用于 Pod 分配的节点标签{}
tolerations用于 Pod 分配的容忍度标签[]
affinity节点/Pod 亲和性映射{}
service.typeKubernetes 服务类型。ClusterIP
service.mqttMQTT 端口。1883
service.mqttsslMQTT(SSL) 端口。8883
service.wsWebSocket/HTTP 端口。8083
service.wssWSS/HTTPS 端口。8084
service.wsEnabled是否在 Service 中发布 WebSocket 和 WSS 端口。启用 httpRoute.ws.enabledtlsRoute.wss.enabled 时,该参数必须设为 truetrue
service.dashboardDashboard 和 API 端口。18083
service.customPorts在服务中暴露的自定义端口。{}
service.nodePorts.mqttMQTT 的 Kubernetes 节点端口。nil
service.nodePorts.mqttsslMQTT(SSL) 的 Kubernetes 节点端口。nil
service.nodePorts.wsWebSocket/HTTP 的 Kubernetes 节点端口。nil
service.nodePorts.wssWSS/HTTPS 的 Kubernetes 节点端口。nil
service.nodePorts.dashboardDashboard 的 Kubernetes 节点端口。nil
service.customNodePorts自定义端口的 Kubernetes 节点端口。{}
service.loadBalancerClass此服务所属的负载均衡器实现
service.loadBalancerIP服务的 loadBalancerIPnil
service.loadBalancerSourceRanges当服务是 LoadBalancer 时允许的地址[]
service.externalIPs服务的 ExternalIPs[]
service.externalTrafficPolicy服务的外部流量策略Cluster
service.annotations服务/ServiceMonitor 的注解{}(作为模板评估)
service.labels服务/ServiceMonitor 的标签{}(作为模板评估)
ingress.dashboard.enabled为 EMQX Dashboard 启用 Ingressfalse
ingress.dashboard.ingressClassName为 EMQX Dashboard 设置 Ingress 类
ingress.dashboard.pathEMQX Dashboard 的 Ingress 路径/
ingress.dashboard.pathTypeEMQX Dashboard 的 Ingress pathTypeImplementationSpecific
ingress.dashboard.hostsEMQX Dashboard 的 Ingress 主机dashboard.emqx.local
ingress.dashboard.tlsEMQX Dashboard 的 Ingress tls[]
ingress.dashboard.annotationsEMQX Dashboard 的 Ingress 注解{}
ingress.dashboard.ingressClassName为 EMQX Dashboard 设置 Ingress 类
ingress.mqtt.enabled为 MQTT 启用 Ingressfalse
ingress.mqtt.ingressClassName为 MQTT 设置 Ingress 类
ingress.mqtt.pathMQTT 的 Ingress 路径/
ingress.mqtt.pathTypeMQTT 的 Ingress pathTypeImplementationSpecific
ingress.mqtt.hostsMQTT 的 Ingress 主机mqtt.emqx.local
ingress.mqtt.tlsMQTT 的 Ingress tls[]
ingress.mqtt.annotationsMQTT 的 Ingress 注解{}
ingress.mqtt.ingressClassName为 MQTT 设置 Ingress 类
metrics.enable如果设置为 true,需要安装 prometheus-operator,并且需要启用 emqx_prometheusfalse
metrics.type目前我们只支持 "prometheus""prometheus"
ssl.enabled启用 SSL 支持false
ssl.useExisting使用现有证书或让 cert-manager 生成一个false
ssl.existingName现有证书的名称emqx-tls
ssl.dnsnames要生成的证书的 DNS 名称{}
ssl.commonName要生成的证书的通用名称
ssl.issuer.name证书生成的颁发者名称letsencrypt-dns
ssl.issuer.kind证书生成的颁发者类型ClusterIssuer

EMQX 特有参数

以下表格列出了 Helm Chart 中可配置的 EMQX 专用参数及其默认值:

参数描述默认值
emqxConfig一组配置项 的映射,支持通过环境变量(可省略 EMQX_ 前缀)或使用 EMQX 配置文件中的命名空间点符号格式进行定义。nil
emqxLicenseSecretName存储许可证信息的 Secret 名称(已弃用)nil
emqxLicenseSecretRef.name包含许可证信息的 Secret 名称""
emqxLicenseSecretRef.key包含许可证信息的 Secret 中的键""

配置功能门控

从 EMQX 6.3.0 开始,可以设置 EMQX_FEATURES 控制启动时可用的可选功能。例如:

yaml
emqxConfig:
  EMQX_FEATURES: "dashboard,metrics,plugins"

功能门控只在 EMQX 启动时解析。如果修改该值,需要重新创建或重启 EMQX Pod。完整功能列表和依赖行为请参见功能门控

配置 Gateway API 路由

从 EMQX 6.3 开始,EMQX Enterprise Helm Chart 可以创建 Kubernetes Gateway API 路由,作为 Ingress 资源的替代方案。HTTPRoute 用于暴露 EMQX Dashboard 和 MQTT over WebSocket,TLSRoute 使用 TLS 透传暴露 MQTTS 和 WSS。

启用路由前,请完成以下准备工作:

  • 安装 Gateway API 控制器及其自定义资源定义(CRD)
  • 如需启用 tlsRoute.mqttstlsRoute.wss,请使用 Kubernetes 1.31 或更高版本,以及 Gateway API 1.5.0 或更高版本的 standard channel CRD。Gateway API 控制器必须支持 Passthrough 模式的 TLSRoute
  • 如需启用 httpRoute.ws,请使用无需 ServicePort.appProtocol 即可处理 HTTPRoute WebSocket 流量的 Gateway API 控制器。EMQX Helm Chart 不会在 WebSocket Service 端口上设置 appProtocol
  • 创建包含匹配监听器的 Gateway。
  • tlsRoute.mqttstlsRoute.wss 使用的 Gateway TLS 监听器配置为 tls.mode: Passthrough。TLS 连接由 EMQX 终结。

所有路由默认关闭。请为每个启用的路由设置 parentRefs,以将其关联到 Gateway。以下 values.yaml 示例启用了所有支持的路由:

yaml
service:
  wsEnabled: true

httpRoute:
  dashboard:
    enabled: true
    parentRefs:
      - name: emqx-gateway
        namespace: default
        sectionName: https
    hostnames:
      - dashboard.emqx.local
    path: /
    pathType: PathPrefix
  ws:
    enabled: true
    parentRefs:
      - name: emqx-gateway
        namespace: default
        sectionName: https
    hostnames:
      - ws.emqx.local
    path: /mqtt
    pathType: PathPrefix

tlsRoute:
  mqtts:
    enabled: true
    parentRefs:
      - name: emqx-gateway
        namespace: default
        sectionName: mqtts
    hostnames:
      - mqtt.emqx.local
  wss:
    enabled: true
    parentRefs:
      - name: emqx-gateway
        namespace: default
        sectionName: wss
    hostnames:
      - wss.emqx.local

请根据实际环境替换 Gateway 名称、命名空间、监听器名称和主机名。如果 Gateway 与 Helm 发布实例位于不同命名空间,请在引用的每个 Gateway 监听器上配置 allowedRoutes,允许来自 Helm 发布实例所在命名空间的 Route。Helm Chart 将创建以下路由:

路由后端 Service 端口默认路径
httpRoute.dashboardDashboard 和 API 的 18083 端口/
httpRoute.wsMQTT over WebSocket 的 8083 端口/mqtt
tlsRoute.mqttsMQTTS 的 8883 端口不适用
tlsRoute.wssWSS 的 8084 端口不适用

重要提示

启用 httpRoute.wstlsRoute.wss 时,请将 service.wsEnabled 保持为 true。否则,Helm 会停止渲染 Chart,并返回 httpRoute.ws.enabled requires service.wsEnabled=truetlsRoute.wss.enabled requires service.wsEnabled=true

安装或升级 Helm 发布实例后,检查路由状态:

bash
kubectl get httproute,tlsroute -o yaml

对于每个已关联的路由,确认 status.parents 中的 AcceptedResolvedRefs 条件均为 True。如果控制器报告 Programmed 条件,还需确认该条件为 True

Route 条件不能验证端到端流量。请向配置的 Dashboard 或 WebSocket 主机名发送请求,或通过 Gateway 建立 MQTTS 或 WSS 连接,以确认路由可以将流量转发到 EMQX。

Gateway API 路由参数如下:

参数描述默认值
httpRoute.<route>.enabled是否创建 dashboardws HTTPRoute。false
httpRoute.<route>.annotations添加到 HTTPRoute 的注解。{}
httpRoute.<route>.labels添加到 HTTPRoute 的标签。{}
httpRoute.<route>.parentRefs对父级 Gateway 和监听器的引用。[]
httpRoute.<route>.hostnames路由匹配的主机名。dashboard 默认为 dashboard.emqx.localws 默认为 ws.emqx.local
httpRoute.<route>.path路由匹配的路径。dashboard 默认为 /ws 默认为 /mqtt
httpRoute.<route>.pathType路径匹配类型。PathPrefix
tlsRoute.<route>.enabled是否创建 mqttswss TLSRoute。false
tlsRoute.<route>.annotations添加到 TLSRoute 的注解。{}
tlsRoute.<route>.labels添加到 TLSRoute 的标签。{}
tlsRoute.<route>.parentRefs对父级 Gateway 和 TLS 监听器的引用。[]
tlsRoute.<route>.hostnames路由匹配的必填 SNI 主机名。列表必须至少包含一个有效的完全限定域名。mqtts 默认为 mqtt.emqx.localwss 默认为 wss.emqx.local

SSL 设置

使用 cert-manager 时,TLS 证书会以 Kubernetes Secret 的形式保存,使用标准的键名:tls.crttls.key。EMQX Helm Chart 会将这些文件自动挂载至容器内的以下路径:

/tmp/ssl/

如需启用 SSL 支持,请显式指定证书路径,可通过配置文件或环境变量完成:

yaml
EMQX_LISTENERS__SSL__DEFAULT__SSL_OPTIONS__CERTFILE: /tmp/ssl/tls.crt
EMQX_LISTENERS__SSL__DEFAULT__SSL_OPTIONS__KEYFILE: /tmp/ssl/tls.key

提示

如果你使用的是已有证书(而非由 cert-manager 生成),请确保文件路径与挂载路径一致。

代理协议支持(HAProxy / Nginx)

如果 EMQX 部署在支持 Proxy Protocol 的反向代理(如 HAProxy 或 Nginx)之后,可通过设置以下环境变量启用该功能:

yaml
EMQX_LISTENERS__TCP__DEFAULT__PROXY_PROTOCOL: "true"

针对 HAProxy Ingress Controller,请在 Ingress 中添加如下注解:

yaml
haproxy-ingress.github.io/proxy-protocol: "v2"

启用后可保留客户端的原始 IP 地址。