Kubernetes Python客户端-查找挂起的作业并一次安排所有Pod或如何安排挂起的作业

时间:2018-06-27 15:40:01

标签: python kubernetes yaml

我正在使用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"

1 个答案:

答案 0 :(得分:1)

  

此外,Kubernetes中是否可以同时捕获/查找/监视同一作业的所有事件(即,部署在一个清单文件中)?

简短的回答是“否”。无论如何,所有Pod事件都接连发生。

我想到一个机会:
由于需要自定义计划程序的容器不能由任何其他调度程序进行调度,因此您的自定义调度程序可以收集与同一作业相关的容器列表,然后依次调度它们,然后转到与下一个作业相关的列表。这样,您可以确保在将与第一个作业相关的所有容器调度到节点之前,不会将第一个作业的Pod打算使用的资源分配给与另一个作​​业相关的一个容器。

计划程序收到事件时,会有注释和标签。我没有检查list_namespaces_podlist_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])的列表。