Kubernetes 使用自定义算法扩展 Pod

Posted

技术标签:

【中文标题】Kubernetes 使用自定义算法扩展 Pod【英文标题】:Kubernetes scaling pods using custom algorithm 【发布时间】:2018-10-14 08:09:21 【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

【参考方案1】:

支持 Jonah Benton 的回答:

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

我们的云应用由 3 个紧密耦合的 Docker 容器组成,Nginx、Web 和 Mongo。

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

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

目前我们在一台机器上运行这些容器。

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

一旦移动设备连接到工作节点,它必须继续只使用该机器(唯一 IP 地址)

现在,这是一个问题。您希望在 Kubernetes 上运行应用程序,但我认为您不了解这样做的后果:Kubernetes 会编排您的资源。这意味着它将在节点之间(如果有必要到同一个节点)移动 pod(通过杀死和重新创建)。它完全自主(非常棒,让你睡个好觉)节点故障并移动了您的 pod,该 pod 现在已消失,您的用户无法再连接。您需要利用 Kubernetes 中的负载平衡功能(服务)。只有他们能够处理 Kubernetes 集群中发生的动态变化。

使用 Kubernetes,我们将形成一个多容器 pod。

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

现在我告诉了你一些你认为错误的事情 - 如果我不提供一些关于如何使这项工作发挥作用的建议,我会是一个什么样的人:

在 Kubernetes 中,您的三个应用程序不应在一个 pod 中运行!它们应该在不同的 pod 中运行:

你的网络服务器工作应该由Ingress完成,既然你已经熟悉nginx,this is probably the ingress you are looking for! 您的 Web 应用程序应该是一个简单的 Deployment 并通过 Service 暴露于入口 您的数据库应该是一个单独的部署,您可以手动执行through a statefullset 或(more advanced) through an operator,也可以通过服务向 Web 应用程序公开

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

【讨论】:

【参考方案2】:

支持构建自定义调度器并同时运行多个调度器:

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

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

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

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

根据所提供的信息,很难理解为什么人们会使用 k8s 来处理这种工作负载,而不是仅仅在一些虚拟机上运行 docker 并编写一些自动化脚本。

【讨论】:

我同意,这个用例在技术上可以用 kubernetes 来实现——但价格是多少。另外-我认为您的应用程序架构不适合云(需要客户端连接到特定节点并不是在云提供的易变环境中工作的东西,在这种环境中,事情会被不可预测地移动、重新安排、终止)

以上是关于Kubernetes 使用自定义算法扩展 Pod的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes HPA(带有自定义指标)扩展策略

如何用 Kubernetes 自定义资源?

基于kubernetes调度框架的自定义调度器实现

基于kubernetes调度框架的自定义调度器实现

3 种扩展 Kubernetes 能力的方式 | Linux 中国

Kubernetes 自定义部署