首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes Python客户机--查找挂起的作业,并一次安排所有的吊舱,或者如何安排挂起的作业。

Kubernetes Python客户机--查找挂起的作业,并一次安排所有的吊舱,或者如何安排挂起的作业。
EN

Stack Overflow用户
提问于 2018-06-27 15:40:01
回答 1查看 1.2K关注 0票数 0

我使用的是Kubernetes 1.7和Python客户端 2.0。我有一个在TensorFlow中运行在K8集群下的hello world机器学习程序MNIST。它有一个工作人员和一个参数服务器。它被部署为一个kind: Job (在清单中)。用python编写的自定义调度程序使用list_namespaced_pod监视挂起的豆荚,并根据资源的可用性对它们进行调度。既然这是一个即将到来的事件流,我如何确保一个作业下所有挂起的吊舱都被安排好了?换句话说,我不想部分地安排一个作业,或者安排挂起的作业的所有吊舱,或者没有。

中是否有一种方法可以一次捕获/查找/监视同一个作业的所有事件(即部署在一个清单文件下)?,我也尝试了list_namespaced_event,但它也报告了一个接一个的事件。因此,很可能会出现这样的情况:作业的一个任务包可以被调度,而后者却不能。定制调度器的一个小版本是可用的这里

my-mnist.yml文件(较小的版本)

代码语言:javascript
复制
---

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"
EN

回答 1

Stack Overflow用户

发布于 2018-06-28 12:25:28

另外,在Kubernetes中是否有办法一次捕获/查找/监视同一作业的所有事件(即部署在一个清单文件下)?

简短的回答是否定的。所有的吊舱事件,在任何情况下,都是一个接一个的。

有一个机会出现在我的脑海里:

因为需要自定义调度程序的吊舱不能由任何其他调度程序进行调度,所以您的自定义调度程序可以收集与同一作业相关的吊舱列表,并依次对其进行调度,然后转到与下一个作业相关的列表。通过这种方式,您可以确保在与第一个作业相关的所有吊舱被调度到节点之前,不会为一个与另一个作业相关的荚分配打算由第一个作业的荚使用的资源。

在调度程序接收到的事件中有注释和标签。我没有检查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])。当下一个事件出现时,调度程序使用pod标签填充此列表,而调度程序只使用已完全填满的列表([job_ID:100, master:uid1, worker1:uid2: worker2:uid3])。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51066721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档