「DockerでcryoSPARCクラスタ」の版間の差分

提供: Eospedia
移動: 案内検索
(ファイアウォール設定)
(CentOS 7)
 
(同じ利用者による、間の1版が非表示)
行10: 行10:
 
Docker間の通信に必要なポートを開ける必要がある。こちらを参照⇒ https://docs.docker.com/network/overlay/#create-an-overlay-network
 
Docker間の通信に必要なポートを開ける必要がある。こちらを参照⇒ https://docs.docker.com/network/overlay/#create-an-overlay-network
  
 +
==== CentOS 7 ====
 
CentOSの場合はfirewall-cmdでポートを開けることができる。クラスタに参加するホストマシンのすべてで実行する必要がある。(firewall-cmdについて参考: [[Linux関連#ネットワーク関連]])
 
CentOSの場合はfirewall-cmdでポートを開けることができる。クラスタに参加するホストマシンのすべてで実行する必要がある。(firewall-cmdについて参考: [[Linux関連#ネットワーク関連]])
 
<pre>
 
<pre>
行19: 行20:
 
> sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp --permanent
 
> sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp --permanent
 
</pre>
 
</pre>
 +
 +
ポートを開けた後は、--reloadで設定を反映するか、
 +
<pre>
 +
> sudo firewall-cmd --reload
 +
</pre>
 +
 +
firewalldを再起動する。
 +
<pre>
 +
> sudo systemctl restart firewalld.service
 +
</pre>
 +
 +
==== Ubuntu 18.04 LTS ====
 +
ufw (Ubuntu firewall)を使うが、未調査。
  
 
=== Swarmの構成 ===
 
=== Swarmの構成 ===

2020年11月17日 (火) 11:07時点における最新版

この記事について

cryoSPARCはインストールで問題が起きる場合がある。Dockerで動かせるようにすれば、Dockerが使えるマシンがあればおおむねどこでもcryoSPARCを動かせるようになる。

単一ノードでcryoSPARCを使うだけれあればすでに作成済みのDockerイメージ( https://github.com/yasunaga-lab/docker/tree/master/cryosparc )が使える。複数ノードでcryoSPARCを動かしてクラスタを作るためにはDocker間の通信設定などが必要になる。ここにそのあたりの方法を書き残しておく。

Docker swarmによる(仮想)ネットワーク構築

異なるホストマシンの上に載っているDockerを相互接続するためにswarmを構成したうえで、cryoSPARCコンテナ間通信用のoverlayネットワークを作成する。(参考: Docker関連 )

ファイアウォール設定

Docker間の通信に必要なポートを開ける必要がある。こちらを参照⇒ https://docs.docker.com/network/overlay/#create-an-overlay-network

CentOS 7

CentOSの場合はfirewall-cmdでポートを開けることができる。クラスタに参加するホストマシンのすべてで実行する必要がある。(firewall-cmdについて参考: Linux関連#ネットワーク関連)

> sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp

上記だけだと設定は永続的ではなく、ホストマシンを再起動するとポートが再び閉じてしまうので、永続化させたい場合は --permanent オプションをつけること。

> sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp --permanent

ポートを開けた後は、--reloadで設定を反映するか、

> sudo firewall-cmd --reload

firewalldを再起動する。

> sudo systemctl restart firewalld.service

Ubuntu 18.04 LTS

ufw (Ubuntu firewall)を使うが、未調査。

Swarmの構成

クラスタに参加させたいホストマシン達のDockerでswarmを構成する。Swarmにはマネージャーノードとワーカーノードの概念がある。

まずはマネージャーノードにしたいホストマシンにて以下を実行する。

> docker swarm init

すると以下のような文字列が出力されるから、これをワーカーノードとしてクラスタに参加させたいホストマシンのそれぞれで実行すればよい。

docker swarm join --token <トークン文字列> <マネージャーノードのIPアドレス>:2377

成功すれば"This node joined a swarm as a worker."と表示される。

あとあと上記のコマンドを確認したい場合は、マネージャーノードにて

> docker swarm join-token worker

とすれば、ワーカーノード追加用のコマンド(トークン文字列も含めて)を確認できる。

現在swarmに加わっているホストマシンの一覧を確認するには、

> docker node ls

マネージャー、ワーカーとややこしいことを書いたが、たぶん、swarm上でサービス (Dockerの用語)を動かす時に必要になる役割で、今回のようにそれぞれのホストでcryoSPARCコンテナを動かし、それを相互接続する、というだけであれば、どれをマネージャーにするかなどはあまり関係ないのではないかとは思う。

Overlayネットワークの作成

Swarmのマネージャーノードにて、コンテナ間をつなぐためのoverlayネットワークを作成する。ここでは、cryosparc-netという名前で作ってみる。

> docker network create --driver=overlay --attachable cryosparc-net

これをワーカーノードでやる必要はない。マネージャーノードで作ればワーカーノードからも利用可能になる。

ネットワークの一覧を確認する。cryosparc-netがswarmをスコープとして作られていることが確認できる。

> docker network ls

cryoSPARCクラスタ構築

クラスタに加えたいノードのそれぞれでcryoSPARCを動かす能力のあるdockerコンテナを動かし、それらをcryosparc-netに参加させ、cryoSPARCのマスターとして使いたいコンテナでのみcryoSPARCのマスターインストールをして、必要ならワーカーもインストールし、他のコンテナではワーカーのみインストールする + α をすればクラスタ構築できた。cryoSPARCのインストール場所やデータベース、プロジェクトディレクトリなどなどは、どのホスト・コンテナからもマウント可能なネットワークドライブに置く必要があります。

手順が煩雑なのでいずれ整理して書きます。(各ホストマシンでコンテナを動かして、同一の仮想ネットワーク上に載せることさえできれば、あとは通常のcryoSPARC master workerインストールと同じです。)

コンテナをcryosparc-netに参加させる方法

> docker network connect cryosparc-net <コンテナ名>

cryoSPARCワーカーを追加する方法

> cryosparcw connect --worker <ワーカーコンテナ名> --master <マスターコンテナ名> --port 39000 --ssdpath <SSDのパス> --lane <レーン名>

デフォルトのレーン名は default である。

新しいレーンを作る場合は、--newlaneフラグを立てたうえで--lane で新しいレーン名を指定する。

--ssdquota によりSSDの使用可能量(MB)を適宜指定したほうがよいだろう。

ワーカーの設定変更

ワーカーの設定を一部変更するには、--updateフラグを立てたうえで、変更したいオプション値を指定すればよい。例えばssdquotaを100GBに制限したければ、

> cryosparcw connect --worker <ワーカーコンテナ名> --master <マスターコンテナ名> --update --ssdquota 100000

とする。workerとmasterは指定が必要。

cryosparcw connectのエラー

以下のようなエラーが出た場合は、

 ---------------------------------------------------------------
  CRYOSPARC CONNECT --------------------------------------------
 ---------------------------------------------------------------
  Attempting to register worker csparc-worker-DL-Box to command csparc-master-worker-cs08:39002
Traceback (most recent call last):
  File "bin/connect.py", line 84, in <module>
    print     "  Connecting as unix user %s" % (os.environ['USER'])
  File "/net/fs10/work02/csparc/cryosparc2_worker/deps/anaconda/lib/python2.7/UserDict.py", line 40, in __getitem__
    raise KeyError(key)
KeyError: 'USER'

USER環境変数が設定されていない。cryoSPARCのユーザー名(cryoSPARCが管理しているユーザー名ではなくて、計算機システム側のユーザー名)がcryosparc_userだとすると、

> export USER=cryosparc_user

としてから再度connectをすれば大丈夫(なはず)。

ホストマシンを再起動した後のクラスタの復旧

停止したコンテナをdocker startで再稼働するとき、swarmのマスターではうまく行くがワーカーでは失敗するエラーが起きた。 エラーがの内容(例)は

Error response from daemon: Could not attach to network asuaxn22bff1sq8pqqay2sg64: context deadline exceeded
Error: failed to start containers: csparc-worker-cs06

マスターノードで docker node ls すると、ワーカーノードのSTATUSが軒並み Down になっていて、dockerのネットワークが駄目な感じがあった。が、修復の方法がよくわからず、頓挫中。

原因

ファイアウォール設定でswarm通信用のポートをfirewall-cmdで開けるが、--permanentオプションを付けて実行しないと、計算機再起動した際に設定が消えるらしい。上記問題が出た環境は--permanetを付けずにポートを開いていたので、それゆえ再起動した後にswarm通信ができず、各ノードのSTATUSがDownとなっていたと考えられる。(実際に検証する前にネットワーク設定を消してしまったので検証はできていない)