AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1079642
Accepted
Daniel
Daniel
Asked: 2021-10-06 10:31:29 +0800 CST2021-10-06 10:31:29 +0800 CST 2021-10-06 10:31:29 +0800 CST

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

  • 772

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

kubernetes minikube
  • 1 1 个回答
  • 1051 Views

1 个回答

  • Voted
  1. Best Answer
    ianjs
    2021-10-14T20:58:43+08:002021-10-14T20:58:43+08:00

    ANodePort分配集群内部的 IP,因此需要端口转发。

    要将内部端口传递给外部端口,您需要spec.type将LoadBalancer.

    我发现术语“LoadBalancer”令人困惑,因为它与 AWS 等服务用于他们自己的负载均衡器(例如 Amazon 中的 ELB)的术语相冲突。在 Kubernetes 中,LoadBalancer服务将在与您指定的条件匹配的任何 pod 之间进行负载平衡,或者在本例中仅匹配一个。

    诀窍是,如果您在具有实际负载均衡器的环境中,那么该服务将自动映射到外部负载均衡器,以便您可以使用真实 IP 访问该服务。

    这也可以使用 an 来完成,Ingress但只能用于带有入口控制器(例如 NGINX)的 http 和 https 服务。因为 MQTT 是一种不同的协议,所以服务用于传递连接。

    就我而言,我不在云服务上,因此默认情况下没有像 ELB 这样的负载均衡器 - 您必须添加自己的负载均衡器(请参阅我的意思是混淆)。我在集群中安装了一个本地 MetalLB 负载均衡器,该端口神奇地出现在我分配的一个本地 IP 池中。

    从那里您只需要设置 DNS(可能在您的路由器中),以便您想要的名称与分配的 IP 相对应。我的代理现在出现在mqtt.local1883 端口

    这是对我有用的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
    
    • 0

相关问题

  • 无法通过 Docker 在本地运行 Hyperkube (kubernetes)

  • 跨 Kubernetes 分散工作负载

  • Kubernetes升级回滚机器类型

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve