扩缩

通过手动副本数量或基于资源使用的自动扩缩规则对应用进行水平扩展。

手动扩缩

最简单的扩缩方式是设置固定的副本数量。每个副本是运行你应用的相同容器。sh0 在所有健康副本间分发入站请求。

  1. 在控制台中导航到你的应用。
  2. 打开 设置 → 扩缩
  3. 副本数量 设置为你期望的数值。
  4. 点击 应用。sh0 将启动或销毁容器以匹配设置。
Manual scaling panel with replica count slider
Note
扩容几乎是即时的——新容器在几秒内启动。缩容会在停止容器前优雅地排空连接(默认 30 秒宽限期)。

自动扩缩规则

自动扩缩根据实时资源使用情况动态调整副本数量。当使用率超过阈值时,sh0 添加副本;当使用率下降时,减少副本。

Auto-scaling configuration with CPU and memory thresholds

CPU 阈值

设置目标 CPU 使用率百分比。当所有副本的平均 CPU 使用率在持续一段时间(默认 60 秒)内超过此阈值时,sh0 会添加新副本。

参数默认值描述
cpu_threshold70%触发扩容的 CPU 使用率百分比
scale_up_cooldown60s两次扩容事件之间的最短时间
scale_down_cooldown300s两次缩容事件之间的最短时间

内存阈值

与 CPU 类似,你可以设置内存使用率阈值。当平均内存使用率超过阈值时,sh0 进行扩容。这对于内存密集型应用(如 Node.js 或 Java 服务)特别有用。

Tip
大多数工作负载建议从基于 CPU 的扩缩开始。仅在应用为内存受限型时添加基于内存的扩缩。两者同时使用也可以——sh0 在任一阈值超出时进行扩容。

最小和最大副本数

自动扩缩在你定义的范围内运行:

  • 最小副本数:始终运行的最少容器数。设置为至少 1 以确保高可用性,或设置为 2 以实现零停机部署。
  • 最大副本数:扩容的上限。这可以防止失控的扩容耗尽所有服务器资源。
Scaling Configuration
{
  "min_replicas": 2,
  "max_replicas": 10,
  "cpu_threshold": 70,
  "memory_threshold": 80,
  "scale_up_cooldown_seconds": 60,
  "scale_down_cooldown_seconds": 300
}
Min and max replica settings in the scaling panel
Warning
在单台服务器上设置过高的最大副本数可能耗尽可用内存和 CPU,导致所有副本性能下降。请监控服务器资源并相应设置限制。

跨副本负载均衡

sh0 使用 Caddy 作为反向代理在副本间分发流量。负载均衡策略默认为轮询,确保请求均匀分配。

关键行为:

  • 健康检查:不健康的副本会自动从负载均衡池中移除。
  • 优雅排空:缩容时,在停止容器之前先排空现有连接。
  • 会话亲和性:默认未启用。如果你的应用需要粘性会话,请在应用设置中配置。
  • WebSocket 支持:WebSocket 连接在副本间正确代理和维护。
Load balancer dashboard showing traffic distribution across replicas

通过 API 扩缩

你可以通过 REST API 以编程方式管理扩缩。这对于 CI/CD 流水线或自定义自动化非常有用。

设置副本数量:

Terminal
curl -X PUT https://your-server:9000/api/apps/my-app/scaling \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"replicas": 4}'

配置自动扩缩:

Terminal
curl -X PUT https://your-server:9000/api/apps/my-app/scaling \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "auto_scaling": true,
    "min_replicas": 2,
    "max_replicas": 8,
    "cpu_threshold": 75,
    "memory_threshold": 85
  }'

获取当前扩缩状态:

Terminal
curl https://your-server:9000/api/apps/my-app/scaling \
  -H "Authorization: Bearer YOUR_TOKEN"

最佳实践

  • 使应用无状态:将会话存储在 Redis 或数据库中,而不是内存中。无状态应用可以轻松扩缩。
  • 设置资源限制:为每个容器定义 CPU 和内存限制,防止一个副本耗尽其他副本的资源。
  • 使用健康检查:配置健康检查端点,以便 sh0 可以自动检测和替换不健康的副本。
  • 最小副本数设为 2:这确保部署期间零停机(蓝绿模式)。
  • 先监控再扩缩:在设置自动扩缩阈值之前,使用指标控制台了解基线资源使用情况。
  • 测试缩容行为:确保你的应用正确处理优雅关闭(SIGTERM),以避免丢失请求。
Tip
对于多服务器设置,副本会自动分布在各节点上。详见多服务器指南中关于节点感知扩缩的内容。