【问题标题】:How to give individual containers a unique hostname within a single pod in Kubernetes?如何在 Kubernetes 的单个 pod 中为单个容器提供唯一的主机名?
【发布时间】:2021-04-11 01:13:04
【问题描述】:

我创建了 15 台包含相同机器学习程序的服务器。但是,每个服务器在运行时都有不同的参数。它由主机名决定。每台服务器还有一个 5 个 1gb 的 pkl 文件的副本,其中包含训练数据。

例如,我现在在云中创建了 15 台服务器,名称如下。

ml-node-1
ml-node-2
ml-node-3
..
ml-node-15

所以当我的程序在ml-node-1 上运行时,它看起来像这样,python3 mlscript.py $HOSTNAME.csv,它将运行python3 mlscript.py ml-node-1.csv。每台服务器都将运行为其主机名指定的脚本。

我的问题是我必须在每台服务器运行之前创建 15 个 5gb pkl 数据的副本。我发现这非常低效且成本高昂,因此我正在寻找 Kubernetes 作为解决方案。从文档中,我可以看到 pod 中的容器可以共享一个持久卷。这样我也许可以减少复制 5gb pkl 数据 15 次。

但是,我试图弄清楚服务器/容器的命名。我认为我需要 1 个具有共享持久卷和 15 个容器的 pod。根据我从文档中了解到的https://kubernetes.io/docs/concepts/containers/container-environment/,Pod 中的所有容器都将共享相同的主机名。

如何区分它们并为它们指定特定的主机名,以便我仍然可以在每个容器中运行不同的参数?我的 docker 镜像是带有我的机器学习脚本的标准 debian 镜像。

【问题讨论】:

  • 在 Kubernetes 等可扩展的多主机环境中,使用主机名可能不是最佳选择。
  • @KlausD。有什么建议 ?我以前从未使用过这个,所以我不知道从哪里开始。
  • 有一个input 目录,其中包含可供容器拾取的可用文件,它们重命名并分配给自己(可能使用随机生成的密钥)- 可以拾取任何未分配的文件通过容器进行处理。这样,您可以根据需要在 k8s 中上下扩展您的环境(如果您需要更多节点/pod),并让容器处理多个文件,因为它们仍然可用。
  • 这将是您在 mlscript.py 文件中编写的代码,它会在启动时生成一个唯一的密钥,并监视一个目录以根据需要从中获取文件(您也可以使用消息队列,但现在这可能是过度工程)。 python 代码将永远运行,完成后不会退出 - 实际上是让您配置一个处理文件的处理器集群,并且可以通过 k8s 进行扩展。
  • 不,Google Cloud Storage 将成为 Google 的对象存储替代品(我的真正意思是,不是块存储 - 抱歉!)

标签: python docker kubernetes debian google-kubernetes-engine


【解决方案1】:

与其依赖自定义主机名来实现像 Kubernetes 这样的可扩展多主机环境(它的设计初衷是不允许这样做),不如作为一种更可行的解决方案(suggested by MatsLindh),您可以在您的mlscript.py 在启动时生成一个唯一的随机密钥,然后在一个连续循环中监视 input 目录的更改:此目录将包含要由不同容器拾取的可用文件,脚本将重命名给定文件在将生成的密钥分配给容器中正在运行的服务器实例时使用生成的密钥,“未分配”文件(不包含名称中具有相同格式的密钥)被认为可用于其他实例。

这将允许您从 Kubernetes 向上或向下扩展工作负载,并让同一个容器实例处理多个文件。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2019-01-17
    • 2017-08-25
    • 2020-12-28
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多