什么时候应该使用 Kubernetes Replication Controller 创建多个 docker 容器镜像实例?

When should you create more than one docker container image instance with Kubernetes Replication Controller?

当使用 Kubernetes 来管理您的 docker 容器时,特别是当使用复制控制器时,您什么时候应该将图像 运行 容器实例增加到 1 个以上?我知道 Kubernetes 可以根据复制控制器配置文件中的需要生成尽可能多的容器副本,但是当您可以增加计算 VM 大小时,为什么要生成多个 运行 容器(对于同一图像)。我想,当你需要更多的计算能力时,继续增加机器 CPU / ram 更高,然后只有当你达到允许的最大可用计算能力时,目前大约 32 个内核 Google,那么您将需要生成多个容器。

然而,无论 VM 大小如何生成多个容器似乎都可以提供更高可用性的服务,但即使在 1 个容器复制控制器环境中,Kubernetes 也会重新生成失败的容器。所以我想不通的是,出于什么原因我想要超过 1 个 运行 个容器(对于同一图像)而不是 运行 超出 VM 实例计算大小?

我觉得你把问题摆的很好。您描述的两种缩放称为 "vertical scaling"(增加内存或单个实例的 CPU)和 "horizontal scaling"(增加实例数)。

关于可用性:正如您所观察到的,由于自动重启(在节点级别或复制控制器级别),即使使用单个容器也可以实现相当好的可用性。但它永远不会是 100%,因为您总是会遇到与重启流程相关的停机时间,无论是在同一台机器上还是(如果机器出现故障)在新机器上。相比之下,水平扩展(运行 容器的多个副本)从最终用户的角度来看有效地允许 "zero downtime",假设您在副本之间有某种负载平衡或故障转移机制,并且您应用程序以允许复制的方式编写。

关于可伸缩性:这是高度依赖于应用程序的。例如,对于单线程应用程序,垂直扩展 CPU 不会增加它可以处理的工作负载,但 运行 它在负载平衡器后面的多个副本(水平扩展)会。另一方面,某些应用程序的编写方式不允许它们被复制,因此对于这些应用程序,垂直缩放是您唯一的选择。许多应用程序(尤其是 "cloud native" 应用程序)都适用于水平和垂直缩放,但细节取决于应用程序。请注意,一旦您需要扩展到超出单个节点可以处理的工作负载(由于 CPU 或内存),您别无选择,只能复制(水平扩展)。

所以对你的问题的简短回答是人们为了可用性和可扩展性而复制。

扩大或缩小应用程序的原因有多种。

Kubernetes 项目希望在未来提供自动缩放功能,以动态调整大小(可能为 0)复制控制器以响应观察到的流量。有关自动缩放的精彩讨论,请参阅以下文章:

https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/proposals/autoscaling.md