多线程代码上的 Kubernetes 工作负载扩展

Kla*_*Nji 2 multithreading docker kubernetes

开始使用 Kubernetes 所以有以下问题:

假设一个微服务具有以下 C# 代码片段:

   var tasks = _componentBuilders.Select(b =>
    {
       return Task.Factory.StartNew(() =>  b.SetReference(context, typedModel));
    });

    Task.WaitAll(tasks.ToArray());
Run Code Online (Sandbox Code Playgroud)

在我的机器上,我知道每个线程都在 vCPU 上执行。因此,如果我有 4 个启用超线程的核心,我将能够同时执行 8 个任务。因此,如果我有大约 50000 个任务,大约需要

(50,000/8) * approximate time per task 
Run Code Online (Sandbox Code Playgroud)

来完成这项工作。这忽略了上下文切换等。

现在,转移到云并假设此代码位于由 Kubernetes 部署管理的 docker 容器中,并且每个虚拟机都有一个 docker 容器以保持简单。上述代码如何在部署中的虚拟机之间水平扩展?找不到对此非常明确的指导,因此如果有人有任何参考资料,那将会有所帮助。

Dav*_*aze 5

您通常会使用 Kubernetes Deployment 对象来部署应用程序代码。它有一个replicas:设置,可以启动一些相同的一次性 Pod。每个Pod都有一个容器,每个Pod将独立运行您上面引用的代码块。

这里的挑战是在 Pod 之间分配工作。如果每个 Pod 生成自己的 50,000 个工作项,它们都将执行相同的工作,并且事情不会发生得更快。仅在 Kubernetes 中运行应用程序并不能为您提供任何在 Pod 之间共享线程池或任务队列的预构建方法。

这里的典型方法是使用作业队列系统;RabbitMQ是一种流行的开源选项。系统的一部分生成任务并将其写入 RabbitMQ。一名或多名工作人员从队列中读取作业并运行它们。您可以自行设置并演示它,而无需使用容器技术,然后将其重新打包到 Docker 或 Kubernetes 中,只需在部署时更改 RabbitMQ 代理地址即可。

在这种设置中,我可能会让工作人员连续运行作业,一次一个,没有线程。这将简化工作人员的实施。如果你想并行运行更多的作业,就运行更多的worker;在 Kubernetes 中,增加部署replica:计数。