Univa Grid Engine : DockerをUGEで管理する
概要
Univa Grid Engine(以下UGE)の8.4.0以降のバージョンではUGEはDockerに対応しています。 とは言っても、正直言ってこれが意味するところはすぐにはピンと来ないかもしれません。 それは、対応するしないにかかわらず、$ qsub -b y -N DOCK -cwd docker run -it --rm .....
というように、dockerのジョブであることを意識せずに非dockerのジョブと同じようにqsubすれば
ハードウェアリソースの状況を見てジョブをスケジューリングするということが可能である、
ということが一因としてあるのではないかと思います。
今回は、UGEがDockerに対応していることのメリットについて少し挙げてみたいと思います。
UGEがDockerに対応していることのメリット
a) ホスト毎のdockerの有無をリソースとして管理している
計算ノード内でdockerのdaemonが動いているノードと動いていないノードがあった場合、 dockerが動いているノードを実行対象としてくれます。 " # qstat -F docker "と実行してhl:docker=1となっていればそのホストではdockerのジョブの実行が可能です。 hl:docker=0の場合はdockerのジョブは投入されません。b) ホスト毎に保持しているコンテナイメージのリストも管理している
ジョブの中で指定されたコンテナイメージを持っているホストにジョブが投入されるので pullする時間を待つ必要が無く、効率的にジョブが実行される (上記はデフォルトの動作で、"-soft" オプションを付けるとイメージを保持しているホストが無かったり、リソースが埋まっていて すぐにジョブが投入されないような場合には、イメージを持っていないホストにジョブが投入され、docker pullも行われるようになります)"# qstat -F docker_images"と実行すると各ホストで持っているイメージのリストがカンマ区切りで表示されます。
c) ジョブが完了したらコンテナを削除してくれる
若干地味なメリットかもしれませんし、--rmを付けるのを忘れなければいいという話でもあるかもしれませんが。 ジョブが完了した時だけでなく、何らかの原因でUGEの実行デーモンが落ちてしまったようなケースでも、 sge_container_shepherdというプロセスが残っており、次回デーモン起動時にフォローして削除してくれます。ジョブの例
例1) centos:latestのコンテナを使って日時とホスト名を返すだけのジョブ
- ジョブスクリプト
- UGEの結果ファイル
例2) UGEの-xdオプションを使ってdockerのオプションをUGEに渡すジョブ
- ジョブスクリプト
- UGEの結果ファイル : "-v /home:/home"が正しく渡されてホスト機側でls -l /home/と実行したのと同じ出力が得られています。
例3) 保持していないコンテナイメージを使って実行するジョブ
- ジョブスクリプト (ubuntu:latestはどのホストにも無い状態です)
注意点
dockerのバージョン依存
CentOSでdockerを使う場合、現在は主に3つの選択肢があります。(docker-eeは省略) - docker-ce(docker-ce.repo) : 10/9現在最新 v17.09 - docker-latest(centos repo) : 10/9現在最新 1.13.1-23.git28ae36d.el7.centos.x86_64 - docker(centos repo) : 10/9現在最新 1.12.6-55.gitc4618fb.el7.centos.x86_64 docker-latestとdockerの違いについてはこちらを >> http://rhelblog.redhat.com/2016/10/31/understanding-docker-latest-package/ただ、docker-ceだとdockerのサービスが動作してる状態でも、hl:docker=1にならず動作しません。 パッケージ名がdocker-engineだった頃からマイナーバージョンの違いによってhl:dockerが0になったり1になったりするので 実際には使用するバージョンで試してみるしかないというところですが、少なくともdocker-ceは動かないと考えていいと思います。
centosのrepositoryから取得するdocker, docker-latestについてはいずれもhl:docker=1になって動作することを確認しています。