Cluster Packの利用方法

概要

クラスタパックはユーザーに対してmdx環境におけるクラスタ環境構築の手順を提供します。

クラスタパックはLDAP, NFS, SLURMから構成されており、LDAPによるユーザー情報管理、 NFSによるファイル共有、SLURMによるジョブ管理を行うことができます。

クラスタパックの概要

本書では、クラスタパックの環境構築(LDAP, NFS, SLURMそれぞれの環境構築の方法)および 操作方法(LDAPでのユーザー追加方法およびSLURMによるジョブ投入方法)について記載しています。

環境構築について

コントロールノード、計算ノードに用いるマシンについて

ここでは、コントロールノード、計算ノードに用いるマシン情報を記載します。
実際の構築環境に合わせてマシン名やIPアドレスを変更してください。

コントロールノード(LDAPサーバー兼NFSサーバー兼SLURMコントロールノード)

  • マシン名: ubuntu-2204

  • IP: 10.5.4.45

  • グローバルIP: 163.220.177.146

計算ノード(LDAPクライアント兼NFSクライアント兼SLURM計算ノード)

  • マシン名: ubuntu-2204-test

  • IP: 10.5.0.121

インストールするパッケージ

クラスタパックにおいては、コントロールノードに下記のLDAP-server, NFS-server, SLURM, ansibleに 記載されたパッケージをインストールし、計算ノードに下記のLDAP-client, NFS-client, SLURM に記載されたパッケージをインストールします。

機能

パッケージ

LDAP-server

slapd, ldap-utils, ldap-account-manager, libnss-sss, libpam-sss, libsss-sudo

LDAP-client

libnss-sss, libpam-sss, libsss-sudo

NFS-server

nfs-kernel-server

NFS-client

nfs-common

SLURM

slurm-wlm, munge, libmunge2, libmunge-dev

ansible

ansible

設定について

ログイン前、初期ログイン時の設定について

ACLの設定

Cluster Packで作成したマシンに対して、必要なACLを設定してください。

mdxユーザーポータルに接続後、「ネットワーク」タブを選択し、左側のメニューの「ACL」をクリックしてください。
Cluster Packを作成したプロジェクトを選択し、IPv4の「+ RECORD」ボタンをクリックしてください。
ACLの設定

出てきた「Recordの追加」Windowで、下記の設定をしてください。

プロトコル: TCP
Srcアドレス: xxx.xxx.xxx.xxx (1)
SrcPrefix長: 24
Srcポート: 80                (2)
Dstアドレス: yyy.yyy.yyy.yyy (3)
DstPrefix長: 32
Dstポート: 3389
  1. お使いの環境のグローバルIPに基づいて入力してください。

    例: グローバルIPが192.0.2.123の場合、192.0.2.0としてください。

  2. すべてのマシンに関して、HTTPのポート80を設定してください。コントロールノードに関しては合わせてSSHのポート22も設定してください。

    ポート80の設定は初回ログイン時のパスワード設定エラーを避けるために行なっています。ポート22の設定は外部からコントロールノードにSSH接続するためです。

  3. Cluster Packで作成したマシンのIPv4アドレスを入力してください。

    この情報は、「仮想マシン」タブの「コントロール」を選択した時に表示される仮想マシン名を選択した時に、 画面右側サマリの「サービスネットワーク 1」「IPv4アドレス」に表示されます。

初回ログイン時

初回ログイン時にはACL適用のタイミングの問題のためか、ネットワークの名前解決ができなくなっている場合があります。
下記コマンドでネットワークの再起動を行ってください。
sudo systemctl restart NetworkManager.service

SSH鍵の作成

また、コントロールノードと計算ノードの間で行き来ができるように、コントロールノードでSSH鍵を作り、それを各計算ノードのauthorized_keysに追加してください。

ssh-keygen -t ed25519

Ansibleのインベントリファイルの準備

ここでは、Ansibleを用いて設定を行うので、ホームディレクトリ下のcluster-setting-filesディレクトリにあるcluster.iniをお使いの環境に合わせて編集してください。
ここには、コントロールノード、計算ノードのIPおよびホスト名、計算ノードのCPU数の情報を記載します。
[control_nodes]
ubntu-2204 ansible_host=10.5.4.45

[compute_nodes]
ubuntu-2204-test ansible_host=10.5.0.121 cpus=3

[all:vars]
ldap_server_uri=ldap://10.5.4.45

cluster-setting-filesディレクトリは下記のファイルを含みます。

  • add-ldapPublicKey-schema.ldif: LDAPにSSHキーを追加するためのスキーマファイル

  • cluster.ini: 上記のインベントリファイル

  • hosts.j2: /etc/hostsに追加する情報のテンプレート

  • ldap-setting.yml: LDAPの設定用Playbook

  • ldap-ssh.yml: LDAPにSSHキーを追加するためのPlaybook

  • ldapAuthSSH.sh.j2: LDAPにSSHキーを追加するためのスクリプトのテンプレート

  • nfs.yml: NFSの設定用Playbook

  • slurm.conf.j2: SLURMの設定ファイルのテンプレート

  • slurm.yml: SLURMの設定用Playbook

  • sssd.conf.j2: /etc/sssd/sssd.confに追加する情報のテンプレート

LDAP

LDAPのサーバー、クライアントの設定を実施します。
まず、ldap-setting.ymlにあるslapdのslapd/domain, slapd/password1, slapd/password2nslcdのnslcd/ldap-baseの値を環境に合わせて修正してください。
同様に、cluster.iniに記載のアドレスも環境に合わせて修正してください。
上記の設定が完了したら、下記のコマンドを実行してください。
ansible-playbook -i cluster.ini ldap-setting.yml

上記の後、コントロールノードにてLAMを用いて設定を行います。http://localhost/lam/ にアクセスし、LAMの設定を行います。

LAMのログイン画面

右上の「LAM configuration」をクリック、続いて「Edit server profiles」をクリックします。

LAMの設定画面

初期パスワードlamを入力し、「OK」をクリックします。

LAMのログイン画面

「Tool settings」内の「Tree suffix」と「Security settings」内の「List of valid users」を設定した情報に合わせて変更してください。

LAMの設定画面ツール設定

また、「Account types」内の「Active account types」のdcを書き換えてください。

LAMの設定画面アカウントタイプ

ログイン画面に戻り、初期設定時に設定したパスワードでログインしてください。

LAMのログイン画面

初期グループを作成します。「Create」をクリックしてください。

LAMの初期設定画面

成功すれば、下記のような画面が表示されます。

LAMの初期設定成功画面

次に、LDAPからSSHキーを追加出来るようにします。

cluster-setting-files内の設定ファイルldap-ssh.ymlを用いればこの設定を行うことができます。

ansible-playbook -i cluster.ini ldap-ssh.yml

上記の後、LAMの設定画面からSSHキーを追加できるように設定します。

「LAM configuration」から「Edit server profiles」を選択してログインしてください。
その後、Modulesのタブを選択し、UsersのAvailable modulesにある「SSH public key」を選択後、画面下にある「Save」ボタンをクリックしてください。
LAMのSSHキー設定画面

これで、LAMからSSHキーを追加できるようになりました。

LAMに手元環境のブラウザからアクセスする場合

LAMに手元環境のブラウザからアクセスする場合は、sshポートフォワードを使い

ssh -L 8080:localhost:80 username@163.220.177.146

などとし、ブラウザで http://localhost:8080/lam/ にアクセスしてください。

NFS

cluster-setting-files内の設定ファイルnfs.ymlを用いる事で、サーバー側とクライアント側の設定を一括で行うことができます。

下記のコマンドを実行してください。

ansible-playbook -i cluster.ini nfs.yml

SLURM

SLURMの設定についても、cluster-setting-files内の設定ファイルslurm.ymlを用いる事で、コントロールノード、計算ノードの設定を一括で行うことができます。
ただし、SLURMではslurm.confという設定ファイルを作成する必要があります。
cluster-setting-files内のslurm.conf.j2がslurm.confファイルのテンプレートとなります。
ホスト名やCPU数等の情報はcluster.iniのものが反映される形となっています。
他の設定については必要に応じてこのファイルを編集してください。
# slurm.conf file generated by configurator.html
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
ControlMachine={{ groups['control_nodes'][0] }}
# ControlAddr=
# BackupController=
# BackupAddr=
AuthType=auth/munge
#CacheGroups=0
CryptoType=crypto/munge
MpiDefault=none
ProctrackType=proctrack/pgid
ReturnToService=2
SlurmctldPidFile=/var/run/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
StateSaveLocation=/var/spool/slurmctld
SwitchType=switch/none
TaskPlugin=task/affinity
#
#
# TIMERS
# KillWait=30
# MinJobAge=300
# SlurmctldTimeout=120
# SlurmdTimeout=300
#
#
# SCHEDULING
SchedulerType=sched/backfill
SelectType=select/cons_res
SelectTypeParameters=CR_Core
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=cluster
JobCompType=jobcomp/none
JobAcctGatherType=jobacct_gather/none
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm/slurmctld.log
#
#
# COMPUTE NODES
{% for node in groups['compute_nodes'] %}
NodeName={{ node }} CPUs={{ hostvars[node]['cpus'] }} State=UNKNOWN
{% endfor %}
PartitionName=debug Nodes={{ groups['compute_nodes'] | join(',') }} Default=YES MaxTime=INFINITE State=UP

設定が完了したら、下記のコマンドを実行してください。

ansible-playbook -i cluster.ini slurm.yml

操作方法について

LDAPでのユーザー追加方法

コントロールノードにてLAMを用いてユーザーを追加します。
http://localhost/lam/ にアクセスし、ログインしてください。
LAMのログイン画面
まずGroupのタブをクリックしてグループを追加します
LAMのグループ追加画面
続いて、Userのタブをクリックしてユーザーを追加します。
各タブに必要事項を入力し、「Save」をクリックしてください。
LAMのユーザー追加画面
ここで、ユーザーの追加と同時にSSHキーを追加する事も可能です。
SSHキーを追加する場合は、「SSH public key」タブを選択します。
LAMのSSHキー追加画面

こちらの画面で「Add SSH public key extention」ボタンをクリックすると、下記のような画面が表示されます。

LAMのSSHキー追加画面

ここで、空欄にSSHキーを入力するか、「Upload file」横のBrowseボタンをクリックしてSSHキーを選択してください。

ユーザーを追加すると下記のような画面が表示されます。

LAMのユーザー追加成功画面
ユーザーが追加出来ているかは、例えば、下記のコマンドで確認できます。
(testuserを追加した場合)
sudo su - testuser

この時に、ssh公開鍵の作成、配置を実施すると利用時に便利です。

ssh-keygen -t ed25519
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys

SLURMを用いたジョブの投入方法

ここでは、SLURMを用いたジョブの投入方法について記載します。

例として以下のようなコードを実行する場合を考えます。

#include <unistd.h>
#include <stdio.h>

int main(){
    int i;
    for(i=0; i<10; i++){
        sleep(10);
        printf("loop no %i\n", i);
    }

    return 0;
}

このコードをtest.cという名前で保存し、コンパイルします。

gcc test.c

これでa.outという実行ファイルが生成されます。

次に、ジョブスクリプトを作成します。

#!/bin/bash
#SBATCH --job-name=test_job
#SBATCH --ntasks=1
#SBATCH --nodes=1
#SBATCH --time=00:02:00
#SBATCH --partition=debug
#SBATCH --output=test_job.out

echo "Start job"
date
./a.out
date
echo "End job"

このジョブスクリプトをtest_job.shという名前で保存します。

SLURMのジョブを投入するには、sbatchコマンドを用います。

sbatch test_job.sh

上記を実行すると下記のようにジョブIDが表示されます。

Submitted batch job 6

ジョブの状態を確認するには、squeueコマンドを用います。

squeue

これを実行すると、ジョブが実行されている場合下記のように出力されます。

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
    6     debug test_job  mdxuser  R       0:05      1 ubuntu-2204-test
ジョブを削除する場合は、scancelコマンドを用います。
引数にジョブIDを指定してください。
scancel 6
さて、上記のジョブが終了すれば、test_job.outというファイルが生成されます。
(これは、test_job.sh内の #SBATCH --output=test_job.out に対応しています)
内容は下記のようになります。
Start job
Tue Mar  5 15:33:50 JST 2024
loop no 0
loop no 1
loop no 2
loop no 3
loop no 4
loop no 5
loop no 6
loop no 7
loop no 8
loop no 9
Tue Mar  5 15:34:00 JST 2024
End job

これで、ジョブの投入から終了までの一連の流れが完了しました。