我正在研究将在Google Container Engine(Kubernetes)上运行的计算框架。
期望的行为是,用户将提供一个要执行的容器(这是用户有效负载,我们可以这样做,因为用户很少且值得信任)。用户容器将事先上传到注册表。
当框架运行时,它将启动一些工作者(每个工作在pod上,监听芹菜队列),主节点将加载一堆参数传递给工作者(通过celery / rabbitmq)。
当一个工人运行时,它将执行3件事(对于每个工作项):
SET UP
:工作人员将从Google云存储和其他位置复制文件和配置。这些文件将放在pod的卷中。 EXECUTION
:工作人员应从注册表中下载用户容器并运行它。我还想从容器的进程中捕获stdout
和stderr
,如果可能的话,添加一个截止日期(如果容器在X秒内没有完成执行,则暂停)。用户容器将其结果生成为卷目录中的文件。CLEAN UP and REPORTING
:主机pod会将用户容器生成的一些工件复制回Google云端。其他结果将报告给专有应用程序。我希望框架对用户不可见(因为我们不想与他们共享凭据并阻止他们拥有任何任务管理逻辑)。
由于主机本身就是一个容器,因此没有找到实现这一目标的好方法(在另一个容器中运行的脚本中拉动并运行容器)。
这可能在Kubernetes实现吗?是否有任何类似的文档或项目?并且,这种方法有任何陷阱吗?
谢谢!
答案 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
# ...