Kubernetes 缩放 pods 使用自定义算法

Kubernetes scaling pods using custom algorithm

我们的云应用程序由 3 个紧密耦合的 Docker 容器、Nginx、Web 和 Mongo 组成。目前我们 运行 这些容器在一台机器上。然而,随着我们的用户不断增加,我们正在寻找可扩展的解决方案。使用 Kubernetes,我们将形成一个多容器 pod。如果我们要复制,我们需要将所有 3 个容器作为一个单元进行复制。我们的云应用程序由移动应用程序用户使用。我们的应用程序每个工作节点只能处理大约 30000 个用户,我们打算在单个工作节点上放置一个 pod。一旦移动设备连接到工作节点,它必须继续只使用该机器(唯一 IP 地址)

我们计划使用 Kubernetes 来管理容器。负载平衡不适用于我们的用例,因为移动设备在分配后需要绑定到一台机器,并且每个 Pod 都独立地使用自己的持久卷。但是,如果用户数量超过 30000 等等,我们需要一种在工作节点上启动新 Pods 的方法。

想法是我们有某种自定义调度程序,它根据节点上的用户数量为移动设备分配一个工作节点(域/IP 地址)。

Kubernetes 是否适合这种设计?我们如何实现自定义 Pod 规模算法。

谢谢

支持同时构建自定义调度程序和运行多个调度程序:

https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/

也就是说,对于 kubernetes 是否适合这种设计的问题,我的回答是:不完全是。

K8s 可能难以操作,其回报是它为整个 类 工作负载提供开箱即用的自动化和弹性水平。

此工作负载不是其中之一。为了获得任何好处,您必须编写一个调度程序来处理此应用程序具有的边缘故障和错误情况(当您在短时间内丢失节点时会发生什么......)以一种对 k8s 有意义的方式.而且你必须跟上正常的 k8s 操作的速度。

根据所提供的信息,很难理解为什么人们会在某些 VM 上仅 运行 docker 将 k8s 用于此工作负载并编写一些自动化脚本。

搭载 Jonah Benton 的回答:

虽然这在技术上是可行的 - 但您的问题不在于 Kubernetes,而在于您的应用程序!让我指出问题所在:

Our cloud application consists of 3 tightly coupled Docker containers, Nginx, Web, and Mongo.

这是您的第一个问题:您是否只能将这三个容器部署在一起而不是独立部署 - 您无法扩展其中一个! 虽然 MongoDB 可以扩展到疯狂的负载 - 如果它与您的网络服务器和网络应用程序捆绑在一起,它将无法...

因此,您的第一步是拆分这三个组件,以便可以相互独立地管理它们。下一篇:

Currently we run these containers on a single machine.

虽然不是严格意义上的问题 - 我非常怀疑扩展您的应用程序意味着什么以及可扩展性带来的挑战!

Once a mobile device is connected to worker node it must continue to only use that machine ( unique IP address )

现在,这是个问题。您正在寻找 运行 Kubernetes 上的应用程序,但我认为您不了解这样做的后果:Kubernetes 会协调您的资源。这意味着它将在节点之间移动 pods(通过杀死和重新创建)(如果需要,移动到同一节点)。它完全自主(这太棒了,让你睡个好觉)如果你依赖于坚持单一节点 IP 的客户端,你将在半夜起床,因为 Kubernetes 试图纠正节点故障并移动了您的 pod,该 pod 现在已经消失,您的用户无法再连接。您需要利用 Kubernetes 中的负载平衡功能(服务)。只有他们能够处理 Kubernetes 集群中发生的动态变化。

Using Kubernetes we would form a multi container pod.

我们还有另一个赢家 - 不!您正在尝试将 Kubernetes 视为您的本地基础设施!如果你继续这样做,你将失败并在此过程中诅咒 Kubernetes!

既然我告诉了你一些你认为错误的事情 - 如果我不提供一些关于如何使这项工作的建议,我会成为什么样的人:

在 Kubernetes 中,您的三个应用程序不应该 运行 在一个 pod 中!他们应该 运行 分开 pods:

如果您还有其他问题,欢迎随时提问!