【问题标题】:Does Kubernetes provide a colocated Job container?Kubernetes 是否提供托管作业容器?
【发布时间】:2017-02-06 12:46:36
【问题描述】:

我想知道如何在不提供服务而是提供作业/批处理工作负载的 Deployment 中的 Pod 中实现托管辅助容器?

我的问题的背景是,我想部署一个可扩展的服务,每个实例在启动后都需要配置。此配置是通过 HTTP POST 到其本地托管服务实例完成的。我为此实现了一个辅助容器,以便从托管功能中受益。所以辅助容器总是知道需要配置哪个实例。

问题是,restartPolicy 需要在 Pod 级别定义。我正在寻找类似服务的重启策略always 和配置作业的不同重启策略onFailure

我知道 k8s 为此类工作负载提供了 Job 资源。但是是否可以选择将这些工作分配给 Pod?

此外,我偶然发现了可能通过注释定义的所谓的 init 容器。但是这些都有缺点,k8s 确保实际的 Pod 仅在 init 容器运行后才启动。因此,对于我的场景,它似乎不合适。

【问题讨论】:

    标签: kubernetes google-cloud-platform google-kubernetes-engine


    【解决方案1】:

    据我了解,您需要运行服务来配置它。

    您的解决方案是可行的,您可以设置restartPolicy: always,您只需要一种方法来告诉您的一次性配置容器它已经运行。您可以创建一个emptyDir 卷并将其附加到您的配置容器,在其上创建一个文件以标记您的配置成功并从您的进程中检查此文件。初始化后,您将循环进入睡眠状态。缺点是该容器也会占用一些资源。

    或者您可以在同一个容器中添加一个额外的进程并进行配置(可能使用上面提到的文件作为保护以避免配置两次)。所以写一个像这样的简单 shell 脚本并运行它而不是你的主进程:

    #!/bin/sh
    
    (
      [ -f /mnt/guard-vol/stamp ] && exit 0
      /opt/my-config-process parameters && touch /mnt/guard-vol/stamp
    ) &
    
    exec /opt/my-main-process "$@"
    

    或者,您可以实现一个单独的 pod,该 pod 查询 kubernetes API 以获取标签为 configured=false 的服务的 pod。配置它并使用 API 删除标签。您还应该修改您的服务以选择configured=true pods。

    【讨论】:

    • 作为网站的新用户,您可能会发现 meta.stackexchange.com/questions/686/… 很有用 - 不是需求或任何东西。
    • 感谢您抽出宝贵时间回答我的问题。到目前为止,我的解决方法与您的建议类似。一次性作业通过 cron 运行,如果它已经运行,则在本地进行标记。所以它的解决方案更多或更少。这种解决方案的问题是,从用户的角度来看,语义已经改变。可能已成功完成或未成功完成的一次性容器现在是始终运行的服务。因此,用户需要了解更多有关实现细节的信息才能评估状态,而不仅仅是检查kubectl get/describe pod ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多