我尝试使用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的非常简洁的文档。但我不知道我做错了什么。
任何人都可以帮我提一些如何更好地理解问题的建议吗?
答案 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
端口。