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
逻辑
为容器配置PrivateKey
、PublicKey
、AuthorizedKeys
、Config
。
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
才能访问。