[英]Run a bash script from a docker container running in kubernetes pod via Jenkins job
[英]How to load and run a container at run time from a running pod
我正在研究一个将在Google容器引擎(Kubernetes)上运行的计算框架。
期望的行为是用户将提供一个要执行的容器(这是用户有效负载,我们可以这样做,因为用户很少且受信任)。 用户容器将被预先上传到注册表。
当框架运行时,它将启动多个工作程序(每个工作程序在一个Pod上,侦听芹菜队列),并且主节点将加载一堆参数以传递给工作程序(低空celery / rabbitmq)。
工人运行时,它将执行3件事(对于每个工作项):
SET UP
:工作人员将从Google云端存储和其他地方复制文件和配置。 文件将放置在容器的卷中。 EXECUTION
:工作者应从注册表中下载用户容器并运行它。 我还想从容器的过程中捕获stdout
和stderr
,并在可能的情况下增加最后期限(如果容器尚未在X秒内完成执行,请暂停)。 用户容器将其结果生成为卷目录中的文件。 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.