【问题标题】:How to load and run a container at run time from a running pod如何在运行时从正在运行的 pod 加载和运行容器
【发布时间】:2017-03-28 04:39:22
【问题描述】:

我正在开发一个将在 Google Container Engine (Kubernetes) 上运行的计算框架。

期望的行为是用户将提供一个要执行的容器(这是用户有效负载,我们可以这样做,因为用户很少且受信任)。用户容器会预先上传到注册表。

当框架运行时,它将启动许多工作人员(每个工作人员在一个 pod 上,监听一个 celery 队列),一个主节点将加载一堆参数以传递给工作人员(通过 celery/rabbitmq)。

当工作人员运行时,它将执行 3 件事(针对每个工作项):

  1. SET UP:worker 会从谷歌云存储和其他地方复制文件和配置。这些文件将被放置在 pod 的卷中。
  2. EXECUTION:worker 应该从注册表中下载用户容器并运行它。我还想从容器的进程中捕获stdoutstderr,如果可能的话,添加一个截止日期(如果容器在 X 秒内没有完成执行,则停止)。用户容器会将其结果生成为卷目录中的文件。
  3. CLEAN UP and REPORTING:宿主 pod 会将用户容器生成的一些工件复制回谷歌云。其他结果将报告给专有应用程序。

我希望框架对用户不可见(因为我们不想与他们共享凭据并阻止他们拥有任何任务管理逻辑)。

由于主机本身就是一个容器,因此还没有找到实现此目的的好方法(在另一个容器中运行的脚本中拉取并运行一个容器)。

这可以在 Kubernetes 中实现吗?是否有任何文档或项目做类似的事情?而且,这种方法有什么缺陷吗?

谢谢!

【问题讨论】:

  • 我的理解是,您想让一个 pod 启动另一个 pod?
  • @Frap 不是 pod,而是从原始 pod 中运行容器(使用用户提供的代码)并等待它退出。在 pod 中的容器(框架)内运行的容器(用户)。
  • 这对我来说似乎是一个完全的反模式。 Kubernetes 旨在抽象出单个容器的概念。您可能可以使用 init 容器和新的 cron 作业资源做您想做的事情,或者可能在 docker 的东西中做一些 docker,但我认为您可能需要重新考虑您正在尝试做的事情。

标签: docker kubernetes google-kubernetes-engine


【解决方案1】:

最终解决如下:

首先,我创建了一个job,定义如下(sn-p):

apiVersion: batch/v1
kind: Job
metadata:
  name: item-001
spec: 
  template:
    metadata:
      name: item-xxx 
    spec: 
      containers:
      - name: worker
        image: gcr.io/<something>/worker
        volumeMounts:
        - mountPath: /var/run/docker.sock
          name: docker-socket-mount
        - mountPath: /workspace
          name: workspace 
      volumes:
        - name: docker-socket-mount
          hostPath:
            path: /var/run/docker.sock
        - name: workspace 
          hostPath:
            path: /home/workspace 

有 2 个挂载,第一个 docker-socket-mount/var/run/docker.sock 挂载到容器中,所以我可以从内部使用 Docker,第二个,它挂载一个将在主机和来宾容器之间共享的卷 @987654325 @。

worker 运行类似这样的脚本:

#!/usr/bin/env bash

IMAGE=gcr.io/some/guest/image

# ...

gsutil -m cp -r gs://some/files/I/need/* /workspace

# ...

export DOCKER_API_VERSION=1.23
gcloud docker -- pull ${IMAGE}
docker run -v /home/workspace:/workspace ${IMAGE} 

# ...

有了可用的 docker 套接字,安装 docker 客户端并正常调用就足够了。诀窍是从 /home/workspace 挂载来宾映像,从 kubernetes 节点而不是从主机映像 (/workspace) 可以看到。下载到 /workspace 的文件现在也可以在来宾容器上使用。

最后,Dockerfile 看起来像这样:

FROM ubuntu:14.04

# ...

# Install Docker
RUN curl -fsSL https://get.docker.com/ | sh

# Install Google Cloud SDK
ADD xxx.json /home/keys/xxx.json
RUN curl https://sdk.cloud.google.com > /tmp/gcloud.sh
RUN bash /tmp/gcloud.sh --disable-prompts --install-dir=/home/tools/
RUN /home/tools/google-cloud-sdk/bin/gcloud auth activate-service-account name@my-project.iam.gserviceaccount.com --key-file=/home/keys/xxx.json
RUN /home/tools/google-cloud-sdk/bin/gcloud config set project my-project

# ...

【讨论】:

    猜你喜欢
    • 2021-04-26
    • 2020-05-13
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多