无法从挂起状态恢复Docker Swarm

3

发生了崩溃,现在出现了这个问题,显示docker swarm状态为待定,节点状态为未知。这是我的docker info结果。

swarm@swarm-manager-1:~$ docker info
Containers: 270
 Running: 0
 Paused: 0
 Stopped: 270
Images: 160
Server Version: 1.12.2
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 1211
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: host bridge null overlay
Swarm: pending
 NodeID: d9hq8wzz6skh9pzrxzhbckm97
 Is Manager: true
 ClusterID: 5zgab5w50qgvvep35eqcbote2
 Managers: 1
 Nodes: 2
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot Interval: 10000
  Heartbeat Tick: 1
  Election Tick: 3
 Dispatcher:
  Heartbeat Period: 5 seconds
 CA Configuration:
  Expiry Duration: 3 months
 Node Address: HIDDEN
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-91-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 6.804 GiB
Name: swarm-manager-1
ID: AXPO:VFSV:TDT3:6X7Y:QNAO:OZJN:U23R:V5S2:FU33:WUNI:CRPK:2E2C
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Insecure Registries:
 127.0.0.0/8

这是我的 Docker 节点列表结果:
ID                           HOSTNAME         STATUS   AVAILABILITY  MANAGER STATUS
9tlo3rg7tuc23xzc3am28lak1    swarm-worker-1   Unknown  Active        
d9hq8wzz6skh9pzrxzhbckm97 *  swarm-manager-1  Unknown  Active        Leader

我尝试重新启动Docker引擎和虚拟机,但没有任何帮助。实际上,系统正在运行,因为当我在工作节点上输入docker ps命令时,它会显示所有容器,但在管理节点上却没有任何内容显示。您有任何想法吗?
2个回答

0

不必一次性重新建立整个集群,你可以尝试逐个移除和重新添加每个节点 - 这样做的好处是集群状态不会被破坏,在较大的集群中,服务可以在修复过程中继续运行。然而,当你没有足够数量的管理节点时,这个过程会变得更加复杂。

首先,记下节点的ID(我将在这里称之为$WORKER_ID和$MANAGER_ID)。

在管理节点上:

docker node update --availability drain $WORKER_ID

^ 这是可选的,但在与群集上的实时服务一起工作时,这是一个好习惯。

docker swarm join-token manager

^ 这个命令将会给你一个在每个节点上运行的连接命令,当节点被移除后。我将在下面称之为 $JOIN_COMMAND。一旦管理者重新加入,我们将降级这个工作节点。

在工作节点上:

docker swarm leave
$JOIN_COMMAND

这个节点现在已经重新加入作为管理者,但是为了避免混淆,我将继续称其为“工作者”。

在管理者上:

docker node rm $WORKER_ID
docker node update --availability drain $MANAGER_ID
docker swarm leave -f
$JOIN_COMMAND
docker node rm $MANAGER_ID
docker node ls

找到工人的新ID(注意主机名,而不是角色)-> $NEW_WORKER_ID
docker node demote $NEW_WORKER_ID

你的集群应该被刷新了 - 如果有更多的节点,当你排空每个节点时,运行在每个节点上的服务会迁移到整个集群。

如果仍然不起作用(无论如何),你真的应该考虑升级到docker v17.06或更新版本。在此之前,Swarm网络非常不稳定,导致了很多由竞争条件引起的问题。


0
根据我的经验,解决类似问题的唯一方法是销毁Swarm。当你这样做时,你可能还应该执行docker system prune(仅在没有可删除的有价值内容时),然后执行service docker restart。然后重新设置一个新的Swarm。
这真糟糕,我知道。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接