当前位置: 首页 > 知识库问答 >
问题:

如何路由与traefik到一个docker群服务暴露两个端口?

姜淇
2023-03-14

RabbitMq在端口15672提供管理GUI,客户端在端口5672连接到消息代理

我的环境:
docker swarm服务器版本:19.03.5
image:“traefik:v2.0.2”
images:rabbitmq:management alpine

我可以在https://mq.mydom.comexample上浏览Rabbit MQ管理页面,下面是我的docker stack deploy的compose.yml的一部分

  mq:
    deploy:
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.mq-service.rule=Host(`mq.mydom.comexample`)"
        - "traefik.http.services.mq-service.loadbalancer.server.port=15672"
        - "traefik.http.routers.mq-service.entrypoints=websecure"
        - "traefik.http.routers.mq-service.tls.certresolver=mytlschallenge"

现在我也希望连接到同一服务中的RabbitMq消息代理,但我不理解traefik语法。尝试了各种变化,但没有成功。以下是其中一个变体,可能显示了我想要实现的目标:

  mq:
    deploy:
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.mq-service.rule=Host(`mq.mydom.comexample`)"
        - "traefik.http.services.mq-service.loadbalancer.server.port=15672"
        - "traefik.http.routers.mq-service.entrypoints=websecure"
        - "traefik.http.routers.mq-service.tls.certresolver=mytlschallenge"
        # so far same as above

        - "traefik.http.routers.mq-connect.rule=Host(`mq-connect.mydom.comexample`)"
        - "traefik.http.services.mq-connect.loadbalancer.server.port=5672"

浏览 https://mq.mydom.comexample 或 https://mq-connect.mydom.comexample 都响应 404 页面未找到

telnetmq.mydom.comexample443
telnetmq-connect.mydom.comexample443
都连接:转义字符是'^]'。

我如何告诉traefik路由我想要什么?

共有3个答案

屠锐
2023-03-14

我在试图让RabbitMQ在Traefik后面运行时偶然发现了这个答案。经过几天的努力,让这些解决方案在我的EC2实例上运行,我终于意识到这些示例(运行完美)和我在云上运行它们的方式之间的唯一区别是docker资源限制(我总是将其应用于云服务)。

我不知道最小的约束是什么(或者这些约束如何严重干扰RabbitMQ),但我可以说,这些资源限制会导致问题,并会创建一个半功能的RMQ实例(我可以经常连接到它,但无法成功地从中提取任务)。我以为这是因为我搞砸了Traefik路由,但这是这里提到的码头工人资源限制。希望这能让别人省心!

resources:
  limits:
    cpus: "0.25"
    memory: 128M

从Rabbit的生产清单来看,至少需要256MB的内存。将这个限制提高到256MB并没有解决问题,但是仔细阅读这个文档可能会发现造成不稳定实例的资源限制。

从Rabbit的Docker Hub页面来看,由于Rabbit明确地跟踪和管理内存使用,它需要知道cgroup强加的限制。这就是问题所在!你必须让Rabbit知道任何docker强加给内存的资源限制。

寿阳华
2023-03-14

我做了一些关于特拉菲克·V2的研究。多个endpoint的解决方案是显式命名您的服务。这里有一个例子:

  whoami:
    image: "containous/whoami"
    container_name: "simple-service"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.docker`)"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.service=whoami"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"
      - "traefik.http.routers.altwhoami.rule=Host(`alt.docker`)"
      - "traefik.http.routers.altwhoami.entrypoints=web"
      - "traefik.http.routers.altwhoami.service=altwhoami"
      - "traefik.http.services.altwhoami.loadbalancer.server.port=80"

因此,为了修复您的traefik实现,您需要html" target="_blank">添加traefik.http.routers.whoami.service=service-name标签。

希望这有帮助。

编辑:

为了通过traefik路由AMQP,您需要一个TCP路由器。我为rabbitmq创建了一个小的工作示例:

version: "3.3"
services:
  traefik:
    image: "traefik"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.rabbitmq.address=:5672"
    ports:
      - "80:80"
      - "8080:8080"
      - "5672:5672"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  rabbitmq:
    image: "rabbitmq:management-alpine"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.rabbitmq.rule=Host(`rabbitmq.docker`)"
      - "traefik.http.routers.rabbitmq.entrypoints=web"
      - "traefik.http.routers.rabbitmq.service=rabbitmq"
      - "traefik.http.services.rabbitmq.loadbalancer.server.port=15672"

      - "traefik.tcp.routers.ingress.rule=HostSNI(`*`)"
      #- "traefik.tcp.routers.ingress.rule=HostSNI(`ingress.docker`)"
      - "traefik.tcp.routers.ingress.entrypoints=rabbitmq"
      #- "traefik.tcp.routers.ingress.tls=true"
      #- "traefik.tcp.routers.ingress.tls.passthrough=true"
      - "traefik.tcp.services.ingress.loadbalancer.server.port=5672"

这将通过traefik将端口5672上的TCP流量路由到您的容器(确保相应地调整traefik配置)。

您可能会注意到相当开放的< code>HostSNI(*)规则。如果您想将此规则限制到单个主机/域,您必须在rabbitmq中启用TLS支持,以便traefik正确过滤这些请求。

检查有关将traefik转换为支持tls的信息的注释行。您可以让traefik处理TLS,也可以直接将其传递给rabbitmq。

帅令雪
2023-03-14

总而言之,这现在对我有用(非常感谢)。

version: "3.7"

  traefik:
    image: "traefik:v2.0.2"
    command:
      - "--api.insecure=true"
      - "--providers.docker.swarmMode=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.rabbitmq.address=:5672"
      - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
     # testing: Letsencrypt would close us out for 24hrs if too many bad requests are made!
     #- "--certificatesresolvers.mytlschallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.mytlschallenge.acme.email=postmaster@mydomain"
      - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
      - "--log=true"
      - "--log.filepath=/var/log/traefik.log"
    ports:
      # https
      - "443:443"
      # traefik dash
      - "8080:8080"
      # rabbit mq message broker
      - "5672:5672"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  mq:
    hostname: xyz_mq
    image: rabbitmq:3.8.2-alpine
    environment:
      - RABBITMQ_DEFAULT_VHOST=prod_vhost
      - RABBITMQ_DEFAULT_USER=prod_user
      - RABBITMQ_DEFAULT_PASS=abcdef123
    deploy:
      labels:
        - "traefik.enable=true"

        # web browser access to RabbitMq management GUI
        - "traefik.http.routers.mq.rule=Host(`mq.mydomain`)"
        - "traefik.http.services.mq.loadbalancer.server.port=15672"
        - "traefik.http.routers.mq.entrypoints=websecure"
        - "traefik.http.routers.mq.tls.certresolver=mytlschallenge"
        - "traefik.http.routers.mq.service=mq"

        # AMQPS - SSL terminated by traefik
        - "traefik.tcp.routers.mq-connect.rule=HostSNI(`mq-connect.mydomain`)"
        - "traefik.tcp.services.mq-connect.loadbalancer.server.port=5672"
        - "traefik.tcp.routers.mq-connect.entrypoints=rabbitmq"
        - "traefik.tcp.routers.mq-connect.tls.certresolver=mytlschallenge"
        - "traefik.tcp.routers.mq-connect.service=mq-connect"
    volumes:
      - rabbitmq:/var/lib/rabbitmq
      - ./rabbitmq_plugins:/etc/rabbitmq/enabled_plugins
    stop_grace_period: 5m

volumes:
  rabbitmq:
 类似资料:
  • 我正在使用Traefik将传统的nginx前端反向代理迁移到Kubernetes集群。最终目标是将一切都转移到微服务上,但这可能需要一段时间。同时,如何创建一个IngressRoute CRD,将其路由到集群外部托管的遗留系统?这只是一个http://server:port有点向前。我已经仔细阅读了这些文档,但Traefik v2.0似乎已经取消了对自定义后端的支持,而且我不太确定在没有Ingre

  • 我正在使用go-swagger生成API服务器。我注意到json是由swagger生成的。yml保存在restapi/embedded\u spec.go中。 公开JSON规范以便我的ReactJS客户端可以访问它的最佳方式是什么? 到目前为止,我不得不使用招摇发球招摇。yml—端口=50000,并将JavaScript客户端指向本地主机:50000/swagger。json。我正在寻找一种通过A

  • 主要内容:1. 概述,2.本地暴露,3 远程暴露1. 概述 Dubbo 服务暴露有两种方式 本地暴露,JVM 本地调用。配置如下: 远程暴露,网络远程通信。配置如下: 在不配置 scope 的情况下,默认两种方式都暴露 2.本地暴露 2.1 doExportUrls 本地暴露服务的顺序图如下: ServiceConfig#export() 方法中,会在配置初始化完成后,调用顺序图的起点 #doExportUrls() 方法,开始暴露服务。代码如

  • next/config模块使你应用运行时可以读取些存储在next.config.js的配置项。serverRuntimeConfig属性只在服务器端可用,publicRuntimeConfig属性在服务端和客户端可用。 // next.config.js module.exports = { serverRuntimeConfig: { // Will only be available on

  • 主要内容:1.概述,2.doExportUrls,3. Protocol1.概述 Dubbo 服务暴露有两种方式 本地暴露,JVM 本地调用。配置如下: <dubbo:service scope=“local” /> <dubbo:service scope=“remote” /> 在不配置 scope 的情况下,默认两种方式都暴露。 2.doExportUrls 本地暴露服务的顺序图如下: 我们看到 ServiceConfig#export() 方法中,会在配置初始

  • 我已经通过dockerfile制作了一个图像,其中我通过“暴露22”行暴露了一个端口。 “sudo docker build-t mysql_服务器。” 在那之后,我发现我不需要这个端口。 如何关闭22端口? 编辑:@Adrian Mouat@seanmcl 图像是一个mysql。所以数据库中的数据都在我名为"cliff_mysql56"的容器中。如果我重建图像并运行它,我必须将我所有的数据从这个