【问题标题】:Can't recover docker swarm from pending state无法从待处理状态恢复 docker swarm
【发布时间】:2017-09-22 13:53:56
【问题描述】:

发生了崩溃,我现在遇到了这个问题,它说 docker swarm 状态为待处理且节点状态为 UNKNOWN。这是我的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 node ls 结果:

ID                           HOSTNAME         STATUS   AVAILABILITY  MANAGER STATUS
9tlo3rg7tuc23xzc3am28lak1    swarm-worker-1   Unknown  Active        
d9hq8wzz6skh9pzrxzhbckm97 *  swarm-manager-1  Unknown  Active        Leader

我尝试重新启动 docker 引擎和虚拟机,但没有任何帮助。当我在工作人员中说docker ps 时,系统实际上正在运行,它显示了所有容器,但在管理器上,docker ps 上什么也没有。

有什么想法吗?

【问题讨论】:

    标签: docker virtual-machine containers docker-swarm


    【解决方案1】:

    根据我使用 Swarm 的经验,解决类似问题的唯一方法是摧毁 Swarm。当你这样做时,你可能还应该做一个docker system prune(只有在没有任何有价值的东西可以删除的情况下)和service docker restart。然后建立一个新的群体。

    这很糟糕。我知道

    【讨论】:

      【解决方案2】:

      您可以尝试一次删除并重新添加每个节点,而不是一次重建整个集群 - 这样做的好处是集群状态不会被破坏,并且在更大的集群上,服务可以在您修复它时继续。但是,当您没有法定人数的经理时,此过程要复杂得多。

      首先,记下节点 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
      

      查找worker的新id(注意主机名,而不是角色)-> $NEW_WORKER_ID

      docker node demote $NEW_WORKER_ID
      

      您的 swarm 应该被刷新 - 如果有更多节点,当您耗尽每个节点时,运行在每个节点上的服务会迁移到整个 swarm。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-21
        • 2018-03-31
        • 1970-01-01
        • 2021-10-12
        • 2018-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多