Openwhisk 如何决定创建多少个运行时容器?

How does Openwhisk decide how many runtime containers to create?

我正在处理一个使用 Openwhisk 的项目。我在 Google 云上创建了一个具有 5 个节点的 Kubernetes 集群,并在其上安装了 OW。我的无服务器功能是用 Java 编写的。它根据我传递给它的参数进行一些处理。处理最多可以持续 30 秒,我在这 30 秒内多次调用该函数,这意味着我想创建更多数量的运行时容器 (pods),而不必等待上一次调用完成。理想情况下,每次调用都应该有一个容器,直到资源完成。

现在,当我开始调用该函数时,会创建第一个容器,然后在几秒钟后创建另一个容器来为前两次调用提供服务。从那时起,我继续调用该函数(同时调用不超过 5 个)但没有启动任何容器。然后,过了一段时间,创建了第三个容器,有时但很少会创建第四个容器,但只有在很长时间后才会创建。 更奇怪的是,容器都在单个集群节点上启动,有时在两个节点上启动(总是相同的两个节点)。 其他节点没有使用。我已经仔细设置了集群。每个节点都被标记为调用者。我已经尝试尝试分配给每个容器的内存、最大容器数,我已经增加了每分钟可以进行的最大调用次数,但尽管如此,我还是无法增加创建的容器数量。此外,我尝试过使用不同的机器用于集群(不同数量的内核和内存)但这是徒劳的。

由于 Openwhisk 仍然是一个相对年轻的项目,不幸的是我没有从官方文档中获得足够的信息。有人可以解释一下 Openwhisk 如何决定何时启动一个新容器吗?我可以在 values.yaml 中更改哪些参数以获得更多的容器?

OpenWhisk 调度程序实现了多种启发式方法来将调用映射到容器。 Markus Thömmes 的 post https://medium.com/openwhisk/squeezing-the-milliseconds-how-to-make-serverless-platforms-blazing-fast-aea0e9951bd0 解释了容器重用和缓存的工作原理,并且可能适用于您所看到的内容。

当您检查实验中调用的激活记录时,检查激活记录上的注释以确定请求是 "warm" 还是 "cold"。温暖意味着容器被重新用于新的调用。冷意味着一个容器被新分配来为调用服务。

请参阅此文档 https://github.com/apache/openwhisk/blob/master/docs/annotations.md#annotations-specific-to-activations,其中解释了 waitTimeinitTime 的含义。当后者装饰注释时,激活是 "cold" 意味着分配了一个新容器。

您的激活率可能没有快到足以触发新的容器分配。也就是说,调度程序决定将您的请求分配给上一个调用已完成并可以接受新请求的调用程序。如果没有关于到达率或思考时间的更多详细信息,则无法更准确地回答您的问题。

最后,OpenWhisk 是一个成熟的无服务器函数平台。它自 2016 年以来一直作为 IBM Cloud Functions 投入生产,现在为多个 public 无服务器产品提供支持,包括 Adob​​e I/O Runtime 和 Naver Lambda 服务等。

创建的容器很少的原因是工作节点没有 Docker Java 运行时映像,并且需要在第一个这个环境是的每个节点上下载它要求。此图像有几百 MB,需要时间下载(在 google 集群中需要几秒钟)。我不知道为什么 Openwhisk 控制器决定等待已经创建的 pods 可用,而不是在其他节点上下载图像。无论如何,一旦我在每个节点上手动下载了图像,使用具有相同请求率的相同应用程序,就会为每个现有 pod 无法提供的请求创建一个新 pod。