解决 Docker Swarm 集群节点故障:从问题剖析到修复实战

解决 Docker Swarm 集群节点故障:从问题剖析到修复实战

在使用 Docker Swarm 构建容器编排集群时,可能会遭遇各种难题。本文将分享一次处理 Docker Swarm 集群节点故障的实战经历,涵盖问题出现的缘由、详细剖析以及完整的解决步骤,助力大家应对类似困境。

一、故障背景

我所管理的 Docker Swarm 集群由三个节点构成,分别是 ts3ts4 以及 harbor 节点。起初,ts3 担任主管理节点(Leader),肩负着统筹集群的重任;ts4作为可到达的管理节点(Reachable),辅助 ts3 维持集群的稳定运行;harbor 节点则作为工作节点,默默承担着各类容器任务的执行工作。整个集群各司其职,有序运转。

角色 IP hostname
Manager1 172.16.10.110 ts3
Manager2 172.16.10.111 ts4
Worker1 172.16.10.120 harbor

二、问题爆发

然而,平静的表象下暗流涌动。一次在 ts3 节点的操作,如同投入湖面的巨石,激起千层浪。

当我在 ts3 节点输入 docker swarm leave 指令,满心期望进行节点调整时,系统却给出严厉警告:

bash 复制代码
Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing this node leaves 1 managers out of 2. Without a Raft quorum your swarm will be inaccessible. The only way to restore a swarm that has lost consensus is to reinitialize it with '--force-new-cluster'. Use '--force' to suppress this message.

这一报错背后,隐藏着 Docker Swarm 集群的核心运行机制 ------Raft 一致性算法。该算法为保障集群的可靠性与数据一致性,要求集群中多数(即超过一半)的管理节点时刻保持在线状态。在当前集群架构下,共有两个管理节点,若 ts3 贸然离开,剩余管理节点数量将低于半数,Raft quorum 被打破,集群必将陷入混乱,无法正常提供服务。

但我当时并未充分领悟这一警告的深意,错误地选择强行执行 docker swarm leave --force 命令。瞬间, ts3 节点强硬地脱离了集群。紧接着,当我在 ts4 节点尝试执行 docker node ls ,期望查看节点状态以评估局势时,新的报错又接踵而至:

bash 复制代码
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.

此刻,问题已然清晰明了。由于ts3的强制离开,集群内管理节点数量锐减,无法满足 Raft 算法的苛刻要求。ts4作为硕果仅存的管理节点,在失去同伴的支撑后,无法独自确定集群领导权,致使整个集群的管理层面陷入瘫痪,连最基本的节点管理操作都无法开展。

三、修复之旅

(一)重新初始化集群核心:ts4 节点的担当

面对如此严峻的局面,我迅速冷静下来,着手在 ts4 节点展开修复行动。首要任务便是执行 docker swarm init --force-new-cluster 命令,此命令的重要性不言而喻,它能够强制 ts4 节点摒弃原有混乱的集群关联,重新建立一个全新的、以它为唯一管理节点的集群,为后续的修复工作搭建起稳定的基石。

执行该命令后,系统反馈关键信息:

bash 复制代码
Swarm initialized: current node (eitl9c0yyuizhy84lzrdlr56v) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4988kvb923xv8xpymmkqbgket37b4wg2mueujcetis0f2mq1ly-9vm9dwxq8jl59gap5aszkeohq 172.16.10.111:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

这表明 ts4 节点已然成功 "登基",成为新集群的核心领导者,集群初步恢复了单点管理能力,为后续召回其他节点奠定了基础。

(二)召回 "叛将":ts3 节点重新入网

仅有 ts4 孤掌难鸣,为重塑集群原有的高可用性,将 ts3 节点重新纳入麾下势在必行。

  1. 首先,在 ts4 节点执行 docker swarm join-token manager 命令,获取添加管理节点所需的令牌和连接信息,得到类似如下格式的命令:

    bashh 复制代码
    docker swarm join --token SWMTKN-1-4988kvb923xv8xpymmkqbgket37b4wg2mueujcetis0f2mq1ly-e369ql9o0mom51vw80bi8j6w2 172.16.10.111:2377

    此信息如同连接 ts3 与集群的桥梁,至关重要。

  2. 接着,在 ts3 节点执行上述获取到的命令,成功将 ts3 以管理节点身份重新融入集群。不过,此时一个小插曲悄然出现,当在 ts4 节点执行 docker node ls 查看节点状态时,发现ts3出现了两个条目,一个状态为 Down ,一个为 ReadyMANAGER STATUSReachable 。这是由于 ts3 旧的节点信息尚未完全清除,新加入的信息又已生成,两者并存导致了这一混乱局面。

(三)清理冗余:重塑节点信息

为恢复节点信息的清爽与准确,果断在ts4节点(作为当前集群的有效管理者)执行以下操作:

  1. 通过 docker node ls 命令仔细查找 ts3 旧节点的 ID,假设为 oenfkuqg01ezrqb22866o7v2a
  2. 执行 docker node rm oenfkuqg01ezrqb22866o7v2a 命令,清理掉ts3的旧节点记录。

再次执行 docker node ls ,此时集群节点状态终于回归正轨:

shell 复制代码
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
p0iv5a6339hiybx7pplzs1t32     harbor     Ready     Active                          24.0.7
ql0ttka2k8noden0hs1ilagy9     ts3        Ready     Active         Reachable        26.1.4
eitl9c0yyuizhy84lzrdlr56v *   ts4        Ready     Active         Leader           26.1.4

至此,历经波折,Docker Swarm 集群成功恢复如初,重新稳定高效地运行起来,各项容器编排任务得以顺畅执行。

总结此次经历,在 Docker Swarm 集群管理过程中,管理节点的操作务必慎之又慎。务必深入理解 Raft 一致性算法背后对节点数量的严格要求,一旦遭遇类似问题,严格按照上述步骤冷静排查、精准修复,便能从容化解危机,确保集群持续高效运行。

相关推荐
孔令飞6 分钟前
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
ai·云原生·容器·golang·kubernetes
极简网络科技2 小时前
Docker、Wsl 打包迁移环境
运维·docker·容器
杨浦老苏2 小时前
轻量级Docker管理工具Docker Switchboard
运维·docker·群晖
江湖有缘2 小时前
【Docker管理工具】部署Docker可视化管理面板Dpanel
运维·docker·容器
一加一等于二2 小时前
docker部署postgresql17,并且安装插件
docker·postgresql
猫咪老师19954 小时前
多系统一键打包docker compose下所有镜像并且使用
java·docker·容器
aitav04 小时前
⚡️ Linux Docker 基本命令参数详解
linux·运维·docker
Nazi64 小时前
docker数据管理
运维·docker·容器
姓刘的哦5 小时前
ubuntu中使用docker
linux·ubuntu·docker
孔令飞7 小时前
Go 为何天生适合云原生?
ai·云原生·容器·golang·kubernetes