微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

安排 docker 镜像在集群上执行

如何解决安排 docker 镜像在集群上执行

让我们假设我们在私有存储库中有一些预定义的 docker 镜像集。它们中的每一个都采用一组卷,其中传递输入数据。每个图像都是一种作业 - 它们代表一个应用程序,它接受输入、计算结果,然后将其作为文件或其他东西返回。

目前,当用户想要运行作业时,我可以在底层调用 docker run -v ... [image] 等。在底层,因为一切都在某个 REST 服务器 API 下。 但是,如果我想在集群上安排这些图像怎么办?为简单起见,我们假设一个图像可以在一台机器上执行,但在未来,我希望有一个选项可以将它调度到多台机器上。

例如,现在我们有一个包含机器 A、B 和 C 的集群,用户 1 调用图像 x,并且它被调度到机器 A,然后同一个用户调度图像 y 并被调度到机器 B(或A 或 C 取决于他们的负载),另一个用户使用不同的输入数据(因此是卷)调用图像 x 并且它在机器 A(或 B 或 C - 取决于他们的负载;图像和机器之间没有依赖关系,或图片)。

我可以用什么来实现这一目标? Kubernetes 可以管理它吗?到目前为止,看着豆荚我认为它不能。也许只是一个负载平衡器就足够了?想采用最简单但可扩展且高效的解决方案。

解决方法

Kubernetes 作业包含一个 pod 模板规范,因此您只需要向 PodSpec 添加一个带有 requiredDuringSchedulingRequiredDuringExecution 的反关联规则,其中排除选择器将是您在 PodSpec 上设置的标签。

示例:

apiVersion: batch/v1
kind: Job
metadata:
  name: stackoverflow
spec:
  template:
    metadata:
      labels:
        foo: bar
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingRequiredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: foo
                operator: In
                values:
                - bar
            topologyKey: "kubernetes.io/hostname"

docs 中的更多详细信息

,

这也可以使用 docker swarm 和一些逻辑调度来实现。 Here 是为非常相似的用例开发的 Python docker 调度库。

它使用一个资源列表来定义群中的主机,一个用于逻辑资源管理的 redis DB,以及每个预期图像应该在哪里找到它的输入和写入它的输出的静态输入映射。然后,每个“作业”都会被赋予一个 uuid,该 uuid 将传递给图像入口点,并且图像入口点会在挂载上创建一个输出目录,以将其唯一的输出写入其中。您可以在此上下文中查看示例“作业”here,其中入口点使用来自作业启动器的信息。

为作业挂载输入和输出卷,并作为 swarm 服务执行。请注意,调度程序可以配置为以几种不同的方式进行调度,但默认情况下应该是 SINGLE_NODE 这应该允许多个作业(最多为资源列表中设置的进程数)在每个主机上同时运行。

它已实现为异步 websocket 服务 here,而运行此服务的 docker 服务为 here

Kube 有一些原生的方法来处理一些类似的批处理调度,但我还没有彻底探索这些。 DMOD 项目专注于全自动堆栈中分布式处理的批处理调度,但非分布式批处理调度是这项工作的结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。