为什么Traefik不在Docker Swarm中代理新服务?

时间:2017-12-03 20:18:26

标签: docker-swarm traefik

我尝试使用Docker Swarm设置traefik。我需要VM - 一个manger-node和一个worker-node。 此外,我创建了一个外部网络:

docker network create --driver=overlay proxy-net

我使用以下docker-compose.yml文件在我的manager-node中启动traefik作为服务:

version: '3'

services:
  traefik:
     image: traefik:v1.4.4
     volumes:
       - /var/run/docker.sock:/var/run/docker.sock
       - $PWD/management/traefik/traefik.toml:/etc/traefik/traefik.toml
     ports:
       - 80:80
       - 8100:8080
     deploy:
       placement:
         constraints:
           - node.role == manager

networks:
   default:
    external:
      name:  proxy-net

我的traefik.toml文件如下所示:

Debug : "DEBUG"
defaultEntryPoints = ["http"]
[entryPoints]
    [entryPoints.http]
    address = ":80"

[web]
address = ":8080"

[docker]
watch = true
swarmmode = true
domain = "mydomain.com"
exposedbydefault = true

当我现在开始一项新服务(例如emilevauge / whoami):

docker service create \
    --name whoami1 \
    --publish mode=host,target=80,published=8002 \
    --network proxy-net \
    --label traefik.docker.network=proxy-net \
    --label traefik.frontend.rule=Host:whoami.mydomain.com \
    --label traefik.port=8002 \
    emilevauge/whoami

该服务由traefik网络前端查看。所以起初每件事看起来都很好。我可以直接在端口8002上的工作节点上访问该服务。 但是traefik似乎无法代理这项服务。当我浏览我的端点URL(whomai.mydomain.com)时,我得到了答案:

Bad Gateway

traefik logfile(logLevel = DEBUG)显示如下消息:

proxy_traefik.1.zl50yv6got5f@tocidoc001 time="2017-12-03T20:09:28Z" level=debug msg="Filtering container without port and no traefik.port label swarmpit_app.1 : strconv.Atoi: parsing "": invalid syntax"
proxy_traefik.1.zl50yv6got5f@tocidoc001 time="2017-12-03T20:09:28Z" level=debug msg="Filtering container without port and no traefik.port label proxy_traefik.1 : strconv.Atoi: parsing "": invalid syntax"
proxy_traefik.1.zl50yv6got5f@tocidoc001 time="2017-12-03T20:09:28Z" level=debug msg="Filtering container without port and no traefik.port label swarmpit_db.1 : strconv.Atoi: parsing "": invalid syntax"
proxy_traefik.1.zl50yv6got5f@tocidoc001 time="2017-12-03T20:09:28Z" level=debug msg="Validation of load balancer method for backend backend-whoami1-whoami1-whoami1 failed: invalid load-balancing method ''. Using default method wrr."
proxy_traefik.1.zl50yv6got5f@tocidoc001 time="2017-12-03T20:09:28Z" level=debug msg="Configuration received from provider docker: {"backends":{"backend-whoami1-whoami1-whoami1":{"servers":{"service-0":{"url":"http://10.0.1.5:8002","weight":0}},"loadBalancer":{"method":"wrr"}}},"frontends":{"frontend-whoami1-whoami1-whoami1":{"entryPoints":["http"],"backend":"backend-whoami1-whoami1-whoami1","routes":{"service-whoami1":{"rule":"Host:whoami.mydomain.com"}},"passHostHeader":true,"priority":0,"basicAuth":[],"headers":{}}}}"

我用不同的配置玩了几个小时。我还阅读了关于traefik和docker-swarm的非常简洁的文档。但我不知道我做错了什么。

任何人都可以帮我提一些如何更好地理解问题的建议吗?

4 个答案:

答案 0 :(得分:2)

我认为它不起作用,因为您的Træfik服务与whoami1服务不在同一个docker网络上。

您应该尝试将代理网络网络添加到您的撰写文件中的Træfik服务。

本页末尾的Træfik文档中有警告https://docs.traefik.io/configuration/backends/docker/

when running inside a container, Træfik will need network access through:
docker network connect <network> <traefik-container>

答案 1 :(得分:2)

如前所述,它们需要位于不进入的同一覆盖网络中。入口网络仅用于管理器节点 此外,您的traefik服务未分配给proxy-net网络。您在traefik配置部件中创建proxy-net,但未将其分配给它

version: '3'

services:
    traefik:
        image: traefik:v1.4.4
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - $PWD/management/traefik/traefik.toml:/etc/traefik/traefik.toml
        ports:
            - 80:80
            - 8100:8080
        networks:
        - proxy-net
        deploy:
        placement:
            constraints:
                - node.role == manager

networks:
    proxy-net:
        driver: overlay

此外,您应该使用docker config create创建配置。否则使用$PWD/management/traefik/traefik.toml,您需要将traefik.toml文件复制到每个管理器节点。

使用

附加您的撰写文件
configs:
  traefik_conf_v1:
    file: ./traefik.toml

和你的traefik部分

    configs:
      - source: traefik_conf_v1
        target: /etc/traefik/traefik.toml

现在回到你的问题 你的服务缺少的是后端的标签。否则traefik不知道服务的运行位置(网络分配不够!)。

docker service create \
    --name whoami1 \
    --publish mode=host,target=80,published=8002 \
    --network proxy-net \
    --label traefik.backen=whoami1 \
    --label traefik.docker.network=proxy-net \
    --label traefik.frontend.rule=Host:whoami.mydomain.com \
    --label traefik.port=8002 \
    emilevauge/whoami

这应该有效。当它发生时,停止发布您的服务端口。当你赶时间并且需要扩展时,这会使一切变得复杂。请记住,工作平衡由群本身处理。

是的,动态灵活的反向代理现在仍然是一个问题:) 请记住,您在使用traefik的管理器节点上获得了入口点,但在工作节点上却没有。

答案 2 :(得分:0)

我终于解决了这个问题。这实际上不是Traefik问题。 问题是,来自我的提供商的两个VM都具有相同的私有IPv4地址。 要注册并加入docker-swarm,为公共IPv4地址提供选项 - advertise-addr

非常重要。

要注册我必须运行的群:

include_directories( ${OpenCV_INCLUDE_DIRS} )

通过worker-node加入swarm也需要明确设置公共IPv4地址:

docker swarm init --advertise-addr [manager-ip-address]

答案 3 :(得分:0)

我会说您的服务标签设置错误。 Traefik将请求重定向到群集服务端口,因此它应转到端口80,而不是已发布的端口8002。我认为正确的服务创建命令应为:

docker service create \
    --name whoami1 \
    --publish mode=host,target=80,published=8002 \
    --network proxy-net \
    --label traefik.docker.network=proxy-net \
    --label traefik.frontend.rule=Host:whoami.mydomain.com \
    --label traefik.port=80 \
    emilevauge/whoami

并且不需要为whoami服务发布80端口。