Kubernetes下通过haproxy-ingress实现Vernemq 1883端口SSL终止问询
VerneMQ + HAProxy Ingress SSL 终止配置方案
前置要求
- 已签发目标子域名(示例用
mqtt.yourdomain.com)的SSL证书,已创建为K8s TLS类型Secret,建议将Secret存在HAProxy Ingress所在命名空间,减少权限配置 - HAProxy Ingress控制器已正常部署,支持TCP服务暴露(默认官方部署包已开启该能力)
- VerneMQ已在集群内部署完成,1883明文端口已通过ClusterIP服务正常暴露,示例中服务名为
vernemq,部署在mqtt命名空间
配置步骤
1. 配置TCP服务映射
MQTT是四层TCP协议,无法直接通过七层Ingress资源配置,需要通过HAProxy Ingress的TCP服务ConfigMap做映射,实现SSL终止和流量转发:
如果你修改过HAProxy Ingress的默认TCP配置源,对应替换ConfigMap名称和命名空间即可,默认配置读取
haproxy-ingress命名空间下的tcp-servicesConfigMap
apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: haproxy-ingress data: # 配置格式:<对外端口>: <服务命名空间>/<服务名>:<服务端口>:::<SSL证书Secret名称> "8883": "mqtt/vernemq:1883:::mqtt-yourdomain-com-tls"
该配置会让HAProxy在8883端口监听加密MQTT请求,完成SSL解密后,将明文流量转发到后端VerneMQ的1883端口,完全符合你要求的SSL终止逻辑。
2. 开放HAProxy Ingress的8883端口
修改HAProxy Ingress的Service配置,新增8883端口的对外映射,示例(LoadBalancer类型Service):
apiVersion: v1 kind: Service metadata: name: haproxy-ingress namespace: haproxy-ingress spec: type: LoadBalancer ports: - name: http port: 80 targetPort: http - name: https port: 443 targetPort: https # 新增MQTT SSL端口 - name: mqtt-ssl port: 8883 targetPort: 8883 selector: app.kubernetes.io/name: haproxy-ingress
配置完成后,将你的子域名解析到该Service的公网IP即可。
3. 验证配置
用MQTT客户端工具直接测试连通性,示例用mosquitto客户端:mosquitto_pub -h mqtt.yourdomain.com -p 8883 -t test/topic -m "testmsg"
如果使用自签证书,加上--cafile 你的根证书路径参数即可,连接成功即代表配置生效,此时VerneMQ侧收到的是来自HAProxy的明文1883端口请求。
可选:支持WSS协议访问
如果需要同时支持网页端的WSS协议访问,额外配置七层Ingress即可:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: vernemq-wss namespace: mqtt annotations: kubernetes.io/ingress.class: "haproxy" spec: tls: - hosts: - mqtt.yourdomain.com secretName: mqtt-yourdomain-com-tls rules: - host: mqtt.yourdomain.com http: paths: - path: /mqtt pathType: Prefix backend: service: name: vernemq port: number: 8080 # VerneMQ默认的WS协议监听端口
配置后可通过wss://mqtt.yourdomain.com/mqtt访问,SSL同样在HAProxy侧完成终止。
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

