我的 minikube 上有以下 Mosquitto 设置:
部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mosquitto
namespace: mosquitto
spec:
replicas: 1
selector:
matchLabels:
name: mosquitto
template:
metadata:
labels:
name: mosquitto
spec:
containers:
- name: mosquitto
image: eclipse-mosquitto:2.0.12
ports:
- containerPort: 1883
volumeMounts:
- name: mosquitto-config
mountPath: /mosquitto/config/mosquitto.conf
subPath: mosquitto.conf
volumes:
- name: mosquitto-config
configMap:
name: mosquitto-configmap
配置图:
apiVersion: v1
kind: ConfigMap
metadata:
name: mosquitto-configmap
namespace: mosquitto
data:
mosquitto.conf: |-
listener 1883
allow_anonymous true
服务:
apiVersion: v1
kind: Service
metadata:
name: mosquitto-service
spec:
type: NodePort
selector:
name: mosquitto
ports:
- protocol: TCP
port: 1883
targetPort: 1883
nodePort: 30007
现在我想从我的局域网访问我的部署。在我的主机 Windows 机器上使用 MQTT-Explorer 进行测试。使用 mqtt://localhost:30007 不起作用。已知该设置与端口转发一起使用。
$ k port-forward mosquitto-66d69df7c9-zrvgt 1111:1883
Forwarding from 127.0.0.1:1111 -> 1883
Forwarding from [::1]:1111 -> 1883
Handling connection for 1111
我想我误解了服务部分。最后,服务应该可以从我的 LAN 中访问:
额外问题:如何将服务路由到 mqtt.local 之类的东西?Kubernetes Ingress 对我也不起作用,猜测是因为它仅用于 HTTP
A
NodePort
分配集群内部的 IP,因此需要端口转发。要将内部端口传递给外部端口,您需要
spec.type
将LoadBalancer
.我发现术语“LoadBalancer”令人困惑,因为它与 AWS 等服务用于他们自己的负载均衡器(例如 Amazon 中的 ELB)的术语相冲突。在 Kubernetes 中,
LoadBalancer
服务将在与您指定的条件匹配的任何 pod 之间进行负载平衡,或者在本例中仅匹配一个。诀窍是,如果您在具有实际负载均衡器的环境中,那么该服务将自动映射到外部负载均衡器,以便您可以使用真实 IP 访问该服务。
这也可以使用 an 来完成,
Ingress
但只能用于带有入口控制器(例如 NGINX)的 http 和 https 服务。因为 MQTT 是一种不同的协议,所以服务用于传递连接。就我而言,我不在云服务上,因此默认情况下没有像 ELB 这样的负载均衡器 - 您必须添加自己的负载均衡器(请参阅我的意思是混淆)。我在集群中安装了一个本地 MetalLB 负载均衡器,该端口神奇地出现在我分配的一个本地 IP 池中。
从那里您只需要设置 DNS(可能在您的路由器中),以便您想要的名称与分配的 IP 相对应。我的代理现在出现在
mqtt.local
1883 端口这是对我有用的yaml:
...这是 metalLB 的 YAML: