【问题标题】:Scaling service in response to requests on Kubernetes扩展服务以响应 Kubernetes 上的请求
【发布时间】:2019-12-07 01:59:42
【问题描述】:

假设:

  1. 我有一个服务,它在启动时需要一个 id。

  2. 我希望每个服务进程在单独的 k8s pod 中运行。

  3. 我想在用户输入 id N 的地方放置一个 API 并作为响应:

    1. 如果 id N 的服务正在运行,我会将用户路由到它。

    2. 如果没有为 id N 运行服务,我会启动一个(即启动一个新 pod),然后将用户路由到那里。

我对 (3.2) 的一些想法:

  1. “路由器”服务使用 k8s api 直接启动新的 pod。这感觉不对,但也许不是?

  2. 没有正在运行的服务的传入请求进入队列,根据队列大小触发 pod 水平缩放,并让新服务从队列中取出 id。

我错过了一个可以帮助我的原语吗?在 kubernetes 上实现这个的最惯用的方法是什么?如果它完全相关,我将在 AKS 上运行所有这些。

【问题讨论】:

  • 我认为选项 1 是最好的选择。让路由器使用 id 命名约定创建 pod,并有一个脚本首先检查 pod 是否存在,如果不存在,则创建一个新 pod
  • 这听起来有点像您需要一个归零解决方案。查看 KNative - 它带来了无服务器原语,利用 Istio 来“保留”您的请求,直到出现处理您的请求的 pod。通过一些定制,我认为它可以满足您的需求。 OpenFaas/Fn 等其他无服务器解决方案也值得一试。

标签: kubernetes


【解决方案1】:

在我看来,阅读您的需求,就像您需要更多在 Kubernetes 之上的自己的 PaaS,而不是一种扩展服务。有几个现有的解决方案,例如检查'Deis Workflow'。

如果您真的打算从头开始创建这样的解决方案,我会使用 (1 & 2) 的概念证明,这是一个用于 Kubernetes 的包管理器工具,称为 helm,它适用于更高级别的抽象- 在单个“发布”中捆绑组成整个工作应用程序的 Kubernetes 资源:Pod、Service、Persistence Volume 等。

您可以将“发布”与“id”一视同仁。在 K8S 集群中未创建任何版本 = 您的服务被缩放为零。除了 'helm' 客户端工具外,您还可以轻松找到应用程序 URL(特定用户 ID 的目标路由)。使用 Kubernetes API client libraries 或直接通过 Kubernetes REST API 从 Kubernetes API 访问相同的信息,您的前端将使用 (3)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2020-07-30
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多