我的 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
现在我想从我的 LAN 访问我的部署。从我的主机 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
答案1
ANodePort
分配一个集群内部的 IP,因此需要端口转发。
要将该内部端口传递到外部端口,您需要将其更改spec.type
为LoadBalancer
。
我发现术语“LoadBalancer”令人困惑,因为它与 AWS 等服务对其自己的负载均衡器(例如 Amazon 的 ELB)使用的术语相冲突。在 Kubernetes 中,服务LoadBalancer
将在符合您指定条件的任何 Pod 之间进行负载平衡,在本例中,仅对一个 Pod 进行负载平衡。
诀窍是,如果您处于具有实际负载均衡器的环境中,那么服务将自动映射到外部负载均衡器,以便您可以使用真实 IP 访问该服务。
这也可以通过Ingress
但只能用于带有入口控制器(例如 NGINX)的 http 和 https 服务来实现。由于 MQTT 是一种不同的协议,因此该服务用于传递连接。
就我而言,我没有使用云服务,因此默认没有提供像 ELB 这样的负载均衡器 - 您必须添加自己的负载均衡器(明白我所说的混乱的意思)。我在集群中安装了一个本地 MetalLB 负载均衡器,端口神奇地出现在我分配的本地 IP 池之一中。
从那里,你只需要设置 DNS(可能在你的路由器中),以便你想要的名称与分配的 IP 相对应。我的代理现在出现在mqtt.local
端口 1883 上
这是对我有用的 yaml:
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
namespace: mosquitto
annotations: # <-- Which IP pool to use
metallb.universe.tf/address-pool: lb-static-ips
spec:
type: LoadBalancer # <-- Changed
selector:
name: mosquitto
ports:
- name: mosquitto
protocol: TCP
port: 1883
targetPort: 1883
# nodePort: 30007 <--- LoadBalancer will figure this out
...这是 metalLB 的 YAML:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: http # one IP address for virtual http hosts
protocol: layer2
addresses:
- 10.3.3.152/32
- name: lb-static-ips # IP addresses for services
protocol: layer2
addresses:
- 10.3.3.153-10.3.3.160