kube-openmpi

From

Author

Structrue

  通过helm(k8s包管理)将mpijob以mpi-master、mpi-worker方式发布到k8s上以长期运行任务方式运行。
  运行mpijob时,通过kubectl exec在mpi-master所在的docker上运行mpiexec,并指定需要运行的任务数量,从而使得mpi-worker也一起工作。
  由于mpijob之间需要通信,主要工作是需要配置ssh。配置过程是生成id_rsa,id_rsa.pub,并将它们的值导入到相应的配置文件中,同时配置dockerfile,在docker中运行sshd。另外mpi-master所在pod中还需要运行一个hostfile-updater的容器,每隔一段时间更新mpi节点的hostfile。

Helm

参考
  相当于linux中的包管理工具,可以打包应用,管理包依赖等。
  工具结构主要包括helm、tiller,helm是client-cli,tiller是server端,负责与k8s交互。
  包主要是Chart,就是一个目录,底下有

1
2
3
4
5
6
7
8
9
10
chart/
├── Chart.yaml pkg总体信息
├── templates k8s manifest模板文件目录
│   ├── configmap.yaml
│   ├── _helpers.tpl
│   ├── mpi-cluster.yaml
│   ├── network-policy.yaml
│   ├── secrets.yaml
│   └── service.yaml
└── values.yaml 被templates中各个文件使用到的一些变量值

Procedure

generate ssh key

1
$ ./gen-ssh-key.sh			生成id_rsa, id_rsa.pub, 并将两个的值导入到./ssh-key.yaml中

deploy

1
2
3
$ MPI_CLUSTER_NAME=__CHANGE_ME__
$ KUBE_NAMESPACE=__CHANGE_ME_
$ helm template chart --namespace $KUBE_NAMESPACE --name $MPI_CLUSTER_NAME -f values.yaml -f ssh-key.yaml | kubectl -n $KUBE_NAMESPACE create -f -

helm template : Render chart templates locally and display the output
  也就是将包chart生成k8s的配置文件输出,并以values.yaml,ssh-key.yaml为值。同时把输出作为kubectl create -f的输入,也就是部署应用。
  这样mpi-master可能会启动失败,需要新创建账户
  需要新建账户的原因是,mpi-master启动过程需要执行hostfile-initializer脚本,生成hostfile,生成过程中需要使用kubectl来与k8s的API-SERVER交互。要实现这个过程需要使用到Service Account,因为API-SERVER只在HTTPS安全端口443上提供服务,因而pod内的进程需要利用Service Account进行身份认证。

run

1
2
3
4
kubectl -n $KUBE_NAMESPACE exec -it $MPI_CLUSTER_NAME-master -- mpiexec --allow-run-as-root \
--hostfile /kube-openmpi/generated/hostfile \
--display-map -n 4 -npernode 1 \
sh -c 'echo $(hostname):hello'

  通过kubectl exec连接到mpi-master所在docker执行mpiexec命令,从而在master和worker上执行mpijob。

others

  在本地生成的id_rsa, id_rsa.pubauthorized_keys在k8s中生成相应的键值对,并以文件的形式挂载在master和worker的docker中,在启动的时候执行/init.sh将其拷贝到/.sshd/user_key/$user中,并对sshd启动进行相应的配置。

0%