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才能访问。

posted on 2021-03-30 21:42  在苏州的城边  阅读(532)  评论(0编辑  收藏  举报

导航