在Windows上加入Linux Docker Swarm集群进行测试目的

45次阅读
没有评论

问题描述

想要将他的Windows机器连接/加入到一个Linux Docker Swarm集群,以便在不反复将堆栈发送到Linux测试集群的情况下测试堆栈。他的问题是无法使用Windows Docker加入到集群中。

用户的集群最初有1个管理节点和4个工作节点。最近,他添加了一个新的管理节点,以便将他的Windows Docker节点作为管理节点添加到集群中。这样,他不应该在管理节点数量上出现问题(因为他的两个管理节点将始终处于活动状态,而Windows Docker可能随时中断)。

用户已经在本地防火墙以及Linux集群的每个节点上配置了接受端口连接的规则,这些规则可以在文档的末尾找到:

  • TCP端口2377用于集群管理通信
  • TCP和UDP端口7946用于节点之间的通信
  • UDP端口4789用于覆盖网络流量

集群中的广播网络为192.168.0.0/24,其中一个管理节点的IP地址为192.168.0.100,用户的PC的IP地址为192.168.0.143(位于同一网络)。他们可以相互ping通,用户还测试了上述定义的端口。

然后,用户在一个管理节点上执行了docker swarm join-token manager命令,得到了类似以下的结果:

docker swarm join --token SWMTKN-1-27hzpcnek5... 192.168.0.200:2377

如果将这个命令复制/粘贴到用户的PC上,就会得到一个错误:

Error response from daemon: manager stopped: can't initialize raft node: rpc error: code = Unknown desc = could not connect to prospective new cluster member using its advertised address: rpc error: code = DeadlineExceeded desc = context deadline exceeded

尽管出现错误,但在集群上运行docker node ls命令时,用户的节点出现在列表中:

8380zb5jeke0elwohr7aieke8     linuxkit-00155d00d946   Ready               Active

但是在用户的PC上,Docker认为它不是集群的成员:

Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

集群和用户的PC上的Docker版本不同:

集群:
– 客户端:17.09.1-ce
– 服务器:17.09.1-ce

PC:
– 客户端:18.03.1-ce
– 服务器:18.03.1-ce

问题可能出在这里吗?

用户使用的是Windows上的Bash(在Windows Subsystem for Linux上),但在PowerShell上结果是一样的。

用户不确定是否有用,但由于Docker for Windows使用Hyper-V,他有一个NAT接口:10.0.75.0/24(虚拟机的IP地址是10.0.75.1)。他尝试使用这个接口作为广播地址和监听地址,但问题仍然存在。

是否有人遇到过这个问题?有什么建议吗?

解决方案

请注意以下操作可能因版本差异而有所不同,同时在执行任何操作前请务必做好备份。

方案1:使用SSH隧道连接Docker Socket

在你的情况下,为了在Windows环境中连接到Linux Docker Swarm集群,你可以使用SSH隧道来暴露Docker Socket并将Docker CLI绑定到Swarm管理节点。以下是操作步骤:

  1. 在Windows上安装OpenSSH客户端,以便能够使用SSH命令。
  2. 打开一个终端(Bash、PowerShell等)。
  3. 使用以下命令建立SSH隧道,将Linux管理节点的Docker Socket映射到本地端口:
ssh -M -S ~/.docker.sock -fnNT -4 -L localhost:1337:/var/run/docker.sock USER@MANAGER_IP

请将USER替换为你的用户名,MANAGER_IP替换为Linux管理节点的IP地址。此命令将创建一个SSH隧道,将Linux管理节点的Docker Socket映射到本地端口1337

  1. 在同一个终端中,设置DOCKER_HOST环境变量,使Docker CLI绑定到本地的Docker Socket:
export DOCKER_HOST=localhost:1337

现在,你可以在Windows环境中使用Docker CLI,就好像在Linux节点上工作一样。

方案2:统一Docker版本

尽管您在集群和PC上运行不同版本的Docker,但为了减少问题,建议统一Docker版本。确保您在集群和PC上都运行相同版本的Docker。在您的情况下,尝试将集群和PC上的Docker版本都升级到18.03.1-ce

请注意,集群中的Docker引擎版本应保持一致,特别是在添加、删除、升级节点时。在需要升级管理节点上的Docker引擎时,可以在不进行升级/降级的情况下直接在现有节点上进行升级。但应尽量减少在这种状态下的时间,并避免在Swarm中使用任何更新的功能。

方案3:使用--advertise-addr参数

在您的情况下,还需要在docker join命令中使用--advertise-addr参数来指定广播地址。您之前遇到的错误可能是因为广播地址不正确导致的。例如:

“`shell
docker swarm join –token SWMTKN-1-27hz

正文完