如何在运行时从正在运行的pod

时间:2017-03-13 18:01:38

标签: docker kubernetes google-kubernetes-engine

我正在研究将在Google Container Engine(Kubernetes)上运行的计算框架。

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

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

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

  1. SET UP:工作人员将从Google云存储和其他位置复制文件和配置。这些文件将放在pod的卷中。
  2. EXECUTION:工作人员应从注册表中下载用户容器并运行它。我还想从容器的进程中捕获stdoutstderr,如果可能的话,添加一个截止日期(如果容器在X秒内没有完成执行,则暂停)。用户容器将其结果生成为卷目录中的文件。
  3. CLEAN UP and REPORTING:主机pod会将用户容器生成的一些工件复制回Google云端。其他结果将报告给专有应用程序。
  4. 我希望框架对用户不可见(因为我们不想与他们共享凭据并阻止他们拥有任何任务管理逻辑)。

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

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

    谢谢!

1 个答案:

答案 0 :(得分:1)

结束解决方案如下:

首先,我创建了一个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 

有两个安装,第一个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 socket可用,它足以安装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

# ...