我正在尝试使用consul作为键/值存储在docker上部署traefik堆栈。我的群集由三个节点(三个主节点)组成:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
rqg08lc4ixgjuo1azi57654z1 * tools-master-1 Ready Active Leader 18.03.1-ce
vi42z7f8dx6bgrhzbda8v7z15 tools-master-2 Ready Active Reachable 18.03.1-ce
khz5x5g28i64owyo8tykedern tools-master-3 Ready Active Reachable 18.03.1-ce
每个节点都在不同的服务器上。为了尽可能地限制我身边的任何潜在错误,我试图使用Traefik的官方文档并严格遵守它;我使用过此链接:https://docs.traefik.io/user-guide/cluster-docker-consul/
swarm群集本身正在工作(我可以在其上部署其他服务,一切似乎都可以)。但是,我无法让traefik工作。
我把它归结为我做了以下几点:
- 从一个空的新创建的VM开始
- 安装docker和类似的基本东西
- 复制与traefik官方文档末尾完全相同的docker-compose(有三个例外,见下文)
- 启动docker stack deploy testing -c /path/to/my/docker-compose.yml
三个唯一的区别是: - 我显然改变了自己的电子邮件和域名 - 我从consul的卷中删除了“driver”行,因为我的docker实例在我要求overlay2时似乎无法识别...但是根据https://docs.docker.com/v17.09/engine/userguide/storagedriver/selectadriver/#docker-ee-and-cs-engine,它应该是默认值。
问题是:traefik似乎无法与领事沟通。这是traefik的输出:
testing_traefik.0.yy6vfo4qo3kl@tools-master-1 | time="2018-06-06T20:53:05Z" level=error msg="Load config error: Get http://consul:8500/v1/kv/traefik?consistent=&recurse=&wait=30000ms: dial tcp: lookup consul on 127.0.0.11:53: no such host, retrying in 20.35838976s"
据我所知,无法找到领事(或者traefik无法找到dns本身)。但是,服务正在增加:
ID NAME MODE REPLICAS IMAGE PORTS
e78d24w45wzd testing_consul replicated 1/1 consul:latest
o1dzrdqeoiy0 testing_traefik global 3/3 traefik:1.5
om8qac3upy22 testing_traefik_init replicated 0/1 traefik:1.5
我认为它可能来自仅限主机的网络。所以我决定尝试剥离每个端口的traefik(使它无用,但现在我只想让它与领事交谈)。我还删除了“webgateway”网络(再次,测试)。没有更多的运气......由于这是官方文档的例子,我真的不知道在哪里寻找更多的东西。
所以,问题就出现了......有没有人知道什么可能导致这个错误?或者让任何其他方法让traefik在swarm集群中使用let加密?
谢谢!
PS:docker install + server provisionning使用terraform + ansible完成。我怀疑这两件事可能是问题的根源,但它可能有助于调查,我可以分享.tf / .yml文件。
编辑:我还发现,如果服务想要说话/识别另一个服务,如果两个服务器不在同一个群集节点上,则似乎会出现dns解析问题。
我在我的docker-compose中添加了debian服务,然后进入容器内部。从那里: - 当我尝试ping“traefik”(traefik是docker-compose中的全局服务,它出现在每个节点上),我可以 - 当我尝试ping“shell”(我添加的容器),这不是它的主机名,因此通过DNS发现,我可以 - 当我尝试ping“consul”(在另一个节点上)时,我不能,dns解析失败。
所以我怀疑我的docker配置有问题?如果这可能有帮助,这里是一个swarm代理中的docker info的输出(它们都使用相同的ansible任务安装,所以它们的信息应该是相同的):
Containers: 3
Running: 2
Paused: 0
Stopped: 1
Images: 2
Server Version: 18.03.1-ce
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: active
NodeID: rqg08lc4ixgjuo1azi57654z1
Is Manager: true
ClusterID: nydyw0ufzgy6739u15xvt1pts
Managers: 3
Nodes: 3
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 10
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 10.15.15.39
Manager Addresses:
10.14.109.15:2377
10.15.1.25:2377
10.15.15.39:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 773c489c9c1b21a6d78b5c538cd395416ec50f88
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: 949e6fa
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.4.127-mainline-rev1
Operating System: Ubuntu 16.04.4 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 995.2MiB
Name: tools-master-1
ID: YFOZ:HA4F:UG52:EAGR:6G5O:554H:XXFO:YCGW:Q5CB:YQDF:OB7W:TYMB
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
答案 0 :(得分:1)
好的,感谢这篇文章:https://github.com/docker/swarmkit/issues/1429我发现了这个问题。
问题来自两个主要来源:
首先,节点之间的通信必须允许在端口7946 tcp / udp和4789 udp上(对于主人来说是2377,但在我的情况下已经完成)
其次,默认子网的IP似乎会干扰docker的dns。它需要改变:
networks:
traefik:
driver: overlay
ipam:
config:
- subnet: 10.0.0.0/24
(无论子网是什么,只要它没有ip 172.0.0.11,这是docker的dns IP)