资讯详情

资讯详情

Docker Swarm编排实战:从集群搭建到生产级应用

1. 为什么要学 Swarm掉进编排这个大坑之前先想明白先说一个我自己的经历。两三年前我用 Docker 管项目还是典型的“一台机器打天下”思路docker-compose up -d一把梭容器想开几个开几个数据库、后端、前端全堆在一台服务器上。刚开始小项目没啥问题后来接了仿真计算任务一台 1U 服务器顶不住第二台机器来了噩梦也就开始了。两台机器之间怎么协同第二台机器的服务怎么发现第一台机器的数据库服务扩容到 10 个副本流量怎么分流负载高了我怎么知道该扩哪台机器我试着用docker-compose配一个跨主机网络配了一晚上没搞定头都快秃了。这时候我把目光转向容器编排紧接着就看到两个名字Kubernetes 和 Docker Swarm。当时我身边一堆人讨论 Kubernetes觉得不会 K8s 就不算懂容器但 Swarm 反而被归类为“玩具”“快过时了”。后来我同时在两台测试环境里分别搭了 K8s 和 Swarm真正跑业务之后才意识到Docker Swarm 不是玩具它是那种“90% 的场景够用、配置简单到令人发指、维护成本低到离谱”的工具。本篇文章就来聊聊 Docker 进阶系列的第二个大主题Swarm 编排。这篇文章适合谁如果你已经能熟练使用docker run和docker-compose但还没接触过生产级容器调度如果你在犹豫 Kubernetes 和 Swarm 之间到底该学哪个如果你手头有 3 到 5 台服务器需要一个不劝退的集群方案。这篇文章就是为你准备的。我会把我在这条路上踩过的坑、摸索出来的命令、以及一些官方文档里不会写但你敢信就省时间的经验全部掏出来。先说结论Swarm 是 Docker 官方内置的容器编排方案它和 Docker 生态无缝融合能用几条命令就把多台 Docker 主机组成一个“逻辑上像一台电脑”的集群。你在这台虚拟“大电脑”上发布的容器服务它会自动帮你调度到空闲节点、自动做负载均衡、自动管理副本数、自动滚动更新。虽然它的功能丰富度不如 Kubernetes但它的上手复杂度、运维复杂度只有 Kubernetes 的十分之一。在我看来中小型项目、内部系统、个人生产的首选编排工具Swarm 当之无愧。2. 核心架构拆解Manager、Worker 和那个你以为“无所谓”的 Raft2.1 三句话讲明白整体设计Swarm 集群由两类节点组成管理节点Manager Node和工作节点Worker Node。管理节点就是“集群大脑”所有docker service命令都得打在管理节点上由它决定容器跑到哪台机器工作节点是“干活的手”只运行你发布出来的容器实例等着管理节点给它派任务。每个节点上Swarm 都会运行一个 agent 进程管理节点上多一个调度器组件。整个架构和公司组织很像老板Manager不亲自写代码只负责接单分活员工Worker不跟客户开会只管把活干完。而那个容易被人忽略的 Raft 一致性协议就是保证管理节点之间“说话算数”的关键。2.2 Manager 节点数量到底选几个单 Manager 会怎样不少新手拿到 Swarm 之后第一步就是docker swarm init默认创建 1 个 Manager然后把所有机器join进来。大哥这跟没上集群有什么区别管理节点是单点这机器挂了整个 Swarm 集群的调度能力就挂了虽然已有的容器服务还在跑但你想扩缩容、更新镜像、查看集群状态全部没门。生产环境里我建议管理节点至少 3 个原因是 Raft 算法的投票机制在 N 个管理节点的集群中至少要有(N/2)1个节点在线才能形成法定人数。3 个 Manager 可以容忍 1 个挂掉5 个 Manager 可以容忍 2 个挂掉。你可能会问为什么不能搞 2 个2 个 Manager 如果挂掉 1 个剩下 1 个不足法定人数整个集群会直接瘫痪反倒比单 Manager 更危险。所以要么只设置 1 个用在测试环境图省事要么就 3 个起步千万别取中间数。2.3 Raft 分担了什么服务状态和配置的“日志账本”Swarm 把集群里所有状态变更——哪个服务需要扩容、某节点状态是 Ready 还是 Down、服务更新到什么版本——全部记录在 Raft 日志里。这些日志在 Manager 节点之间同步复制多数管理节点确认后才会生效。实际运维里Raft 常被低估但如果你想做“花式操作”比如把一个 Manager 节点分离开来专门做监控这就涉及 Raft 的角色调整。有一个操作叫docker node demote可以把 Manager 降级为 Worker降级之后它会立即停止参与 Raft 投票。集群里 Manager 数量低于法定人数时你不能随便 demote否则整个集群自己就先把调度锁住了。我曾经在测试环境里只有 2 个 Manager一年轻小伙子手快把 1 个 Manager demote 了集群当场“脑裂”业务调用链瞬间全断。就在那天我深刻记住了法定人数这个数学要求。3. 实操开始从零搭建一个三节点 Swarm 集群3.1 准备阶段机器、版本与端口先明确实验环境。我自己用三台 Ubuntu 20.04 虚拟机模拟主机名分别叫 node1、node2、node3其中 node1 作为初始管理节点。每台机器上安装 Docker版本至少 20.10 以上。这里有个细节Docker Engine 自带 swarm 模式不需要额外装插件这是 Swarm 最大的优势之一开箱即用。Swarm 集群默认用到几个关键端口防火墙如果开了一定记得放行端口作用2377/tcp集群管理通信节点加入、Raft 同步都走它7946/tcp/udp节点间通信4789/udpVXLAN overlay 网络数据面很多第一次搭集群的人把命令敲完docker node ls就是看不到新节点排查半天发现是云厂商安全组没放开 7946 端口这种低级坑我踩过不止一次。对云厂商的控制台安全组和机器内部防火墙是两套系统两边都要检查。3.2 初始化集群一句话命令登录 node1执行docker swarm init --advertise-addr 192.168.1.11这里的--advertise-addr非常重要。它告诉其他节点“你要通过这个地址来找我”。如果你的机器有多个网卡例如一个公网网卡一个内网网卡不加这个参数 Swarm 可能会选错网卡导致其他节点根本无法与它握手。测试环境里我直接填 node1 的内网 IP。初始化成功后终端会输出一段docker swarm join --token token 192.168.1.11:2377。这个 token 是加入集群的凭证分两种一种是管理节点 token一种是工作节点 token。用docker swarm join-token worker可以单独查看工作节点的加入命令docker swarm join-token manager查看管理节点的。3.3 节点加入证书、加密与秒级完成登录 node2 和 node3分别执行刚才输出的 join 命令。如果要加入为 Manager就用 manager token 的命令。默认 Swarm init 后第一个节点既是 Manager 也是 Worker可以承担容器调度任务但我建议生产环境把 Manager 和 Worker 角色分离Manager 只干调度不跑业务容器这样资源争抢和故障影响都能隔离开。加入完成后回到 node1 上执行docker node ls你应该能看到三个节点状态都是 ReadyManager 一列中 node1 和 node2、node3如果加入的是 Manager都会是 Reachable 或 Leader。这里有个常见疑问为什么 Manager 节点的状态不是 Leader 而是 Reachable很简单Leader 只有一个是 Raft 选出来的主节点其他 Manager 都是 Reachable随时准备接替。3.4 标记节点角色和在业务中的实际用途节点加进来之后我喜欢立刻给它们打标签也就是node label。标签在服务调度时能做约束比如有些服务只允许跑在 SSD 节点上有些服务必须离数据库近。命令长这样docker node update --label-add typessd node2 docker node update --label-add typehdd node3然后在服务创建时加上约束docker service create \ --name nginx \ --constraint node.labels.typessd \ nginx:latest这个操作很像docker-compose里的deploy.placement.constraints但在 Swarm 里是集群维度的跨节点生效。我在某公司做数据服务时经常用标签把 CPU 密集型和内存密集型服务分开调度避免互相抢占资源非常实用。4. 服务部署把 docker-compose 改成 docker service 的思考转变4.1 服务是首选抽象容器只是它的实例使用 Swarm 之后你要转变一个思考习惯不再说“我要运行一个容器”而是说“我要发布一个服务”。服务Service是 Swarm 中的一等公民它描述了“我要多少个副本”“用什么镜像”“暴露哪些端口”“内存 CPU 限制是多少”然后 Swarm 负责确保现实世界始终与这个描述一致。如果某个节点宕机Swarm 会自动在别的节点上重新拉起丢失的副本不需要人肉干预。相比裸跑 Docker 容器这是质的飞跃。4.2 第一个服务发布 Nginx 并验证路由网格在 Manager 节点上执行docker service create \ --name web \ --publish published8080,target80 \ --replicas 3 \ nginx:1.25然后查看服务状态docker service ls docker service ps webdocker service ps web会显示 3 个副本以及它们分别被调度到了哪个节点。接下来是 Swarm 最让人满意的功能之一路由网格Routing Mesh。任何节点上的 8080 端口都能访问到这个服务哪怕那个节点上根本没有这个服务的副本。你在浏览器里分别访问三台机器的http://IP:8080都能得到 Nginx 的欢迎页。此举从根本上解决了“服务部署在某台机器用户应该访问哪台机器”的问题因为整个集群对外就是一个负载均衡器。路由网格的原理是Swarm 在集群内部维护了一个 ingress overlay 网络每个发布端口的服务都会挂到这个网络上集群内部所有节点都在监听这个端口流量进来后被转发到具体某个副本。你可以认为Swarm 自动帮你做了四层负载均衡。如果你需要七层 HTTP 反向代理再部署一个容器化的 Nginx 或 Traefik挂在路由网格前面就非常接近生产架构了。4.3 用 Stack 文件管理多服务Compose 文件直接起飞如果你已经习惯docker-compose管理多个容器Swarm 对你是极度友好的。你写的docker-compose.yml文件不需要大改把version保留去掉services下的container_name增加deploy字段然后执行docker stack deploy -c docker-compose.yml myappStack 是 Swarm 对多服务组合应用的管理单位一条命令即可创建或更新整个应用。我更倾向于把docker-compose.yml文件当作项目主配置让 Swarm 兼容这个格式因为它让团队协作型项目迁移到 Swarm 的成本几乎为零。比如我接过一个小型内部业务系统落地时直接把开发写的 Compose 文件拿过来在deploy里补上replicas: 2和update_config灌进 Swarm十分钟搞定代码不用改一行。4.4 secrets 配置把数据库密码从镜像里抠出来大部分新手很容易把数据库密码直接写在代码或环境变量里镜像一构建就泄漏了。Swarm 提供了 secrets 机制是 Docker 17.06 之后很亮眼的功能。创建方法echo MyDBPass123 | docker secret create db_password -然后服务里引用docker service create \ --name api \ --secret db_password \ --env DB_PASSWORD_FILE/run/secrets/db_password \ api:latestSecret 的存放位置是容器内的/run/secrets/Swarm 保证只有被授权的服务才能访问对应的 secret。生产环境里我一般把数据库密码、第三方 API Key、JWT 签名密钥统统放进 secrets比环境变量安全得多而且更新 secrets 时可以滚动重启服务不必重新构建镜像。这个小功能光是省下的镜像构建时间都值回票价了。5. 副本扩缩容与滚动更新生产环境最常用的两把刀5.1 手动扩缩容一条命令告别“流量来了手忙脚乱”业务流量上来了最简单的方式docker service scale web5对就是这样五秒完成扩容。Swarm 的调度器会看集群资源现状自动挑 2 台最空闲的机器启动新副本。反过来流量回落了缩容到 3docker service scale web3缩容时会先停掉一些健康副本具体停哪几个由调度器决定这个选择逻辑不是随机而是基于节点的资源指标和维护状态。实际经验不要在高峰期频繁修改副本数Swarm 的调度与路由网格同步需要几秒短时间内反复 scale 容易造成旧副本没销毁完成、新副本又启动的“抖动”在监控图上看到一条锯齿线吓到同事实际上是操作太勤。5.2 自动扩缩容未雨绸缪的进阶玩法Swarm 原生其实没有像 Kubernetes HPA 那样的自动伸缩组件但我们可以用docker service update结合外部监控脚本实现。我常用的思路是保留一个指标采集脚本每 30 秒查询一次服务平均 CPU 或请求延迟当超过阈值就调高--replicas低于阈值就调低。这里要特别提醒自动扩缩容脚本务必设置冷却时间Cooldown比如扩容操作后至少等待 5 分钟才允许下一次扩缩容。原因在于容器在节点上启动到能对外服务是需要时间的过于频繁的扩缩容不但不能缓解高峰反而会造成资源碎片。我自己写过一版没有冷却时间的脚本结果高峰期打满 CPU扩容指令疯狂下发新容器启动速度跟不上容器互相争抢服务反而雪崩后来加上冷却时间才好。5.3 滚动更新让业务不中断的关键设置镜像更新在 Swarm 里的标准操作是docker service update \ --image nginx:1.26 \ --update-delay 30s \ --update-parallelism 1 \ --update-failure-action rollback \ web这个命令的内涵值得好好解释--update-delay 30s每更新一个副本后等待 30 秒再更新下一个给新副本留出启动和自检的时间。--update-parallelism 1同时更新的副本数设为 1 就是一台一台换如果设为 5 就是一批一批换。业务量大的场景可以适度提高并行度但不要超过集群容量的 30%否则更新期间整个集群的负载能力会明显下降。--update-failure-action rollback更新过程中一旦发现新副本启动失败或健康检查不通过立刻回滚到旧版本这个参数我建议永远别去掉。滚动更新的原理是 Swarm 会为每个服务维持一个“期望状态”更新时它新建新版本的 Task等它在启动中变成 Running 并成功通过健康检查再销毁旧 Task。这也解释了为什么建议在服务里配置健康检查没有健康检查Swarm 只能靠进程是否退出判断容器死活只要你镜像里的进程活着就不能判定失败更新就会继续走下去如果内部存在明显 bug 而不退出进程就会把故障扩散到全部副本。命令示例docker service create \ --name api \ --health-cmd curl -f http://localhost/health || exit 1 \ --health-interval 10s \ --health-retries 3 \ --health-start-period 20s \ api:1.0这个健康检查配置相当于给 Swarm 一双“能看懂业务是否正常”的眼睛。--health-start-period千万别理解成“启动后等 20 秒再检查”它真正含义是在容器启动时留出初始化时间在这段时间内即使健康检查失败也不会立刻把容器标记为不健康。新手很容易把这种启动初始化时间算错导致新容器每次起来还没就绪就被打上不健康标签滚动更新必然反复回滚。6. 网络与存储overlay 网络和 persistent data 的实战选择6.1 overlay 网络跨主机的“魔法网线”Swarm 模式下最常用的网络类型是 overlay。创建方式docker network create -d overlay --attachable my-overlay--attachable允许独立的普通容器非 service也能挂到这个网络上在调试和临时工具容器时非常有用。不加这个参数普通的docker run --network my-overlay是跑不起来的会报网络找不到。Overlay 网络让不同机器上的容器互通 IP就像它们在同一个局域网里。后端服务只需要通过服务名相互访问比如 API 容器里连接数据库直接写mysql:3306不需要知道数据库跑在哪台机器上。这是 Swarm 内置 DNS 解析的功劳。6.2 路由的注意点对外端口别乱打Overlay 网络内部通信没问题对外访问则建议通过服务发布的端口来暴露。不要直接在容器里写死--network host这样既破坏了 Swarm 的调度灵活性又绕开了路由网格。我在生产环境里见过同事为了“省事”把数据库服务的端口 3306 直接发布到所有节点数据库的密码又是弱口令这台机器没多久就被扫端口尝试暴力破解。对外只暴露必要端口数据库这类服务建议只暴露给特定的 overlay 网络不要走到不安全的网络区域。6.3 持久化存储有状态服务在 Swarm 里的三副手铐无状态服务比如 Nginx、API 后端Swarm 管起来轻松。有状态服务比如 MySQL、Redis、MongoDB就需要认真考虑数据怎么存了。Swarm 提供三种持久化方案本地卷Local Volume数据存在某个节点的磁盘上调度器把副本固定到该节点。优点是简单缺点是数据只能活在那台机器上节点挂了数据就跟着物理隔离了。定义方式docker service create \ --name mysql \ --mount typevolume,sourcemysql-data,target/var/lib/mysql \ --constraint node.labels.typessd \ mysql:8NFS 共享存储把多台机器共用一个网络文件系统数据在集群里任何节点都能访问。方案是每个节点挂载同一个 NFS 目录然后docker service create \ --name mysql \ --mount typevolume,sourcenfs-data,target/var/lib/mysql \ --mount typebind,source/mnt/nfs/mysql,target/var/lib/mysql \ mysql:8注意记不住 NFS 和 bind 的具体格式没关系核心是 binding 了 NFS 的目标目录。NFS 方案适合中小规模缺点是 NFS 本身也是单点它的高可用需要再叠加一层方案。专门的存储驱动例如 Rook、Longhorn 之类能为 Swarm 提供真正的分布式块存储和复制能力。但这类方案配置复杂度陡增最完美的也不过是把 Kubernetes 的存储经验迁移回来。我的建议排序是单机小型项目用本地卷加节点约束多机数据可靠性要求高用 NFS要求极高再到 Rook别一上来就追求分布式存储的酷炫复杂度真的能吞掉你的周末。6.4 服务发现Swarm 内置的“电话簿”每个服务在创建时Swarm 都会为它分配一个虚拟 IPVIP并自动注册到内置 DNS。其他容器只要在同一个 overlay 网络上直接 ping 服务名就能解析到这个 VIP。VIP 背后对应着一组副本Swarm 会自动把请求负载均衡到这组副本上。举个例子一个叫api的服务有 3 个副本另一个worker服务的代码里访问http://api:8080它会命中这 3 个副本中的某一个。这个过程由 Swarm 内建的 mesh routing 完成不需要额外部署注册中心。如果你不喜欢 VIP 模式可以在服务创建时加--endpoint-mode dnsrr使用 DNS 轮询模式服务名解析会返回多个地址由客户端自己挑一个连接。大规模微服务场景可以用 dnsrr 减轻 VIP 的负载但大多数项目用默认的 VIP 就够了。7. 常见问题与排查技巧实录7.1 节点显示 Down 了怎么办排查顺序永远是从外到内先看物理节点状态ping 一下能通则机器没挂。再看 Docker 守护进程systemctl status docker。看 agent 和 manager 之间的连通性确认 2377 端口能通telnet manager-ip 2377。查看节点状态docker node ls。如果节点一会儿 Ready 一会儿 Down多半是网络抖动或者时钟不同步。对时钟不同步这个坑极大。Swarm 依赖 Raft 选主节点时间偏差太大会导致心跳超时节点反复上下线。我在公司服务器上特地挂了一个 NTP 定时同步任务从那之后节点 Down 的偶发问题基本消失。7.2 服务创建成功但始终显示 Pendingdocker service ps里如果显示New或Pending状态通常是调度器找不到合适的节点放置这个副本。原因无外乎三个节点资源不足docker node inspect node查看可用内存和 CPU。约束条件不匹配比如约束了node.labels.typessd但所有节点都没打这个标签。镜像拉取失败在目标节点上手动docker pull 镜像名测试一下有些私有镜像仓库的凭证没在所有节点上配置一旦副本被调度到没凭证的节点状态就一直卡在 Pending。7.3 路由网格访问间歇性失败访问发布端口时偶尔连接失败大概率是 ingress 网络出问题。优先检查 4789 端口的 UDP 是否放行。路由网格的数据平面走 UDP 4789很多云厂商安全组默认只放行 TCP这端口一漏数据面就乱。另外查看 ingress 网络是否存在docker network inspect ingress如果这个网络处于异常状态解决办法是先把所有服务停掉然后重启 docker 守护进程systemctl restart docker最后重新创建服务。这不是一个优雅的方案但在我实际经历里它 90% 能救回来。7.4 加入了集群但docker node ls看不到自己这种情况绝大多数是join的 token 不对或者 manager 节点在初始化后防火墙未放行 2377。还有一种可能是你用 manager token 加入但 manager 数量已经达到法定上限加入命令返回成功但实际并没有正式注册。解决方法是重新拉取 tokendocker swarm join-token manager然后在目标节点重新执行 join。7.5 服务更新回滚后还留有旧副本怎么办我遇到最头疼的问题是滚动更新失败回滚命令也执行了但旧副本数量没恢复总是在“New”和“Shutdown”之间反复横跳。后来发现是健康检查的 start-period 太长更新的失败检测周期跨度过大容器一直在被创建和杀掉。解决办法是把 start-period 调低到 5 到 10 秒同时调低 retries 到 2让失败判定快速收敛。8. 进阶调优与生产化建议8.1 将 Manager 节点“隔离”出来不让业务容器占用控制面生产环境里用docker node update --availability drain把管理节点的可调度性设为 drain让它不再接收业务副本。这样管理节点专门负责 Raft 协调和调度性能稳定核心控制面不受业务波动影响。注意docker node update --availability drain只能把该节点上的现有服务慢慢迁移走如果你临时需要把一台机器变成全封闭状态这个命令比直接踢出集群更体面。8.2 用 Compose 文件和 Swarm 的 services 配套管理配置写docker-compose.yml时强烈建议把deploy.resources.limits控制好。一个常见误区是服务没设 CPU 内存上限某副本内存泄漏把整台节点拖死Swarm 调度器也被迫把新副本调度到其他节点最终集群整体资源被拖垮。设限之后Swarm 会强制杀掉超限副本并尝试重新调度至少不会蔓延到整个节点deploy: resources: limits: cpus: 1.0 memory: 512M8.3 跨机房部署怎么办Swarm 是典型的单数据中心方案跨机房场景会有网络延迟和分区问题Raft 在这种网络下很容易抖动。我的建议是跨机房用多个独立 Swarm 集群上层加一层全局 DNS 或负载均衡器。别想着让一个 Swarm 集群横跨两个机房除非你能忍受某个机房网络抖一下整个集群调度全部瘫痪。8.4 监控与告警Swarm 集群必须有的“仪表盘”Swarm 本身没有自带 Web 管理界面也没有可视化监控面板。要想看到每个节点的资源占用、每个服务的运行状态我用得顺手的组合是 cAdvisor 加 Prometheus 加 Grafana。cAdvisor 负责在每台节点上收集容器指标Prometheus 负责抓取存储Grafana 负责画图。整套部署同样用 Swarm 服务方式跑起来把 Prometheus 和 Grafana 服务放在 overlay 网络上用标签约束它们落在指定节点调度问题也省心。如果真的不想部署这么大一套至少也要有docker events和docker service ps的定时巡检脚本。我最初的集群状态检查就是一段 5 行 Shell 脚本每 2 分钟检查一次docker service ps是否有异常状态一有问题立刻往群里发告警这已经足够撑起小型项目了。9. 我个人经验里 Swarm 最被低估的 3 个特性先声明我不是来吹 Swarm 的它的短板实在明显跨机房能力弱、持久化存储方案绕、大规模上千节点的场景远不如 Kubernetes。但在正向价值上这三个特性我觉得不光是够用而是“在某些场景下相当优秀”。第一多主机日志聚合。配合 Docker 的json-file日志驱动或者更上一层用gelf驱动把日志发送到统一日志平台Swarm 在多主机场景下不需要额外组件就能统一采集容器日志。每个服务实例产生的日志会自动聚合到日志平台按服务名、节点名可以精确过滤。Kubernetes 即使功能再丰富这个场景下也未必有什么显著优势。第二加密分布式集群状态。默认 Swarm 的整个集群管理通信和节点间数据面通信都是加密的节点证书自动轮换管理节点的敏感数据落盘也加密。如果不主动折腾证书体系新装的 Swarm 集群开箱就是加密传输。我见过不少公司连 HTTPS 都没上齐Swarm 这种默认安全的姿态挺省心的。第三服务滚动更新的可观测性。docker service ps输出里包含每个副本的当前状态、错误信息、更新历史过度复杂的环境里排查问题真的快。你不必像在 Kubernetes 里那样翻多个组件日志才能拼出发生了什么Swarm 会在一条命令里把所有生命周期告诉你。10. 写在最后我的建议与一点执念摸索容器编排那段时间我总被问“为什么不用 KubernetesSwarm 不是都没人用了吗”我向来不迷信热度只在乎项目管理成本、维护成本和能不能解决问题。中小规模的业务系统、公司内部工具、自建服务这些场景用 Swarm 完全没有问题团队里只要会 Docker 命令的人基本上一两个小时就能上手比我当时从零摸 Kubernetes 花了两周的时间强太多。但我也有个执念生产环境里再简单的技术也要按生产标准去对待。即便用了 Swarm你依然要给服务设置资源限制、校验健康检查、规划持久化存储、做好监控告警。容器编排不是终点它只是帮你把“部署机器、拉镜像、起容器、观察状态、处理故障”这些重复劳动自动化的一层工具。工具可以选简单的那一个但工程纪律不能因为工具简单就省掉。如果你读到这里正准备去搭第一个 Swarm 集群我的建议是直接用三台虚拟机部署一个有状态服务和一个无状态服务配上健康检查和滚动更新亲手把节点下线再上线看它怎么自动恢复。这个过程之后你会对“编排”这两个字有真实的身体记忆。踩过几个坑才能真正理解为什么管理者要操心节点数量、端口和调度策略也才能在工作中用自己的判断力选择适合的工具而不是被热度推着走。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →