尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Docker Swarm负载均衡与自动扩缩容实战:从路由网格到生产级高可用

发布时间:2026/9/29 15:25:28

资讯中心
01
ARTICLE

Docker Swarm负载均衡与自动扩缩容实战:从路由网格到生产级高可用

Docker Swarm负载均衡与自动扩缩容实战:从路由网格到生产级高可用
1. 先从Swarm的负载均衡说起做容器集群的人几乎都绕不过Docker Swarm。原因很简单——它不用额外装编排组件docker init就能把三台机器变成集群对中小团队来说想快速搞定容器调度和流量分发Swarm其实是起步成本最低的那条路。但真的把服务跑起来之后很多人会卡在同一个问题上集群部署好了服务也在上面跑了可流量一上来为什么有的节点忙到冒烟有的节点闲得发慌更头疼的是半夜流量大涨人不在电脑前服务扛不住直接雪崩。这两个问题恰恰对应Swarm集群里最核心的两个能力——负载均衡和自动扩展。先说结论Swarm自带一套非常聪明的流量分发机制叫Routing Mesh路由网格它和Service副本数配合起来可以让你的服务天然具备水平扩展的底座。而自动扩展Autoscaling虽然有第三方方案但这套东西的底层逻辑、指标来源、以及和负载均衡的配合方式才是这篇文章真正想讲清楚的东西。很多教程会告诉你“用docker service scale”就能扩缩容但这只是手动操作离真正的自动扩展还差十万八千里。一个可用的自动扩展方案必须解决三个问题拿什么指标来判断需要扩容、谁来触发这个判断、以及触发了之后怎么平滑地调整副本数而不影响在线流量。这篇文章就以这三件事为线索把Docker Swarm的负载均衡机制、自动扩展的几种常见做法、以及我在生产环境里实际踩过的坑一次说透。2. 6分钟搞懂Swarm的路由网格和Ingress负载均衡2.1 Routing Mesh到底做了什么很多人对Swarm负载均衡的理解停留在“集群里会有个负载均衡器把请求分发到不同节点”这个理解方向没问题但Swarm的做法和传统硬件LB、Nginx那套完全不是一个路子。Swarm采用的是内置的Ingress网络配合服务发现机制。你在创建服务的时候如果指定了--publish 8080:80Swarm会在集群里的每一台节点上都监听8080端口。也就是说无论你请求的是manager节点还是worker节点的IP只要带上8080端口Swarm都能把请求接下来然后转发到实际运行着任务的节点上的容器里。这个机制就是Routing Mesh它的核心是一个轻量级的iptables规则和Ingress overlay网络的组合。具体流程如下请求到达集群任意节点的8080端口节点上的IPVS规则接管数据包判断请求应该交给哪个Service通过Ingress overlay网络把请求转发到运行着该服务容器的节点如果同一节点上就有多个副本则由节点的负载均衡逻辑在副本间分发看起来有点绕但用生活类比就好理解了Routing Mesh就像一家连锁餐厅的中央订餐电话你不管打给哪个分店接电话的人都会把订单协调到有厨师的那家分店去做。每个分店节点都知道全城所有分店的情况这就是服务发现的作用。提示Ingress网络在Swarm集群初始化之后是自动创建的默认所有发布端口的服务都会接入这个网络。你可以用docker network ls看到一个名为ingress的overlay网络。2.2 VIP模式和DNS轮询模式对自动扩展的影响Swarm负载均衡其实有两种模式很多人第一次接触会忽略它们的区别但如果你要做自动扩展这个区别值得搞清楚。默认情况下Swarm会为每个Service创建一条虚拟IPVIPInress负载均衡会基于这个VIP把请求分发给后端的多个副本。这个模式的优点是你拿到的始终是一个稳定IP后端副本增减对客户端完全透明。缺点嘛——每个Service会占用一个VIP你docker service ls能看到它但如果你的服务特别多VIP会占用不少内存和IP资源。另一种模式是DNS轮询DNSRR你在创建服务时指定--endpoint-mode dnsrrSwarm就不再分配VIP而是让DNS解析请求时直接返回多个容器IP客户端自己选择连哪个。这个模式的优点是没有集中式负载均衡的性能损耗但缺点是客户端必须支持DNS轮询而且副本变化之后客户端可能因为DNS缓存感知不到新IP。我实际测试过两种模式在自动扩展下的表现用VIP模式时副本从3个扩到10个客户端完全无感知因为请求都是先到VIP再由内核转发用DNSRR模式时如果客户端的DNS缓存时间设置得比较长扩展之后新副本要过很久才能接到流量。所以在自动扩展的场景下我强烈建议用默认的VIP模式省掉一整套缓存刷新问题。2.3 service update和service scale的负载均衡差异还有一个容易忽略的细节扩容时用docker service update和docker service scale有什么区别其实底层做的是同一件事——修改服务的副本数配置。但docker service scale相当于直接把副本数设为目标值而docker service update还可以带上别的更新参数。比如# 直接扩容 docker service scale myapp_web10 # 用update的方式扩容同时指定更新的并行度 docker service update --replicas 10 --update-parallelism 2 --update-delay 5s myapp_web注意后面这种方式在扩容的同时它还告诉Swarm每次并行启动2个副本每批间隔5秒。在Service的副本数不变的情况下这只是影响滚动更新的节奏但在扩容场景下如果你一次性把副本数从3提到20容器镜像拉取、资源调度、网络连接建立这些动作会同时爆发很可能导致节点瞬间过载。而限流式的扩容往往比暴力扩容在推线上时更稳。3. 自动伸缩实现思路从手动脚本到指标驱动3.1 Docker原生没有autoscaling你得自己造轮子直接说结论直到我写这篇文章的时间点Docker Swarm原生没有内置基于CPU、内存或请求数来自动调整副本数的功能。Kubernetes的HPAHorizontal Pod Autoscaler干的事在Swarm里你需要自己用脚本或者第三方工具补齐。但这不意味着Swarm做不了自动扩展。Swarm的API是完整的你可以用Docker SDK或直接调HTTP API来实现副本数的动态调整。核心思路就三步采集监控指标CPU、内存、请求数、队列长度等根据规则判断是否需要扩缩容调用Docker API修改服务的副本数可能有人会说这不就是个脚本嘛这么想也没错。但要做一个能在生产环境长期跑、不把集群搞崩的自动扩展脚本需要考虑的细节比想象中多得多比如防止频繁抖动、区分扩容和缩容的阈值、以及缩容时如何优雅地摘除流量。3.2 先用手动脚本打通自动扩缩容主流程在引入任何重量级工具之前我建议先自己写一个最小可用的自动扩缩容脚本。这一步的价值在于把整个流程跑通搞清楚监控数据怎么获取API怎么调用以及副本变化之后服务怎么平滑过渡。下面这个例子用的是Python Docker SDK读取某个服务的平均CPU使用率超过阈值就扩容import docker import time client docker.from_env() service_name myapp_web max_replicas 10 min_replicas 2 while True: # 获取service的当前副本数 service client.services.get(service_name) current_replicas service.attrs[Spec][Mode][Replicated][Replicas] # 获取CPU监控指标这里假设你已经有一个函数metric_avg_cpu()返回0-100的值 cpu_avg metric_avg_cpu(service_name) print(f当前副本数: {current_replicas}, 平均CPU: {cpu_avg}%) if cpu_avg 80 and current_replicas max_replicas: print(fCPU超过80%扩容到{current_replicas 1}副本) service.scale(current_replicas 1) elif cpu_avg 30 and current_replicas min_replicas: print(fCPU低于30%缩容到{current_replicas - 1}副本) # 注意这里调用了scale但设置了更新延迟 service.scale(current_replicas - 1) time.sleep(30)这个脚本虽然简陋但已经能跑通主流程了。真正要落到生产环境你还需要考虑几个问题指标怎么采集、谁来监控监控器本身挂了没有、以及并发请求下多个脚本同时操作同一个服务时的并发冲突。这些问题放到第四部分统一说。3.3 一个相对可用的实施模板ServiceMonitor Autoscaler有了上面的基础我分享一下我在实际项目中用过的相对完整的自动扩展方案它由三块组成指标采集cAdvisor、指标存储Prometheus、自动扩展执行器自定义脚本或Swarm Autoscaler工具。组件职责拆分如下组件职责部署方式cAdvisor采集每个容器的CPU、内存使用率以Global模式部署每个节点跑一个Prometheus聚合指标提供查询API以Replicated模式部署在集群内Autoscaler脚本定时查询指标调用Docker API调整副本数以Replicated模式部署1个实例cAdvisor在Swarm上的部署命令可以参考docker service create \ --name cadvisor \ --mode global \ --publish 8081:8080 \ --mount typebind,src/var/run/docker.sock,dst/var/run/docker.sock \ --mount typebind,src/sys,dst/sys,ro \ --mount typebind,src/var/lib/docker,dst/var/lib/docker,ro \ gcr.io/cadvisor/cadvisor:v0.47.0注意这里用的--mode global意味着每个节点上都会运行一个cAdvisor实例这样Prometheus才能收集到所有节点上容器的性能数据。用--publish直接映射端口是为方便调试生产环境建议把端口暴露限制在管理网络内。Prometheus的配置和使用方式网上资料很多这里就不展开了它在这个体系中的核心作用是提供统一的时间序列查询接口让自动扩展脚本不用关心数据从哪个节点来。4. 生产环境自动扩缩容的实操要点与避坑指南4.1 CPU指标在容器世界里的“伪精确”问题做自动扩展最容易踩的坑就是直接把容器的CPU使用率当成决策依据。我在生产环境里遇到过一种情况某个Java服务把堆内存设置得非常大JVM频繁做垃圾回收CPU使用率长期在70%~85%之间震荡。自动扩展脚本每30秒检查一次经常一会儿扩、一会儿缩服务副本数像心电图一样一跳一跳的。解决这个问题的关键是过滤波动业内常用的是移动平均值或者指数加权移动平均。通俗解释就是只看最近5分钟的平均值而不是某一刻的瞬时值。比如Prometheus里的表达式avg(rate(container_cpu_usage_seconds_total{name~myapp_web}[5m])) * 100[5m]这个时间窗口就是核心它让决策基于5分钟的平均趋势。由此带来的副作用是反应速度变慢但这在绝大多数业务场景中是值得的。记住这个原则自动扩缩容的容忍度设定原则是“宁可慢半拍不要原地抖”。一次多余扩容的浪费远小于服务雪崩的损失。4.2 缩容比扩容危险得多自动扩容的脚本大家都会写但真正让我在生产环境吃过亏的是自动缩容。举个例子业务高峰期过去CPU降下来了脚本触发缩容副本从10个减到2个。看似正常但如果这2个副本只是CPU闲、内存却处在高位呢或者说流量重新上涨的速度远快于脚本的轮询周期呢这时候你缩掉的副本正好是下一波流量冲击时需要的那部分。一个比较稳妥的做法是给缩容设定更低的触发阈值和更长的观察窗口。比如扩容阈值是85%缩容阈值就设到30%并且要求CPU在30%以下持续至少10分钟才执行缩容。这个不对称的设计是很多生产系统的通用做法。我在实操中还加了一条保护缩容后至少等待5分钟才能再次执行缩容防止连续误判。另外缩容时要注意服务本身的优雅退出机制。Swarm在停止容器之前会发送SIGTERM信号如果你的应用没有处理这个信号、或者处理太慢正在处理的请求就会被粗暴掐断。在服务规格里设置--stop-grace-period 30s给进程30秒的宽限期完成善后工作这对Java这种有JVM退出钩子、或者需要反注册的服务类型尤其重要。4.3 自动扩展和滚动更新的冲突处理多人在同一个Swarm集群上干活时最容易出现的诡异现象是运维在发布新版本自动扩展脚本却在同一时间因为负载升高而扩容。两个操作同时在改服务配置可能导致其中一个操作因为版本冲突而报错。我在生产环境里遇到过docker service scale之后服务版本被回退到旧版本的问题就是这个原因。解决办法有两种第一种在自动扩展脚本里加锁机制。用Redis或者其他共享存储记录当前是否有更新操作在进行有就不执行扩缩容。第二种使用Docker API的--replicas参数配合docker service update --replicas N时先用docker service inspect检查当前服务的版本号再基于这个版本号执行更新。虽然麻烦但能显著降低并发冲突概率。我现在更倾向的做法是把自动扩展和执行更新放到同一个CI/CD的流程里更新发布时自动暂停自动扩展任务发布完成后再恢复。毕竟这个行业里最怕的不是慢而是不可预期。5. 第三方面板观测、故障转移与Swarm链路补全5.1 用自研或开源工具管理Swarm服务状态网上常看到有人问“Swarm需不需要装Kubesphere那样的可视化面板”这个问题本身其实暗示了一个误区不是集群工具不行而是管理方式太原始。Swarm虽然没有K8s那么庞大的生态工具集但用来实时查看服务的副本状态、负载情况、历史故障还是有趁手工具的。比如Portainer这是我用下来最顺手的Swarm面板。它可以看到每个服务的副本分布情况、容器日志、甚至直接在里面修改副本数。部署方式很简单docker service create \ --name portainer \ --publish 9000:9000 \ --constraint node.role manager \ --mount typebind,src/var/run/docker.sock,dst/var/run/docker.sock \ portainer/portainer-ce:latest \ -H unix:///var/run/docker.sockPortainer在我项目里的角色是给团队里不熟悉命令行的人用的观察窗口。真正被自动扩展脚本驱动的服务还是靠API控制两套体系各司其职。这样即使脚本出了问题还有人工兜底的入口。提示Portainer的-H unix:///var/run/docker.sock参数意味着它直接连本机的Docker守护进程。部署时必须用--constraint node.role manager把Portainer固定在管理节点上否则Swarm不会把它的调度到指定的节点你连不上它管理的那台机器的Docker API。5.2 Swarm的故障转移能力与自动扩展的配合聊自动扩展绕不开集群故障转移这个配套能力。Swarm本身有节点故障的自动恢复机制一个worker节点宕机后Swarm会把该节点上运行的容器重新调度到其他健康的节点上。这个能力在集群运维里非常关键尤其是在缩容场景。比如你缩容之前有5个副本分布在5个节点上如果已经缩到2个这两个副本恰好在同一台机器上这台机器挂了服务就全挂了。所以在做自动缩容的时候还有一条隐含策略Swarm的调度器会尽量把副本分散在不同的节点上。这是Swarm默认的行为方式叫做Spread策略它会尽量平均地把容器分散到各个节点。基于这个特性我建议配置服务时设置--placement-pref spreadnode.labels.az把可用区AZ作为一个维度来分散副本。这样即使某个可用区的节点全挂了其他可用区还有副本能顶上。这就是所谓的集群高可用设计。自动扩展解决的是“活得够不够多”的问题故障转移解决的是“活下来的扛不扛得住”的问题两个机制叠加才算是一个完整的容器服务生命周期管理方案。5.3 从Swarm到Kubernetes的丝滑迁移路径文章标题带了“集群”这个热词很多搜到这篇文章的读者其实是K8s背景的。我明确说一下如果你已经在Swarm上把负载均衡、自动扩展、故障转移这套东西玩熟了迁移到Kubernetes并不是从零开始。相反很多概念在两边是能对应上的Docker SwarmKubernetes对应关系Service VIPService ClusterIP都是集群内的服务发现与负载均衡Replicated ModeDeployment都是多副本控制器手动scalekubectl scale扩缩容操作自写自动扩展脚本HPAHorizontalPodAutoscalerKubernetes原生支持指标驱动扩缩容Routing Meshkube-proxy iptables/IPVS都是基于网络代理的流量转发搞明白Swarm的路由原理和工作负载概念再去看Kubernetes的kube-proxy和HPA上手速度会快很多。无论是用Swarm还是迁移K8s核心思想是相通的把无状态服务做成可水平扩展的、可靠复的、抗故障的单元。这才是容器编排和集群管理的本质。6. 完整方案落地一次从0到1的Swarm自动扩缩容实验如果你已经看到这里说明你想自己动手把整套东西跑起来。这个部分我梳理一个可复现的完整实操过程从集群初始化到自动扩展生效每一步都给出关键命令。6.1 初始化Swarm集群假设你有三台节点分别叫node1、node2、node3。先初始化管理节点# 在node1上执行 docker swarm init --advertise-addr 192.168.1.10初始化完成之后会输出一条docker swarm join命令在node2和node3上执行这条命令把他们加进集群。然后用docker node ls确认所有节点状态为Readydocker node ls6.2 部署一个带监控的目标服务我们创建一个带负载均衡测试的nginx服务docker service create \ --name demo_web \ --replicas 3 \ --publish 8080:80 \ --mount typebind,src/var/run/docker.sock,dst/var/run/docker.sock \ nginx:alpine同时用cAdvisor采集性能指标docker service create \ --name cadvisor \ --mode global \ --publish 8081:8080 \ --mount typebind,src/var/run/docker.sock,dst/var/run/docker.sock \ --mount typebind,src/sys,dst/sys,ro \ --mount typebind,src/var/lib/docker,dst/var/lib/docker,ro \ gcr.io/cadvisor/cadvisor:v0.47.06.3 用Prometheus聚合指标并打通查询注意Swarm集群里的Overlay网络有个特点服务和cAdvisor跑在不同节点上也要能互通。最简单的方式是把它们加入到同一个自定义网络然后在Prometheus配置里写好抓取规则。创建一个overlay网络docker network create --driver overlay --attachable monitoring把cAdvisor和Prometheus都接入这个网络docker service update --network-add monitoring demo_web docker service update --network-add monitoring cadvisor然后部署Prometheus这里用配置文件方式# prometheus.yml scrape_configs: - job_name: cadvisor static_configs: - targets: [cadvisor:8080]再用Swarm service把Prometheus跑起来docker service create \ --name prometheus \ --network monitoring \ --publish 9090:9090 \ --mount typebind,src/etc/prometheus/prometheus.yml,dst/etc/prometheus/prometheus.yml \ prom/prometheus:v2.45.06.4 写一个带平滑策略的自动扩展脚本到了最核心的执行环节。这里我把前面的脚本升级成带“冷却时间”和“双向阈值”的版本import docker import time import requests DELAY_SECONDS 30 COOLDOWN_SECONDS 300 # 距离上一次扩缩容至少要等5分钟 MAX_REPLICAS 10 MIN_REPLICAS 2 SCALE_UP_CPU 80.0 SCALE_DOWN_CPU 30.0 SERVICE_NAME demo_web client docker.from_env() last_scale_time 0 def get_avg_cpu(service_name): # 查询Prometheus获取最近5分钟该服务所有副本的平均CPU使用率 query (favg(rate(container_cpu_usage_seconds_total f{{name~{service_name}.*}}[5m])) * 100) resp requests.get(http://127.0.0.1:9090/api/v1/query, params{query: query}, timeout10) data resp.json() try: return float(data[data][result][0][value][1]) except (KeyError, IndexError): return 0.0 while True: cpu get_avg_cpu(SERVICE_NAME) service client.services.get(SERVICE_NAME) replicas service.attrs[Spec][Mode][Replicated][Replicas] now time.time() print(freplicas{replicas}, cpu_avg_5m{cpu:.2f}%) if now - last_scale_time COOLDOWN_SECONDS: print(冷却期内跳过本轮扩缩容) time.sleep(DELAY_SECONDS) continue if cpu SCALE_UP_CPU and replicas MAX_REPLICAS: print(f触发扩容: {replicas} - {replicas 1}) service.scale(replicas 1) last_scale_time now elif cpu SCALE_DOWN_CPU and replicas MIN_REPLICAS: print(f触发缩容: {replicas} - {replicas - 1}) service.scale(replicas - 1, ) last_scale_time now time.sleep(DELAY_SECONDS)这个脚本的核心改进有两个一是加了冷却时间避免短时间内的反复扩缩二是用5分钟平均CPU替代瞬时CPU避免抖动。这两条加起来才算是“可落地”的自动扩展脚本。6.5 压测验证自动扩展是否真的生效脚本跑起来之后用压测工具比如ab或者wrk验证一下wrk -t4 -c100 -d120s http://127.0.0.1:8080/观察脚本输出和docker service ps demo_web里的副本数变化正常情况下你应该能看到类似这样的输出replicas3, cpu_avg_5m55.20% replicas3, cpu_avg_5m68.90% replicas3, cpu_avg_5m81.30% 触发扩容: 3 - 4 replicas4, cpu_avg_5m62.40%压测停止后CPU降下来再等5分钟冷却期结束脚本会自动缩容。这套流程跑通之后你基本上就拥有一个最简陋但真实可用的Swarm自动扩缩容系统了。注意脚本运行在宿主机上需要配置DOCKER_HOST环境变量或把脚本放到和Docker守护进程相同的主机才能连上API。生产环境我建议把这个脚本也容器化部署固定在管理节点上跑。7. 实测踩坑记录自动扩缩容常见的5个经典问题7.1 副本缩到0怎么办很多人喜欢把缩容阈值设得很低希望“没流量的时候就别跑容器了”。听起来省钱但在Swarm里把副本缩到0是个危险操作——因为Swarm的docker service scale支持replicas0但这会让服务的VIP仍然存在却没有任何后端。此时所有请求都会被默默丢弃连一个连接错误都不会给你。更坑的是如果流量再起来脚本尝试把副本从0扩到1这其实还好。但如果你用的是某些第三方autoscaler工具它们可能根本不允许副本数设置为0。所以我的建议是缩容最小副本数不要低于2这是高可用的及格线。没了副本你的负载均衡就没有意义了。7.2 监控数据出现断崖式下降在一台节点宕机或者cAdvisor容器被重调度之后Prometheus里该节点的CPU数据会瞬间消失如果自动扩展脚本按“全集群平均值”来计算算出来的负载可能会瞬间跌到0然后触发缩容。这个问题是生产环境最隐蔽的坑。解决方法是缩容判定时增加“数据完整”检查。比如在PromQL里加count(container_cpu_usage_seconds_total) 0确保有指标才做缩容判断。这是我在生产环境学到的重要教训。7.3 大规模副本更新时API请求失败当集群规模大了自动扩展脚本一次性把副本数从5改成50Swarm管理节点要转发任务到各个worker节点。如果worker节点与管理节点的连接状态不好部分调度任务会失败命令直接报错。这种问题没有银弹最好提前在服务初始化时把--update-order start-first加上让服务先启动新副本再停掉旧副本整个过程对客户端更友好。同时在自动扩展脚本里要做API调用的重试避免一次网络抖动就让全流程中断。7.4 同一时刻多服务自动扩展的抢占问题如果你的集群里跑了多个不同的服务同时触发自动扩展它们会争夺节点资源。最典型的情况是两个服务同时扩容节点上的资源瞬间耗尽有一个服务会被调度到“Pending”状态始终起不来。解决方法是给自动扩展脚本加全局互斥锁或者给每个服务设置不同的扩展优先级。我常用的办法是按核心服务优先的顺序排列扩展动作比如先扩网关再扩后端服务。规则写死在配置里比脚本自动判断靠谱得多。7.5 Docker API的版本兼容问题最后提醒一个很细节的问题Docker API是分版本的。你本地的docker SDK版本如果和Swarm管理节点的API版本不匹配调用某些新接口会报“client version too new”或“too old”。尤其是你这边用最新版Python库而集群里的Docker引擎还是两三年前的版本。解决方法是显式指定API版本比如Docker SDK for Python里client docker.DockerClient(version1.41)这里的版本号要对齐Docker引擎一般是1.24到1.43之间。版本不兼容问题虽然不常出现但一旦出现就是极其难排查的“疑难杂症”提前指定版本能省掉大量排查时间。8. 从自动扩展再往前一步集群调度和容量规划聊到这里自动扩缩容和负载均衡本身的内容基本到尾声了。但我还想把视角再往上抬一层。自动扩展解决的其实是“软件层面如何应对流量变化”的问题但在真实的生产环境里还有一个更前置的问题集群本身有没有足够的容量去扩展如果集群总共只有32GB内存你的服务再怎么自动扩展也很难无中生有地扩容超过可用资源。所以在生产环境中我把自动扩展和集群容量监控配套使用。思路是通过cAdvisor采集所有节点的总负载和剩余资源做一张一目了然的容量表。当集群整体内存使用率超过80%时即使单个服务的CPU没有达到扩容阈值我也要考虑给集群加节点了。# 查看节点的资源分配情况 docker node ls docker node inspect node1 --pretty另一个常用视角是给节点打标签进行分组管理。比如给GPU节点打上gputrue的标签在服务创建时通过--constraint或者--placement-pref指定调度区间。这样自动扩展在增加副本时能把副本只调度到符合条件的节点组上避免无谓地往错误节点上放容器。9. 最后想说的我在实际项目里把Swarm的自动扩展跑稳定前前后后花了将近一个月。踩过副本数缩到0导致服务雪崩的坑也吃过冷却时间太短导致副本数反复横跳的亏。但这套经验最终沉淀下来其实就是那几条原则指标要看趋势别盯瞬时值、缩容要比扩容更谨慎、自动化和人工之间要留兜底入口。如果你正准备在生产环境搭建Swarm集群我建议按这个顺序推进先手动把服务和负载均衡跑通然后部署cAdvisor和Prometheus把指标看明白再写自动扩展脚本并加上冷却机制最后再考虑故障转移和容量告警。每一步走稳了Swarm这套集群方案足够你支撑相当体量的业务。别急着追新工具先把老工具用透往往是投入产出比最高的方式。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。