Docker 容器中的自动缩放

Posted

技术标签:

【中文标题】Docker 容器中的自动缩放【英文标题】:AutoScaling in Docker Containers 【发布时间】:2017-03-10 23:15:47 【问题描述】:

我研究 Docker 容器化已经有一段时间了,但仍然有一些事情让我感到困惑。我知道所有容器都被分组到一个集群中,并且可以使用 Docker Swarm、DC/OS、Kubernetes 或 Rancher 等集群管理工具来管理 docker 容器。我一直在使用 DC/OS 和 Kubernetes 测试容器集群管理,但仍有一些问题没有得到解答。

容器级别的自动缩放如何帮助我们在生产服务器中使用? 应用程序如何为来自多个容器的流量提供服务?

假设我们已经使用容器部署了一个 Web 应用程序并且它们已经自动缩放。流量如何流向容器?如何管理会话?

为自动缩放容器计算哪些指标?

【问题讨论】:

【参考方案1】:

DC/OS 中的自动缩放(注意:Mesosphere 是公司,DC/OS 是开源项目)自动缩放在docs 中有详细描述。与 Kubernetes 基本相同,您可以使用 CPU 利用率等低级指标来决定何时增加应用程序实例的数量,也可以使用应用程序吞吐量等更高级别的指标,例如使用 Microscaling 方法。

关于路由如何工作(如何将请求转发到实例,即单个容器运行)的问题:您需要一个负载均衡器,DC/OS 为您提供了开箱即用的功能。同样,docs 中详细列出了这些选项,主要是:基于 HAProxy 的南北向或基于 IPtables 的东西向(集群内部)负载平衡器。

【讨论】:

在 DC/OS 的情况下,最常见的入站 LB 是 Marathon-LB,它有一个自动缩放示例:github.com/mesosphere/marathon-lb & github.com/mesosphere/marathon-lb-autoscale【参考方案2】:

Kubernetes 有一个名为service 的概念。 Kubernetes 服务是一种抽象,它定义了一组逻辑 Pod 和访问它们的策略。 Kubernetes 使用服务来服务来自多个容器的流量。您可以阅读有关服务的更多信息here。

AFAIK,会话在 kubernetes 之外进行管理,但是可以通过将 service.spec.sessionAffinity 设置为“ClientIP”来选择基于 Client-IP 的会话亲和性。您可以阅读更多关于服务和会话亲和性here

多个指标(如 cpu 和内存)可用于自动缩放容器。有一个很好的 blog,您可以阅读有关自动缩放、何时以及如何进行的信息。

【讨论】:

来自所提供博客的有用信息。我完全了解如何设置 kubernetes 集群以及所有...我的问题是多个容器如何使用单个服务来处理来自多个用户的请求?它如何平衡负载以及服务如何识别哪个会话与哪个容器粘在一起?它在实时生产应用程序中的用途。 同一部分中有图片 - kubernetes.io/docs/user-guide/services/… - 你看到了吗,服务可以像负载均衡器一样工作。 是的,这解释了一部分......但是这些服务是如何维护的?路线配置和所有...关于 Mesosphere 的任何想法? 这不是一个简单的问题。就典型服务而言,当前的实现基于 iptables。通常会有一个随机概率匹配,但如果您添加sessionAffinity:ClientIP,则会使用recent 模块添加新规则以保持相同的后端匹配。对于摄取流量,您可以使用 Ingress 和 IngressController,例如 contrib-nginx-ingress,它不通过 iptables,而是将端点直接添加到后端列表,因此以自己的方式处理诸如会话亲和性之类的事情

以上是关于Docker 容器中的自动缩放的主要内容,如果未能解决你的问题,请参考以下文章

自动缩放 Docker Swarm 服务

Azure 自动缩放和 Docker Swarm

在 AWS 中自动扩展 docker 容器

自动化集成:Pipeline整合Docker容器

docker容器自动启动及修改配置文件

docker运行mysql容器自动停止的问题解救方案如下