从我的 kubernetes 集群外部访问 Mosquitto MQTT

从我的 kubernetes 集群外部访问 Mosquitto MQTT

我的 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.typeLoadBalancer

我发现术语“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

相关内容