如何在 docker 群上配置自动缩放?

How to configure autoscaling on docker swarm?

我想知道如何配置此工具以从最小节点数开始并在需要时增加到最大节点数。

我应该使用其他工具还是 docker swarm 可以为我解决这个问题?

简答:目前还没有简单的方法用 Docker Swarm 做到这一点。

Docker Swarm(或Swarm模式)不支持开箱即用的auto-scaling机器。您需要使用另一种解决方案,例如 docker-machine 在您的基础设施上创建机器(使用 docker),并将这些机器 link 添加到现有的 Swarm 集群(使用 docker swarm join) .

这将涉及大量脚本,但我们的想法是监控集群的 CPU / 内存 / 网络使用情况(使用 topmonit),一旦超过一个阈值(比如总集群资源的 70%),你触发一个脚本调用 docker-machine 来扩展集群。使用相同的想法,您还可以通过 drainingremoving 节点(最好是 Agent 节点)从现有的 swarm 集群中缩小规模低于下限。

如果您想使用此标准,您需要确保正在监视持续的资源使用情况,否则您的基础设施会因资源使用情况的频繁和突然变化而产生和破坏节点。

您可以为集群中的机器定义一个下限和一个上限,以控制一切。

请注意,Swarm 需要至少 3 个 Manager 个节点(建议 5 个)来维护分布式共识算法的法定人数。因此,建议的最小下限是 5 个节点(您可以使用 Agent 个节点来扩展,因为服务正在逐渐使用资源)。

在某种程度上,您还可以看看Docker InfraKit or Terraform用于基础设施自动化健康监控

Update: There is now a promising cross-platform autoscaler that supports Swarm Mode task auto-scaling: Orbiter. Although still nothing out-of-the-box yet for service/machine autoscaling.

扩大规模非常容易。您可以在需要时继续调度容器。然后你只需创建一个脚本来查找挂起的容器并扩展集群。例如,如果您在 aws for swarm 上使用官方 CloudFormation 模板,您只需更改自动缩放组中所需的数字即可。示例迭代脚本可能如下所示:

services=$(docker service ls --format '{{.ID}}')
for service in $services; do
  tasks=$(docker service ps $service --format '{{.ID}}')
  for task in $tasks; do
    if docker inspect $task --format '{{.Status}}' | grep 'insufficient resources' 1>/dev/null; then
      scale-up-cmd
    fi
  done
done