繁体   English   中英

如何在运行时从运行的Pod加载和运行容器

[英]How to load and run a container at run time from a running pod

我正在研究一个将在Google容器引擎(Kubernetes)上运行的计算框架。

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

当框架运行时,它将启动多个工作程序(每个工作程序在一个Pod上,侦听芹菜队列),并且主节点将加载一堆参数以传递给工作程序(低空celery / rabbitmq)。

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

  1. SET UP :工作人员将从Google云端存储和其他地方复制文件和配置。 文件将放置在容器的卷中。
  2. EXECUTION :工作者应从注册表中下载用户容器并运行它。 我还想从容器的过程中捕获stdoutstderr ,并在可能的情况下增加最后期限(如果容器尚未在X秒内完成执行,请暂停)。 用户容器将其结果生成为卷目录中的文件。
  3. CLEAN UP and REPORTING :主机窗格将用户容器生成的一些工件复制回Google Cloud。 其他结果将报告给专有应用程序。

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

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

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

谢谢!

最终解决如下:

首先,我创建了一个定义如下的job (摘要):

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,第二个,它将挂载一个将在主机和主机之间共享的卷来宾容器workspace

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客户端并正常调用它。 诀窍是从kubernetes节点而不是从主机映像( /workspace )来看,从/home/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

# ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM