我使用的是Kubernetes 1.7和Python客户端 2.0。我有一个在TensorFlow中运行在K8集群下的hello world机器学习程序MNIST。它有一个工作人员和一个参数服务器。它被部署为一个kind: Job (在清单中)。用python编写的自定义调度程序使用list_namespaced_pod监视挂起的豆荚,并根据资源的可用性对它们进行调度。既然这是一个即将到来的事件流,我如何确保一个作业下所有挂起的吊舱都被安排好了?换句话说,我不想部分地安排一个作业,或者安排挂起的作业的所有吊舱,或者没有。
中是否有一种方法可以一次捕获/查找/监视同一个作业的所有事件(即部署在一个清单文件下)?,我也尝试了list_namespaced_event,但它也报告了一个接一个的事件。因此,很可能会出现这样的情况:作业的一个任务包可以被调度,而后者却不能。定制调度器的一个小版本是可用的这里。
my-mnist.yml文件(较小的版本)
---
apiVersion: batch/v1
kind: Job
metadata:
name: my-ps
labels:
name: my-ps
jobName: my-ps-mnist_dist
namespace: my-namespace
spec:
template:
metadata:
labels:
name: my-ps
jobName: my-ps-mnist_dist
jobId: 5b2a6cd25b02821468e41571
manifestFile: my-mnist.yml
jobTrainingType: distributed
jobTaskName: "my-ps"
jobTaskIndex: "0"
jobWorkerInstances: "1"
namespace: my-namespace
spec:
nodeSelector:
gpu: "no"
dlts: "yes"
containers:
- name: my-ps
image: "123.456.789.10:1234/myimg/5b2a6cd25b02821468e41571"
imagePullPolicy: Always
tty: true
stdin: true
env:
- name: JOB_TASK_NAME
value: "ps"
- name: JOB_ID
value: "5b2a6cd25b02821468e41571"
- name: JOB_LD_LIBRARY_PATH
value: "/usr/local/cuda-9.0/lib64:/usr/lib64/nvidia:/usr/local/cuda-9.0/targets/x86_64-linux/lib"
- name: JOB_PYTHON_VERSION
value: "3"
---
apiVersion: batch/v1
kind: Job
metadata:
name: my-wkr
labels:
name: my-wkr
jobName: wkr0-mnist_dist
namespace: my-namespace
spec:
template:
metadata:
labels:
name: my-wkr
jobName: wkr0-mnist_dist
jobId: 5b2a6cd25b02821468e41571
manifestFile: my-mnist.yml
jobTrainingType: distributed
jobTaskName: "worker"
jobTaskIndex: "0"
jobWorkerInstances: "1"
namespace: my-namespace
spec:
nodeSelector:
gpu: "yes"
dlts: "yes"
containers:
- name: my-wkr
image: "123.456.789.10:1234/myimg/5b2a6cd25b02821468e41571"
imagePullPolicy: Always
tty: true
stdin: true
resources:
limits:
alpha.kubernetes.io/nvidia-gpu: 2
env:
- name: JOB_TASK_NAME
value: "worker"
- name: JOB_TASK_INDEX
value: "0"
- name: JOB_ID
value: "5b2a6cd25b02821468e41571"
- name: JOB_LD_LIBRARY_PATH
value: "/usr/local/cuda-9.0/lib64:/usr/lib64/nvidia:/usr/local/cuda-9.0/targets/x86_64-linux/lib"
- name: JOB_PYTHON_VERSION
value: "3"发布于 2018-06-28 12:25:28
另外,在Kubernetes中是否有办法一次捕获/查找/监视同一作业的所有事件(即部署在一个清单文件下)?
简短的回答是否定的。所有的吊舱事件,在任何情况下,都是一个接一个的。
有一个机会出现在我的脑海里:
因为需要自定义调度程序的吊舱不能由任何其他调度程序进行调度,所以您的自定义调度程序可以收集与同一作业相关的吊舱列表,并依次对其进行调度,然后转到与下一个作业相关的列表。通过这种方式,您可以确保在与第一个作业相关的所有吊舱被调度到节点之前,不会为一个与另一个作业相关的荚分配打算由第一个作业的荚使用的资源。
在调度程序接收到的事件中有注释和标签。我没有检查list_namespaces_pod或list_namespaces_event的结果,但我认为注释和标签也应该在那里。可以在注释中设置作业的配置,比如作业中的吊舱数或作业中每个吊舱的标签(例如:labels:{job_ID:100,role:master,uid:xxx}, annotations:{[job_ID:none, master:none, worker1:none worker2:none]})。当调度程序看到第一个带有作业注释的结束符时,他会为作业创建一个新的吊舱列表([job_ID:100, master:xxx, worker1:none worker2:none])。当下一个事件出现时,调度程序使用pod标签填充此列表,而调度程序只使用已完全填满的列表([job_ID:100, master:uid1, worker1:uid2: worker2:uid3])。
https://stackoverflow.com/questions/51066721
复制相似问题