zoukankan      html  css  js  c++  java
  • volcano之job plugins

    K8s

    pod

    pod是kubernetes中可以创建和部署的最小也是最简单的单位。pod代表集群中运行的进程。

    在k8s集群中,pod有两种使用方式

    • 一个pod运行一个容器:单个容器的封装,但是k8手、管理的是pod而不是容器。这也是最常见的用法。
    • 一个pod运行多个容器:一个pod中同时封装几个需要紧密耦合相互协作的容器,它们之间共享资源。同一个pod中的容器可以互相协助成为一个service单位——一个容器共享文件。另一个容器更新文件。pod将这些容器的存储资源作为一个实体来管理。

    k8s内建了很多controller,相当于状态机,用来控制pod的具体状态和行为。

    Deployment

    Deployment为pod和ReplicaSet提供一个声明式的定义和更新的方法。

    只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和 ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。

    一些典型用例:

    • 使用 Deployment 来创建 ReplicaSet。ReplicaSet 在后台创建 pod。检查启动状态,看它是成功还是失败。
    • 然后,通过更新 Deployment 的 PodTemplateSpec 字段来声明 Pod 的新状态。这会创建一个新的 ReplicaSet,Deployment 会按照控制的速率将 pod 从旧的 ReplicaSet 移动到新的 ReplicaSet 中。
    • 如果当前状态不稳定,回滚到之前的 Deployment revision。每次回滚都会更新 Deployment 的 revision。
    • 扩容 Deployment 以满足更高的负载。
    • 暂停 Deployment 来应用 PodTemplateSpec 的多个修复,然后恢复上线。
    • 根据 Deployment 的状态判断上线是否 hang 住了。
    • 清除旧的不必要的 ReplicaSet。

    StatefulSet

    StatefulSet作为controller为pod提供唯一标识。StatefulSet是为了解决有状态服务问题。其应用场景包括:

    • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现。
    • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现。
    • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现。
    • 有序收缩,有序删除(即从N-1到0)。

    Job

    负责批处理任务,批处理任务:仅执行一次的任务。

    volcanoJob

    vcjob提供如指定调度器、支持最小运行pod数、支持task、支持生命周期管理、支持指定队列、支持优先级调度。vcjob更适合机器学习、大数据科学计算等高性能计算场景。

    Service

    首先考虑这样的场景在 Kubernetes 集群中,一组pod(称为backend)为其他pod(称为frontend)提供服务,那么对于frontend该如何发现并连接到backend中的哪个pod呢?service提供了一种抽象。

    举个例子,考虑一个图片处理 backend,它运行了3个副本。这些副本是可互换的 —— frontend 不需要关心它们调用了哪个 backend 副本。然而组成这一组 backend 程序的 Pod 实际上可能会发生变化,frontend 客户端不应该也没必要知道,而且也不需要跟踪这一组 backend 的状态。

    Service 定义的抽象能够解耦这种关联。

    Job plugin是做什么的?

    volcano的作业有很多定制化的需求。考虑分布式的训练场景,多个pod运行起来之后,pod之间需要网络互访问,进行数据同步。

    svc: 支持pods communicate.
    ssh: sign in ssh without password, e.g. use command mpirun or mpiexec.

    env

    Func OnPodCreate
    Index := jobhelpers.GetTask(pod)
    
    For i in pod//遍历pod里面的所有contariner
      //Set VK_TASK_INDEX && VC_TASK_INDEX
      Pod.Spec.Containers[i].Env  <--- append(TaskVkindex , index)
      Pod.Spec.Containers[i].Env  <---append(TaskIndex , index)
    
    
    

    逻辑

    作业内为任务分配索引.

    ssh

    Struct sshPlugin{
     pluginArguments[] string
     Client pluginsinterface.pluginClientset
     sshKeyFilePath string
    }
    
    Func new //创建初始化sshPlugin
    Func OnJobAdd
    Func OnJobDelete
    Func OnJobUpdate
    Func mountRsaKey
         SSHPrivateKey
         SSHPublicKey
         SSHAuthorizedKeys
         SSHConfig
    Func generateRsaKey
    Func generateSSHConfig
    Func addFlags
    
    

    逻辑

    为容器配置PrivateKeyPublicKeyAuthorizedKeysConfig

    svc

    /*每个pod有了hostname subdomain pod中的容器配置好env*/
    func onPodCreate
       Hostname subdomain ---> pod
       
    /*为pod初始化ConfigMap*/
    func onJobAdd
          CreateOrUpdateConfigMap
          CreateServiceIfNotExist
          CreateNetworkPolicyIfNotExist
    func onJobDelete
    func onJobUpdate
    func mountConfigmap
    func createServiceIfNotExist
       /*为job创建service*/
       /*配置service*/
       /*namespace name ServicePort:Port/Protocol/TargetPort*/
       
    func createNetworkPolicyIfNotExist
    /*limit pods can be accessible only by pods belong to the job*/
    func cmName
    func GenerateHosts
    
    

    Service 定义的抽象能够解耦这种关联。

    createServiceIfNotExist为pod创建service

    createNetworkPolicyIfNotExist为对应的service设置限制,同job下的pod才能访问。

  • 相关阅读:
    转:CRF++
    ProBase
    图形数据库 Neo4j 开发实战
    Linux 下升级python和安装pip
    TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载
    开源项目kcws代码分析--基于深度学习的分词技术
    文本情感分类(二):深度学习模型
    文本情感分类(一):传统模型
    重要博文
    LSTM 文本情感分析/序列分类 Keras
  • 原文地址:https://www.cnblogs.com/rhythmic/p/14599027.html
Copyright © 2011-2022 走看看