我正在使用Kubernetes 1.7和Python Client 2.0。我在TensorFlow中有一个在K8集群下运行的世界机器学习程序MNIST。它具有一台工作器和一台参数服务器。它被部署为kind: Job
(在清单中)。使用python编写的自定义调度程序,使用list_namespaced_pod
监视挂起的pod,并根据资源的可用性对其进行调度。由于这是一连串的事件,我如何确定某个作业下的所有未决豆荚是否已计划好?换句话说,我不想部分安排工作,要么安排所有待处理工作的窗格,要么不安排。
此外,Kubernetes中是否可以同时捕获/查找/监视同一作业的所有事件(即,部署在一个清单文件中)?我还尝试了list_namespaced_event
但它还会依次报告事件。结果,很有可能发生了一项工作可以安排而另一项不能安排的情况。 here提供了一个小版本的自定义调度程序。
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"
答案 0 :(得分:1)
此外,Kubernetes中是否可以同时捕获/查找/监视同一作业的所有事件(即,部署在一个清单文件中)?
简短的回答是“否”。无论如何,所有Pod事件都接连发生。
我想到一个机会:
由于需要自定义计划程序的容器不能由任何其他调度程序进行调度,因此您的自定义调度程序可以收集与同一作业相关的容器列表,然后依次调度它们,然后转到与下一个作业相关的列表。这样,您可以确保在将与第一个作业相关的所有容器调度到节点之前,不会将第一个作业的Pod打算使用的资源分配给与另一个作业相关的一个容器。
计划程序收到事件时,会有注释和标签。我没有检查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]
)。当出现下一个事件时,调度程序将使用窗格标签填充此列表,并且仅调度已完全填充([job_ID:100, master:uid1, worker1:uid2: worker2:uid3]
)的列表。