Uncloud 服务弹性伸缩实战:uc service scale 命令详解与滚动扩容原理

📅 发布时间:2026/9/17 18:23:53
Uncloud 服务弹性伸缩实战:uc service scale 命令详解与滚动扩容原理
Uncloud 服务弹性伸缩实战uc service scale 命令详解与滚动扩容原理【免费下载链接】uncloudA lightweight tool for deploying and managing containerised applications across a network of Docker hosts. Bridging the gap between Docker and Kubernetes ✨项目地址: https://gitcode.com/GitHub_Trending/unc/unclouduc service scale是 Uncloud 中用于调整复制型replicated服务副本数量的核心命令它把增减容器这一底层操作抽象为一次带计划预览、交互确认与滚动执行的部署流程。本文基于 CLI 参考文档与仓库源码完整讲解该命令的语法、选项、环境变量、交互与非交互两种使用场景并深入其底层实现——从副本检查、服务规格推导到滚动更新计划生成与执行帮助你安全地在线扩缩容集群服务。命令概览在 Uncloud 的集群模型中服务Service有两种运行模式replicated复制型默认与global全局型。复制型服务由用户显式指定副本数量Uncloud 负责把副本均匀调度到集群中的多台机器上uc service scale正是用来修改这一副本数量的命令。命令语法uc service scale SERVICE REPLICAS [flags]SERVICE目标服务的名称或 ID。命令支持 shell 自动补全输入时按Tab会从集群中拉取当前服务列表见 scale.go 中的ValidArgsFunction它调用completion.Services实现补全。REPLICAS目标副本数为非负十进制整数。源码中使用strconv.ParseUint(args[1], 10, 0)解析scale.go因此传入非法数值会直接报invalid number of replicas错误。命令选项-h, --help help for scale -y, --yes Auto-confirm scaling plan. Should be explicitly set when running non-interactively, e.g., in CI/CD pipelines. [$UNCLOUD_AUTO_CONFIRM]选项作用对应环境变量-h, --help显示帮助信息—-y, --yes跳过确认提示自动确认缩放计划非交互环境如 CI/CD必须显式设置UNCLOUD_AUTO_CONFIRM--yes与环境变量UNCLOUD_AUTO_CONFIRM是等价的在 scale.go 的PreRunE阶段命令会执行cli.BindEnvToFlag(cmd, yes, UNCLOUD_AUTO_CONFIRM)把环境变量绑定到该标志上。因此以下两种写法效果相同uc service scale my-app 5 --yes # 或 UNCLOUD_AUTO_CONFIRMtrue uc service scale my-app 5继承自父命令的全局选项scale是uc service的子命令注册位置见 service/root.go因此还继承以下全局连接选项--connect string Connect to a remote cluster machine without using the Uncloud configuration file. [$UNCLOUD_CONNECT] Format: [ssh://]userhost[:port], sshgo://userhost[:port], tcp://host:port, or unix:///path/to/uncloud.sock -c, --context string Name of the cluster context to use (default is the current context). [$UNCLOUD_CONTEXT] --uncloud-config string Path to the Uncloud configuration file. [$UNCLOUD_CONFIG] (default ~/.config/uncloud/config.yaml)全局选项说明环境变量--connect绕过 Uncloud 配置文件直连远端集群机器支持ssh://、sshgo://、tcp://、unix://四种格式UNCLOUD_CONNECT-c, --context指定要使用的集群上下文名称默认为当前上下文UNCLOUD_CONTEXT--uncloud-configUncloud 配置文件路径默认~/.config/uncloud/config.yamlUNCLOUD_CONFIG前置条件只有复制型服务可以被缩放uc service scale只能作用于复制型replicated服务。在服务规格定义中Mode字段只有两个合法值——replicated与global见 pkg/api/service.go 中的ServiceModeReplicated/ServiceModeGlobal常量。执行缩放时命令会先调用InspectService获取服务的当前状态并做模式校验scale.goif svc.Mode ! api.ServiceModeReplicated { return fmt.Errorf(scaling is only supported for services in %s mode, service %s is in %s mode, api.ServiceModeReplicated, svc.Name, svc.Mode) }即对global模式的服务执行uc service scale会直接报错。原因在于 global 服务的副本数不由用户指定而是每台可用机器上各运行一个容器由调度器根据机器数量自动决定。若需了解两种模式的取舍可参考 部署全局服务 中Global vs replicated mode一节的对比表。另一个值得注意的默认行为在ServiceSpec.SetDefaults()中复制型服务的Replicas若为空会被强制设为1pkg/api/service.go保证服务规格在创建时至少有一个副本。交互式缩放确认机制与计划预览uc service scale默认采用先预览、后确认、再执行的三段式交互流程。完整执行路径位于 scale.go 的scale函数连接集群并检查服务通过ConnectCluster建立与集群的连接再InspectService获取服务及其容器列表计算当前副本数currentReplicas : uint(len(svc.Containers))——当前副本数即服务在全部机器上运行的常规容器总数hook 容器不计入幂等短路若当前副本数已经等于目标副本数直接输出Service xxx already has N replicas. No changes required.并退出不会产生任何部署操作从现有容器推导服务规格取服务第一个容器的ServiceSpec作为规格基础scale.gospec : svc.Containers[0].Container.ServiceSpec spec.Replicas opts.replicas deployment : clusterClient.NewDeployment(spec, nil) plan, err : deployment.Plan(ctx)代码注释同时指出目前假设所有容器规格一致若某次部署中途失败导致容器规格不一致后续版本会提示用户选择以哪个容器为基准scale.go 中的 TODO。打印缩放计划plan.Format()渲染出带样式的服务级规格差异与容器操作树create / replace / remove 等操作plan.FormatSummary()则输出形如2 create · 3 remove · across 4 machines的摘要行实现见 pkg/client/deploy/deploy.go交互确认终端中弹出Proceed with scaling?确认提示若使用了--connect直连或存在多个上下文提示会带上目标信息如Proceed with scaling on context?避免在错误的集群上误操作scale.go执行确认后通过progress.RunWithTitle运行deployment.Run(ctx)标题显示Scaling service name (N → M replicas)在终端上呈现带进度的执行过程。非交互模式CI/CD在管道、脚本等没有终端的场景下交互确认无法进行。此时命令会直接失败并给出明确指引scale.gocannot ask to confirm scaling plan in non-interactive mode, use --yes flag or set UNCLOUD_AUTO_CONFIRMtrue to auto-confirm因此在 CI/CD 中应显式携带--yes或注入环境变量UNCLOUD_AUTO_CONFIRMtrue例如uc service scale my-app 8 --yes缩放计划的底层原理滚动策略与调度uc service scale并不直接逐个启停容器而是复用了 Uncloud 完整的部署引擎它把目标副本数写入服务规格交给Deployment生成计划并执行NewDeployment的实现在 pkg/client/deploy/deploy.go默认使用RollingStrategy滚动策略。副本调度均匀分布与约束过滤对复制型服务RollingStrategy.planReplicatedpkg/client/deploy/strategy.go按以下逻辑编排副本通过scheduler.NewServiceScheduler与EligibleMachines()过滤出满足全部放置约束placement constraints的机器pkg/client/deploy/scheduler/service.go用rand.Shuffle随机打乱机器顺序避免副本每次都堆积到同一批机器采用先复用已有且规格一致的容器、再按轮询round-robin把新副本摊到各台机器的策略目标副本数为 N 时循环i spec.Replicas把第 i 个副本分配到第i % len(matchedMachines)台机器上对规格不一致的旧容器生成ReplaceContainerOperation替换对多出来的容器生成RemoveContainerOperation移除。因此扩容时新增容器会尽量分散到不同机器上缩容时优先移除规格不符或多余的容器。计划中的每个操作都实现了统一的Operation接口并按顺序串行执行见 operation/sequence.go 的SequenceOperation。更新顺序start-first 与 stop-first替换容器时采用何种更新顺序由determineUpdateOrderpkg/client/deploy/strategy.go决定若规格中显式配置了deploy.update_config.order尊重该设置新旧容器存在主机端口冲突时必须stop-first先停旧容器释放端口单副本且挂载了数据卷时默认stop-first防止两个容器同时写同一卷导致数据损坏其余情况默认start-first先启新容器、后停旧容器尽量零停机。详细的滚动更新行为健康监控、失败回滚等可参考 滚动部署指南Uncloud 会逐个替换容器并在每个新容器启动后监控 5 秒可通过UNCLOUD_HEALTH_MONITOR_PERIOD调整确认健康后再处理下一个因此扩容/缩容过程对在线流量是平滑的。限制不支持缩容到零副本uc service scale明确禁止把副本数缩到0。源码在流程最前面就做了拦截scale.goif opts.replicas 0 { return fmt.Errorf( scaling to zero replicas is not supported. This would effectively remove the service without preserving its configuration, making it impossible to scale back up. Uncloud derives the service configuration from existing containers. Use uc rm %s instead if you want to remove the service, opts.service, ) }设计原因是Uncloud 的服务配置是从现有容器的ServiceSpec推导出来的。若把副本缩到 0所有承载规格的容器都会消失服务配置将无法找回也就无法再缩回去。因此临时下线服务使用uc service stop保留容器与配置彻底删除服务使用uc service rm会删除所有副本容器见 pkg/client/service.go 的RemoveService它会并行停止并移除该服务的全部常规容器与 hook 容器。常见报错速查场景报错信息处理方式副本数填 0scaling to zero replicas is not supported...改用uc service rm删除或用uc service stop临时停止对 global 服务缩放scaling is only supported for services in replicated mode...确认服务模式global 服务副本由机器数量决定副本数非数字invalid number of replicas: ...传入合法的十进制整数非交互环境未确认cannot ask to confirm scaling plan in non-interactive mode...加--yes或设UNCLOUD_AUTO_CONFIRMtrue服务不存在inspect service name: ...先用uc service ls确认服务名/ID确认时选择取消Scaling cancelled. No changes were made.无副作用可重新执行相关命令与文档uc service scale属于uc service命令族与之配套的常用命令还有uc service ls列出集群中的服务及其当前副本数与模式uc service inspect查看服务与容器的详细状态uc service run创建服务可通过--replicas指定初始副本数uc service start / uc service stop启停服务uc service rm删除服务缩容到 0 的替代方案滚动部署指南理解缩放过程中容器替换、健康监控与回滚的完整机制。此外通过 Compose 部署 创建的服务同样可以在deploy.replicas中声明副本数而uc service scale则为运行中的服务提供了无需重新部署即可在线调整副本数量的快捷途径。【免费下载链接】uncloudA lightweight tool for deploying and managing containerised applications across a network of Docker hosts. Bridging the gap between Docker and Kubernetes ✨项目地址: https://gitcode.com/GitHub_Trending/unc/uncloud创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考