我正在尝试使用域名将 K3s 集群中运行的 MQTT 服务公开到互联网。但是,我遇到了无法公开访问该服务的问题。当我尝试通过域使用 ESP32 设备连接到 MQTT 代理时,我收到“连接被拒绝”错误。
以下是我正在使用的相关配置:
mqtt.example.com
apiVersion: apps/v1
kind: Deployment
metadata:
name: mqtt
namespace: mqtt-dev
labels:
app: mqtt
spec:
replicas: 1
selector:
matchLabels:
app: mqtt
template:
metadata:
labels:
app: mqtt
spec:
containers:
- name: mqtt
image: eclipse-mosquitto:latest
ports:
- containerPort: 1883
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
tcpSocket:
port: 1883
initialDelaySeconds: 15
periodSeconds: 10
readinessProbe:
tcpSocket:
port: 1883
initialDelaySeconds: 10
periodSeconds: 5
apiVersion: v1
kind: Service
metadata:
name: mqtt
namespace: mqtt-dev
spec:
type: NodePort
selector:
app: mqtt
ports:
- protocol: TCP
port: 1883
targetPort: 1883
nodePort: 30083
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mqtt-ingress
namespace: mqtt-dev
spec:
ingressClassName: traefik
rules:
- host: mqtt.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mqtt
port:
number: 1883
tls:
- hosts:
- mqtt.example.com
kubectl get svc
显示为 EXTERNAL-IP
或 none
。我尝试使用各种服务类型,例如pending
LoadBalancer
,但都没有解决问题。使用域名 (NodePort
mqtt.example.com
Ingress 使用基于 HTTP 主机名的代理,但 MQTT 不在协议连接数据包中包含主机名,因此控制器无法确定如何将流量路由到正确的 pod
暴露这些的正确方法是使用
mqtt.example.com
类型的
Service
(而不是 LoadBalancer
或 NodePort
)。您可以使用 Ingress 通过 WebSocket 公开 MQTT,因为该引导程序作为 HTTP。