Container Service for Kubernetes (ACK) は、Slurm on Kubernetes ソリューションと ack-slurm-operator コンポーネントを提供します。これらのコンポーネントを使用して、Simple Linux Utility for Resource Management (Slurm) スケジューリングシステムを ACK クラスタに便利かつ効率的にデプロイおよび管理し、ハイパフォーマンスコンピューティング (HPC) および大規模 AI および機械学習 (ML) に使用できます。
Slurm の概要
Slurm は、クラスタリソース管理とジョブスケジューリングのための強力なオープンソースプラットフォームです。スーパーコンピュータや大規模計算クラスタのパフォーマンスと効率を最適化するように設計されています。主要コンポーネントは連携して動作し、システムの高い効率性と柔軟性を確保します。次の図は、Slurm の仕組みを示しています。
slurmctld: Slurm コントロールデーモン。Slurm の頭脳として、slurmctld はシステムリソースの監視、ジョブのスケジューリング、およびクラスタステータスの管理を行います。システムの信頼性を高めるために、プライマリ slurmctld に障害が発生した場合にサービス中断を防ぐために、セカンダリ slurmctld を構成できます。これにより、システムの高可用性が確保されます。
slurmd: Slurm ノードデーモン。slurmd は各計算ノードにデプロイされます。 slurmd は slurmctld から命令を受け取り、ジョブの開始と実行、ジョブステータスの報告、新しいジョブ割り当ての準備など、ジョブを管理します。 slurmd は、計算リソースと直接通信するためのインターフェイスとして機能します。ジョブは slurmd に基づいてスケジューリングされます。
slurmdbd: Slurm データベースデーモン。slurmdbd はオプションのコンポーネントですが、ジョブ履歴とアカウンティング情報を保存する中央データベースを維持するため、大規模クラスタの長期管理と監査に不可欠です。 slurmdbd は、複数の Slurm 管理クラスタのデータを集約して、データ管理を簡素化し、効率を向上させることができます。
SlurmCLI: SlurmCLI は、ジョブ管理とシステム監視を容易にするために、次のコマンドを提供します。
scontrol: クラスタを管理し、クラスタ構成を制御するために使用されます。
squeue: キュー内のジョブのステータスを照会するために使用されます。
srun: ジョブを送信および管理するために使用されます。
sbatch: ジョブをバッチで送信するために使用されます。このコンポーネントは、計算リソースのスケジューリングと管理に役立ちます。
sinfo: ノードの可用性など、クラスタの全体的なステータスを照会するために使用されます。
ACK 上の Slurm の概要
Slurm Operator は、SlurmCluster CustomResource (CR) を使用して、Slurm クラスタの管理に必要な構成ファイルを定義し、コントロールプレーンの管理に関する問題を解決します。これにより、Slurm 管理クラスタのデプロイとメンテナンスが簡素化されます。次の図は、ACK 上の Slurm のアーキテクチャを示しています。クラスタ管理者は、SlurmCluster を使用して Slurm 管理クラスタをデプロイおよび管理できます。 Slurm Operator は、SlurmCluster に基づいてクラスタ内に Slurm コントロールコンポーネントを作成します。 Slurm 構成ファイルは、共有ボリュームまたは ConfigMap を使用してコントロールコンポーネントにマウントできます。
前提条件
Kubernetes 1.22 以降を実行する ACK クラスタが作成されており、クラスタには 1 つの GPU アクセラレーションノードが含まれています。詳細については、「GPU アクセラレーションノードを使用して ACK クラスタを作成する」および「クラスタを更新する」をご参照ください。
ステップ 1: ack-slurm-operator コンポーネントをインストールする
ACK コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[マーケットプレイス] ページで、[ack-slurm-operator] コンポーネントを検索してクリックします。 [ack-slurm-operator] コンポーネントの詳細ページで、右上隅にある [デプロイ] をクリックします。[デプロイ] パネルで、コンポーネントのパラメータを構成します。
クラスタパラメータのみを指定する必要があります。その他のパラメータにはデフォルト設定を使用します。
パラメータを構成したら、[OK] をクリックします。
ステップ 2: Slurm 管理クラスタを作成する
Slurm 管理クラスタを手動で作成する
ACK クラスタの MUNGE Uid 'N' Gid Emporium (MUNGE) ベースの認証用の Slurm シークレットを作成します。
次のコマンドを実行して、OpenSSL を使用してキーを作成します。このキーは、MUNGE ベースの認証に使用されます。
openssl rand -base64 512 | tr -d '\r\n'次のコマンドを実行して、シークレットを作成します。このシークレットは、前のステップで作成されたキーを保存するために使用されます。
kubectl create secret generic <$MungeKeyName> --from-literal=munge.key=<$MungeKey><$MungeKeyName>を、mungekeyなどのキーのカスタム名に置き換えます。<$MungeKey>を、前のステップで生成されたキー文字列に置き換えます。
上記の手順を実行した後、シークレットを構成または Slurm 管理クラスタに関連付けて、MUNGE ベースの認証用のキーを取得して使用できます。
次のコマンドを実行して、Slurm 管理クラスタの ConfigMap を作成します。
この例では、CR で slurmConfPath パラメータを指定することにより、次の ConfigMap がポッドにマウントされます。これにより、ポッドが再作成された場合でも、ポッド構成を期待される状態に自動的に復元できます。
次のサンプルコードの
dataパラメータは、サンプルの ConfigMap を指定します。 ConfigMap を生成するには、Easy Configurator または Full Configurator ツールを使用することをお勧めします。期待される出力:
configmap/slurm-test created期待される出力は、ConfigMap が作成されたことを示します。
SlurmCluster CR を送信します。
slurmcluster.yaml という名前のファイルを作成し、次のコンテンツをファイルにコピーします。サンプルコード:
説明この例では、Compute Unified Device Architecture (CUDA) 1.14 と Slurm 23.06 を含む Ubuntu イメージが使用されています。イメージには、クラウド上のノードの自動スケーリング用に Alibaba Cloud によって開発されたコンポーネントが含まれています。カスタムイメージを使用する場合は、カスタムイメージを作成してアップロードできます。
上記の SlurmCluster CR に基づいて、1 つのヘッドノードと 4 つのワーカーノードを持つ Slurm 管理クラスタが作成されます。 Slurm 管理クラスタは、ACK クラスタ内でポッドとして実行されます。 SlurmCluster CR の mungeConfPath パラメータと slurmConfPath パラメータの値は、headGroupSpec パラメータと workerGroupSpecs パラメータで指定されたマウントターゲットと同じである必要があります。
次のコマンドを実行して、slurmcluster.yaml ファイルをクラスタにデプロイします。
kubectl apply -f slurmcluster.yaml期待される出力:
slurmcluster.kai.alibabacloud.com/slurm-job-demo created次のコマンドを実行して、作成された Slurm 管理クラスタが期待どおりに実行されているかどうかを確認します。
kubectl get slurmcluster期待される出力:
NAME AVAILABLE WORKERS STATUS AGE slurm-job-demo 5 ready 14m出力は、Slurm 管理クラスタがデプロイされ、その 5 つのノードが準備完了であることを示します。
次のコマンドを実行して、slurm-job-demo という名前の Slurm 管理クラスタ内のポッドが Running 状態にあるかどうかを確認します。
kubectl get pod期待される出力:
NAME READY STATUS RESTARTS AGE slurm-job-demo-head-x9sgs 1/1 Running 0 14m slurm-job-demo-worker-cpu-0 1/1 Running 0 14m slurm-job-demo-worker-cpu-1 1/1 Running 0 14m slurm-job-demo-worker-cpu1-0 1/1 Running 0 14m slurm-job-demo-worker-cpu1-1 1/1 Running 0 14m出力は、ヘッドノードと 4 つのワーカーノードが Slurm 管理クラスタ内で期待どおりに実行されていることを示します。
Helm を使用して Slurm 管理クラスタを作成する
Slurm 管理クラスタを迅速にインストールおよび管理し、クラスタの構成を柔軟に変更するには、Alibaba Cloud が提供する SlurmCluster チャートをインストールするために Helm を使用できます。 charts-incubator (Alibaba Cloud のチャートリポジトリ) から Slurm 管理クラスタの Helm チャートをダウンロードします。パラメータを構成した後、Helm はロールベースアクセス制御 (RBAC)、ConfigMap、シークレット、Slurm 管理クラスタなどのリソースを作成します。
Helm チャートには、次のリソースの構成が含まれています。
リソースタイプ | リソース名 | 説明 |
ConfigMap | {{ .Values.slurmConfigs.configMapName }} | .Values.slurmConfigs.createConfigsByConfigMap パラメータが True に設定されている場合、ConfigMap が作成され、ユーザー定義の Slurm 構成を保存するために使用されます。 ConfigMap は、.Values.slurmConfigs.slurmConfigPathInPod パラメータで指定されたパスにマウントされます。指定されたパスは、Slurm 管理クラスタの .Spec.SlurmConfPath パラメータとポッドの起動コマンドにもレンダリングされます。ポッドが起動されると、ConfigMap が /etc/slurm/ パスにコピーされ、ConfigMap へのアクセスが制限されます。 |
ServiceAccount | {{ .Release.Namespace }}/{{ .Values.clusterName }} | このリソースにより、slurmctld ポッドは Slurm 管理クラスタの構成を変更できます。 Slurm 管理クラスタは、このリソースを使用してクラウド上のノードの自動スケーリングを有効にできます。 |
ロール | {{ .Release.Namespace }}/{{ .Values.clusterName }} | このリソースにより、slurmctld ポッドは Slurm 管理クラスタの構成を変更できます。 Slurm 管理クラスタは、このリソースを使用してクラウド上のノードの自動スケーリングを有効にできます。 |
RoleBinding | {{ .Release.Namespace }}/{{ .Values.clusterName }} | このリソースにより、slurmctld ポッドは Slurm 管理クラスタの構成を変更できます。 Slurm 管理クラスタは、このリソースを使用してクラウド上のノードの自動スケーリングを有効にできます。 |
ロール | {{ .Values.slurmOperatorNamespace }}/{{ .Values.clusterName }} | このリソースにより、slurmctld ポッドは SlurmOperator 名前空間のシークレットを変更できます。 Slurm と Kubernetes が同じバッチの物理サーバーにデプロイされている場合、Slurm 管理クラスタは、このリソースを使用してトークンを更新できます。 |
RoleBinding | {{ .Values.slurmOperatorNamespace }}/{{ .Values.clusterName }} | このリソースにより、slurmctld ポッドは SlurmOperator 名前空間のシークレットを変更できます。 Slurm と Kubernetes が同じバッチの物理サーバーにデプロイされている場合、Slurm 管理クラスタは、このリソースを使用してトークンを更新できます。 |
シークレット | {{ .Values.mungeConfigs.secretName }} | このリソースは、Slurm コンポーネントが相互に通信するときに認証に使用されます。 .Values.mungeConfigs.createConfigsBySecret パラメータが True に設定されている場合、このリソースは自動的に作成されます。このリソースには、"munge.key"={{ .Values.mungeConfigs.content }} というコンテンツが含まれています。 .Values.mungeConfigs.createConfigsBySecret パラメータが True に設定されている場合、.Values.mungeConfigs.createConfigsBySecret パラメータは .Spec.MungeConfPath パラメータとしてレンダリングされ、次にポッド内のリソースのマウントパスとしてレンダリングされます。ポッドの起動コマンドは、マウントパスに基づいて /etc/munge/munge.key を初期化します。 |
SlurmCluster | レンダリングされた Slurm 管理クラスタ。 |
次の表に、関連パラメータを示します。
パラメータ | 例 | 説明 |
clusterName | "" | クラスタ名。クラスタ名は、シークレットとロールを生成するために使用されます。値は、他の Slurm 構成ファイルで指定されたクラスタ名と同じである必要があります。 |
headNodeConfig | 該当なし | このパラメータは必須です。このパラメータは、slurmctld ポッドの構成を指定します。 |
workerNodesConfig | 該当なし | slurmd ポッドの構成。 |
workerNodesConfig.deleteSelfBeforeSuspend | true | 値が true に設定されている場合、preStop フックがワーカーポッドに自動的に追加されます。 preStop フックは、ノードが削除される前に自動ノードドレイニングをトリガーし、ノードをスケジューリング不可としてマークします。 |
slurmdbdConfigs | 該当なし | このパラメータは、slurmdbd ポッドの構成を指定します。このパラメータを空のままにすると、slurmdbd を実行するポッドは作成されません。 |
slurmrestdConfigs | 該当なし | このパラメータは、slurmrestd ポッドの構成を指定します。このパラメータを空のままにすると、slurmrestd を実行するポッドは作成されません。 |
headNodeConfig.hostNetwork slurmdbdConfigs.hostNetwork slurmrestdConfigs.hostNetwork workerNodesConfig.workerGroups[].hostNetwork | false | slurmctld ポッドの hostNetwork パラメータとしてレンダリングされます。 |
headNodeConfig.setHostnameAsFQDN slurmdbdConfigs.setHostnameAsFQDN slurmrestdConfigs.setHostnameAsFQDN workerNodesConfig.workerGroups[].setHostnameAsFQDN | false | slurmctld ポッドの setHostnameAsFQDN パラメータとしてレンダリングされます。 |
headNodeConfig.nodeSelector slurmdbdConfigs.nodeSelector slurmrestdConfigs.nodeSelector workerNodesConfig.workerGroups[].nodeSelector | | slurmctld ポッドの nodeSelector パラメータとしてレンダリングされます。 |
headNodeConfig.tolerations slurmdbdConfigs.tolerations slurmrestdConfigs.tolerations workerNodesConfig.workerGroups[].tolerations | | slurmctld ポッドの tolerations としてレンダリングされます。 |
headNodeConfig.affinity slurmdbdConfigs.affinity slurmrestdConfigs.affinity workerNodesConfig.workerGroups[].affinity | | slurmctld ポッドのアフィニティルールとしてレンダリングされます。 |
headNodeConfig.resources slurmdbdConfigs.resources slurmrestdConfigs.resources workerNodesConfig.workerGroups[].resources | | slurmctld ポッドのプライマリコンテナのリソースとしてレンダリングされます。ワーカーポッドのプライマリコンテナのリソース制限は、Slurm ノードのリソース制限としてレンダリングされます。 |
headNodeConfig.image slurmdbdConfigs.image slurmrestdConfigs.image workerNodesConfig.workerGroups[].image | "registry-cn-hangzhou.ack.aliyuncs.com/acs/slurm:23.06-1.6-aliyun-49259f59" | slurmctld イメージとしてレンダリングされます。 ai-models-on-ack/framework/slurm/building-slurm-image at main · AliyunContainerService/ai-models-on-ack (github.com) からカスタムイメージをダウンロードすることもできます。 |
headNodeConfig.imagePullSecrets slurmdbdConfigs.imagePullSecrets slurmrestdConfigs.imagePullSecrets workerNodesConfig.workerGroups[].imagePullSecrets | | slurmctld イメージをプルするために使用されるシークレットとしてレンダリングされます。 |
headNodeConfig.podSecurityContext slurmdbdConfigs.podSecurityContext slurmrestdConfigs.podSecurityContext workerNodesConfig.workerGroups[].podSecurityContext | | slurmctld のセキュリティコンテキストとしてレンダリングされます。 |
headNodeConfig.securityContext slurmdbdConfigs.securityContext slurmrestdConfigs.securityContext workerNodesConfig.workerGroups[].securityContext | | slurmctld ポッドのプライマリコンテナのセキュリティコンテキストとしてレンダリングされます。 |
headNodeConfig.volumeMounts slurmdbdConfigs.volumeMounts slurmrestdConfigs.volumeMounts workerNodesConfig.workerGroups[].volumeMounts | 該当なし | slurmctld ポッドのプライマリコンテナのボリュームマウント構成としてレンダリングされます。 |
headNodeConfig.volumes slurmdbdConfigs.volumes slurmrestdConfigs.volumes workerNodesConfig.workerGroups[].volumes | 該当なし | slurmctld ポッドにマウントされたボリュームとしてレンダリングされます |
slurmConfigs.slurmConfigPathInPod | "" | ポッド内の Slurm 構成ファイルのマウントパス。 Slurm 構成ファイルがボリュームとしてポッドにマウントされている場合、値を slurm.conf ファイルがマウントされているパスに設定する必要があります。ポッドの起動コマンドは、マウントパス内のファイルを /etc/slurm/ パスにコピーし、ファイルへのアクセスを制限します。 |
slurmConfigs.createConfigsByConfigMap | true | Slurm 構成を保存するために ConfigMap を自動的に作成するかどうかを指定します。 |
slurmConfigs.configMapName | "" | Slurm 構成を保存する ConfigMap の名前。 |
slurmConfigs.filesInConfigMap | "" | Slurm 構成を保存するために自動的に作成される ConfigMap 内のコンテンツ。 |
mungeConfigs.mungeConfigPathInPod | 該当なし | ポッド内の MUNGE 構成ファイルのマウントパス。 MUNGE 構成ファイルがボリュームとしてポッドにマウントされている場合、値を munge.key ファイルがマウントされているパスに設定する必要があります。ポッドの起動コマンドは、マウントパス内のファイルを /etc/munge/ パスにコピーし、ファイルへのアクセスを制限します。 |
mungeConfigs.createConfigsBySecret | 該当なし | MUNGE 構成を保存するためにシークレットを自動的に作成するかどうかを指定します。 |
mungeConfigs.secretName | 該当なし | MUNGE 構成を保存するシークレットの名前。 |
mungeConfigs.content | 該当なし | MUNGE 構成を保存するために自動的に作成されるシークレット内のコンテンツ。 |
slurmConfigs.filesInConfigMap の詳細については、Slurm System Configuration Tool (schedmd.com) を参照してください。
ポッドの作成後に slurmConfigs.filesInConfigMap パラメータを変更する場合は、変更を有効にするためにポッドを再作成する必要があります。この場合、ポッドを再作成する前に、パラメータが要件どおりに変更されているかどうかを確認することをお勧めします。
Helm チャートをインストールするには、次の操作を実行します。
次のコマンドを実行して、Alibaba Cloud が提供する Helm リポジトリをローカルの Helm クライアントに追加します。
helm repo add aliyun https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/この操作により、Slurm 管理クラスタを含む、Alibaba Cloud が提供するさまざまなチャートにアクセスできます。
次のコマンドを実行して、Helm チャートをプルして解凍します。
helm pull aliyun/ack-slurm-cluster --untar=trueこの操作により、現在のディレクトリに
ack-slurm-clusterという名前のディレクトリが作成されます。 ack-slurm-cluster ディレクトリには、チャートのすべてのファイルとテンプレートが含まれています。次のコマンドを実行して、values.yaml ファイルのチャートパラメータを変更します。
values.yaml ファイルには、チャートのデフォルト構成が含まれています。このファイルを修正して、ビジネス要件に基づいて、Slurm 構成、リソース要求と制限、ストレージなどのパラメータ設定を変更できます。
cd ack-slurm-cluster vi values.yamlHelm を使用してチャートをインストールします。
cd .. helm install my-slurm-cluster ack-slurm-cluster # my-slurm-cluster を実際の値に置き換えます。この操作により、Slurm 管理クラスタがデプロイされます。
Slurm 管理クラスタがデプロイされているかどうかを確認します。
デプロイメントが完了したら、Kubernetes が提供する
kubectlツールを使用して、デプロイメントステータスを確認できます。 Slurm 管理クラスタが期待どおりに実行されていることを確認します。kubectl get pods -l app.kubernetes.io/name=slurm-cluster
ステップ 3:Slurm 管理対象クラスターにログインする
Kubernetes クラスター管理者としてログインする
Kubernetes クラスターの管理者は、Kubernetes クラスターを管理する権限を持っています。Slurm 管理対象クラスターは、Kubernetes クラスター内のポッドとして実行されます。そのため、Kubernetes クラスター管理者は kubectl を使用して Kubernetes クラスター内の任意の Slurm 管理対象クラスターの任意のポッドにログインでき、デフォルトで Slurm 管理対象クラスターの root ユーザーの権限を持ちます。
Slurm 管理対象クラスターのポッドにログインするには、次のコマンドを実行します。
# クラスター内のポッド名で slurm-job-demo-xxxxx を置き換えます。
kubectl exec -it slurm-job-demo-xxxxx -- bashSlurm 管理対象クラスターの一般ユーザーとしてログインする
Slurm 管理対象クラスターの管理者または一般ユーザーは、kubectl exec コマンドを実行する権限を持っていない場合があります。 Slurm 管理対象クラスターを管理者または一般ユーザーとして使用する場合、SSH を使用して Slurm 管理対象クラスターにログインする必要があります。
長期接続とスケーラビリティのために、サービスの外部 IP アドレスを使用してヘッドポッドにログインできます。このソリューションは、長期的な安定した接続が必要なシナリオに適しています。 Server Load Balancer(SLB)インスタンスとその関連付けられた外部 IP アドレスを使用して、内部ネットワーク内のどこからでも Slurm 管理対象クラスターにアクセスできます。
port-forward コマンドを使用して、一時的にリクエストを転送できます。このソリューションは、
kubectl port-forwardコマンドの継続的な実行に依存しているため、短期の O&M またはデバッグに適しています。
サービスの外部 IP アドレスを使用してヘッドポッドにログインする
クラスター内の内部サービスを外部アクセスに公開する LoadBalancer サービスを作成します。詳細については、「既存の SLB インスタンスを使用してアプリケーションを公開する」または「自動的に作成された SLB インスタンスを使用してアプリケーションを公開する」をご参照ください。
LoadBalancer サービスは、内部向け Classic Load Balancer(CLB)インスタンスを使用する必要があります。
サービスが着信リクエストを想定されるポッドにルーティングできるように、
kai.alibabacloud.com/slurm-cluster: ack-slurm-cluster-1およびkai.alibabacloud.com/slurm-node-type: headラベルをサービスに追加する必要があります。
LoadBalancer サービスの外部 IP アドレスを取得するには、次のコマンドを実行します。
kubectl get svcSSH を使用してサービスに関連付けられたヘッドポッドにログインするには、次のコマンドを実行します。
# $YOURUSER をヘッドポッドの実際のユーザー名に、$EXTERNAL_IP をサービスの外部 IP アドレスに置き換えます。 ssh $YOURUSER@$EXTERNAL_IP
port-forward コマンドを使用してリクエストを転送する
port-forward コマンドを使用してリクエストを転送するには、Kubernetes クラスターの KubeConfig ファイルをローカルホストに保存する必要があります。これはセキュリティリスクを引き起こす可能性があります。本番環境ではこの方法を使用しないことをお勧めします。
リクエスト転送のためにローカルホストのポートを有効にし、ローカルホストのポートをクラスター内で slurmctld が実行されているヘッドポッドのポート 22 にマップするには、次のコマンドを実行します。デフォルトでは、SSH はポート 22 を使用します。
# $NAMESPACE、$CLUSTERNAME、および $LOCALPORT を実際の値に置き換えます。 kubectl port-forward -n $NAMESPACE svc/$CLUSTERNAME $LOCALPORT:22port-forwardコマンドの実行中に、次のコマンドを実行します。現在のホスト上のすべてのユーザーがクラスターにログインしてジョブを送信できます。# $YOURUSER をヘッドポッドにログインするために使用するユーザー名に置き換えます。 ssh -p $LOCALPORT $YOURUSER@localhost
ステップ 4:Slurm 管理クラスタを使用する
以下のセクションでは、Slurm 管理クラスタのノード間でユーザーを同期する方法、ノード間でログを共有する方法、および自動スケーリングを実行する方法について説明します。
ノード間でユーザーを同期する
Slurm は一元化されたユーザー認証サービスを提供していません。sbatch コマンドを実行して Slurm 管理クラスタにジョブを送信する場合、ジョブを送信したユーザーのアカウントが、ジョブの実行に選択されたノードに存在しない場合、ジョブの実行に失敗する可能性があります。この問題を解決するには、ユーザーを管理するために Slurm 管理クラスタの Lightweight Directory Access Protocol (LDAP) を構成します。 LDAP は、認証するための中央集中型バックエンド サービスとして機能します。このようにして、Slurm はサービスに基づいてユーザー ID を認証できます。次の操作を実行します。
ldap.yaml という名前のファイルを作成し、次の内容をファイルにコピーして、ユーザー情報を保存および管理する基本 LDAP インスタンスを作成します。
ldap.yaml ファイルは、LDAP バックエンド ポッドとそれに関連付けられたサービスを定義します。ポッドには LDAP コンテナが含まれており、サービスは LDAP サービスを公開して、ネットワーク内で LDAP サービスにアクセスできるようにします。
次のコマンドを実行して、LDAP バックエンド サービスをデプロイします。
kubectl apply -f ldap.yaml期待される出力:
deployment.apps/ldap created service/ldap-service created secret/ldap-secret createdオプション。 phpldapadmin.yaml という名前のファイルを作成し、次の内容をファイルにコピーして、LDAP フロントエンド ポッドとそれに関連付けられたサービスをデプロイします。 LDAP フロントエンド ポッドとそれに関連付けられたサービスは、管理効率を向上させるためにフロントエンド インターフェースを構成するために使用されます。
次のコマンドを実行して、LDAP フロントエンド サービスをデプロイします。
kubectl apply -f phpldapadmin.yamlステップ 3 に基づいて Slurm 管理クラスタのポッドにログオンし、次のコマンドを実行して LDAP クライアント パッケージをインストールします。
apt update apt install libnss-ldapdlibnss-ldapd パッケージがインストールされた後、ポッド内の Slurm 管理クラスタのネットワーク認証サービスを構成します。
次のコマンドを実行して、スクリプトとファイルを編集するための Vim パッケージをインストールします。
apt update apt install vim/etc/ldap/ldap.conf ファイルの次のパラメータを変更して、LDAP クライアントを構成します。
... BASE dc=example,dc=org # 値を LDAP ディレクトリ構造のルートノードの識別名に置き換えます。 URI ldap://ldap-service # 値を LDAP サーバーの Uniform Resource Identifier (URI) に置き換えます。 .../etc/nslcd.conf ファイルの次のパラメータを変更して、LDAP サーバーへの接続を定義します。
... uri ldap://ldap-service # 値を LDAP サーバーの URI に置き換えます。 base dc=example,dc=org # LDAP ディレクトリ構造に基づいてこのパラメータを指定します。 ... tls_cacertfile /etc/ssl/certs/ca-certificates.crt # LDAP サーバーの証明書を検証するために使用される認証局 (CA) 証明書ファイルへのパスを指定します。 ...
ログを共有およびアクセスする
デフォルトでは、sbatch コマンドを使用するときに生成されるジョブ ログは、ジョブを実行するノードに直接保存されます。これは、ログを表示するのに不便な場合があります。ログを簡単に表示するには、File Storage NAS (NAS) ファイルシステムを作成して、アクセス可能なディレクトリにすべてのジョブ ログを保存します。このようにして、計算ジョブが異なるノードで実行された場合でも、ジョブ用に生成されたログを一元的に収集して保存できます。これはログ管理を容易にします。次の操作を実行します。
各ノードのログを保存および共有するための NAS ファイルシステムを作成します。詳細については、「ファイルシステムを作成する」をご参照ください。
[ACK コンソール] にログオンし、NAS ファイルシステムの永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。詳細については、「静的にプロビジョニングされた NAS ボリュームをマウントする」をご参照ください。
SlurmCluster CR を変更します。
headGroupSpecパラメータとworkerGroupSpecパラメータのvolumeMountsパラメータとvolumesパラメータを構成して、作成された PVC を参照し、PVC を /home ディレクトリにマウントします。例:headGroupSpec: ... # マウントポイントとして /home を指定します。 volumeMounts: - mountPath: /home name: test # PVC を参照するボリュームの名前。 volumes: # PVC の定義を追加します。 - name: test # このパラメータの値は、volumeMounts パラメータの name パラメータの値と同じである必要があります。 persistentVolumeClaim: claimName: test # 値を PVC の名前に置き換えます。 ... workerGroupSpecs: # ... 各 workerGroupSpec パラメータの volume パラメータと volumeMounts パラメータの構成の前述のプロセスを繰り返します。次のコマンドを実行して、SlurmCluster CR をデプロイします。
重要SlurmCluster CR のデプロイに失敗した場合は、
kubectl delete slurmcluster slurm-job-demoコマンドを実行して CR を削除し、再デプロイします。kubectl apply -f slurmcluster.yamlSlurmCluster CR がデプロイされると、ワーカー ノードは NAS ファイルシステムを共有できます。
Slurm 管理クラスタの自動スケーリングを実行する
デフォルトの Slurm イメージのルート パスには、slurm-resume.sh、slurm-suspend.sh、slurmctld-copilot などの実行可能ファイルとスクリプトが含まれています。これらは、slurmctld と対話して Slurm 管理クラスタをスケーリングするために使用されます。
クラウド上のノードに基づく Slurm クラスタの自動スケーリング
ローカル ノード:slurmctld に直接接続されている物理計算ノード。
クラウド上のノード:論理ノード。論理ノードは、クラウド サービス プロバイダーがオンデマンドで作成および破棄できる VM インスタンスです。
ACK での Slurm の自動スケーリング
手順
自動スケーリング権限を構成します。Helm がインストールされている場合、自動スケーリング権限は slurmctld ポッドに対して自動的に構成されます。このステップはスキップできます。
ヘッド ポッドには、自動スケーリングのために SlurmCluster CR にアクセスして更新するための権限が必要です。したがって、自動スケーリング機能を使用する場合は、RBAC を使用してヘッド ポッドに必要な権限を付与することをお勧めします。次の手順を実行して権限を構成できます。
まず、slurmctld ポッドに必要なサービスアカウント、ロール、およびロール バインディングを作成する必要があります。例:Slurm 管理クラスタの名前を
slurm-job-demoに設定し、名前空間をdefaultに設定します。rbac.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。apiVersion: v1 kind: ServiceAccount metadata: name: slurm-job-demo --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: slurm-job-demo rules: - apiGroups: ["kai.alibabacloud.com"] resources: ["slurmclusters"] verbs: ["get", "watch", "list", "update", "patch"] resourceNames: ["slurm-job-demo"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: slurm-job-demo subjects: - kind: ServiceAccount name: slurm-job-demo roleRef: kind: Role name: slurm-job-demo apiGroup: rbac.authorization.k8s.iokubectl apply -f rbac.yamlコマンドを実行して、リソース リストを送信します。slurmctld ポッドに権限を付与します。
kubectl edit slurmcluster slurm-job-demoコマンドを実行して、Slurm 管理クラスタを変更します。Spec.Slurmctld.Template.Spec.ServiceAccountName パラメータを作成したサービスアカウントに設定します。apiVersion: kai.alibabacloud.com/v1 kind: SlurmCluster ... spec: slurmctld: template: spec: serviceAccountName: slurm-job-demo ...slurmctld を管理する StatefulSet を再構築して、行った変更を適用します。
kubectl get sts slurm-job-demoコマンドを実行して、slurmctld ポッドを管理する StatefulSet を見つけます。kubectl delete sts slurm-job-demoコマンドを実行して、この StatefulSet を削除します。Slurm Operator は StatefulSet を再構築し、新しい構成を適用します。自動スケーリング ファイル /etc/slurm/slurm.conf を構成します。
共有ボリュームを使用して ConfigMap を管理する
# クラウド上のノードを使用する場合は、次のパラメータが必要です。 # SuspendProgram 機能と ResumeProgram 機能は、Alibaba Cloud によって開発されています。 SuspendTimeout=600 ResumeTimeout=600 # ノードでジョブが実行されていないときにノードが自動的にサスペンドされる間隔。 SuspendTime=600 # 1 分あたりにスケーリングできるノード数を設定します。 ResumeRate=1 SuspendRate=1 # NodeName パラメータの値を ${cluster_name}-worker-${group_name}- 形式で設定する必要があります。この行でノードのリソース量を指定する必要があります。そうしないと、slurmctld ポッドは # ノードに vCPU が 1 つだけあると見なします。クラウド上のノードで指定したリソースが、workerGroupSpec パラメータで宣言されたリソースと同じであることを確認してください。そうしないと、リソースが浪費される可能性があります。 NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD # 次の構成は固定されています。変更しないでください。 CommunicationParameters=NoAddrCache ReconfigFlags=KeepPowerSaveSettings SuspendProgram="/slurm-suspend.sh" ResumeProgram="/slurm-resume.sh"ConfigMap を手動で管理する。
slurm.confがslurm-configの ConfigMap に保存されている場合は、kubectl edit slurm-configコマンドを実行して、次の構成を ConfigMap に追加できます。slurm.conf: ... # クラウド上のノードを使用する場合は、次のパラメータが必要です。 # SuspendProgram 機能と ResumeProgram 機能は、Alibaba Cloud によって開発されています。 SuspendTimeout=600 ResumeTimeout=600 # ノードでジョブが実行されていないときにノードが自動的にサスペンドされる間隔。 SuspendTime=600 # 1 分あたりにスケーリングできるノード数を設定します。 ResumeRate=1 SuspendRate=1 # NodeName パラメータの値を ${cluster_name}-worker-${group_name}- 形式で設定する必要があります。この行でノードのリソース量を指定する必要があります。そうしないと、slurmctld ポッドは # ノードに vCPU が 1 つだけあると見なします。クラウド上のノードで指定したリソースが、workerGroupSpec パラメータで宣言されたリソースと同じであることを確認してください。そうしないと、リソースが浪費される可能性があります。 NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD # 次の構成は固定されています。変更しないでください。 CommunicationParameters=NoAddrCache ReconfigFlags=KeepPowerSaveSettings SuspendProgram="/slurm-suspend.sh" ResumeProgram="/slurm-resume.sh"Helm を使用して ConfigMap を管理する
次の ConfigMap を values.yaml ファイルに追加します。
slurm.conf: ... # クラウド上のノードを使用する場合は、次のパラメータが必要です。 # SuspendProgram 機能と ResumeProgram 機能は、Alibaba Cloud によって開発されています。 SuspendTimeout=600 ResumeTimeout=600 # ノードでジョブが実行されていないときにノードが自動的にサスペンドされる間隔。 SuspendTime=600 # 1 分あたりにスケーリングできるノード数を設定します。 ResumeRate=1 SuspendRate=1 # NodeName パラメータの値を ${cluster_name}-worker-${group_name}- 形式で設定する必要があります。この行でノードのリソース量を指定する必要があります。そうしないと、slurmctld ポッドは # ノードに vCPU が 1 つだけあると見なします。クラウド上のノードで指定したリソースが、workerGroupSpec パラメータで宣言されたリソースと同じであることを確認してください。そうしないと、リソースが浪費される可能性があります。 NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD # 次の構成は固定されています。変更しないでください。 CommunicationParameters=NoAddrCache ReconfigFlags=KeepPowerSaveSettings SuspendProgram="/slurm-suspend.sh" ResumeProgram="/slurm-resume.sh"helm upgradeコマンドを実行して、Slurm 構成を更新します。
新しい構成を適用する
Slurm 管理クラスタの名前が
slurm-job-demoの場合は、kubectl delete sts slurm-job-demoコマンドを実行して、slurmctld ポッドの新しい構成を適用します。slurmcluster.yaml ファイルのワーカー ノード レプリカの数を 0 に変更して、後続の手順でノード スケーリング アクティビティを表示できるようにします。
手動管理
Slurm 管理クラスタの名前を
slurm-job-demoに設定します。kubectl edit slurmcluster slurm-job-demoコマンドを実行して、Slurm 管理クラスタの workerCount の値を 10 に変更します。この操作により、ワーカー ノード レプリカの数が 0 に変更されます。Helm を使用した管理
values.yaml ファイルで、.Values.workerGroup[].workerCount パラメータを 0 に変更します。次に、
helm upgrade slurm-job-demo .コマンドを実行して、現在の Helm チャートを更新します。この操作により、ワーカー ノード レプリカの数が 0 に設定されます。sbatch コマンドを使用してジョブを送信します。
次のコマンドを実行して、シェル スクリプトを作成します。
cat << EOF > cloudnodedemo.shコマンド プロンプトの後に次の内容を入力します。
> #!/bin/bash > srun hostname > EOF次のコマンドを実行して、スクリプトの内容が正しいかどうかを確認します。
cat cloudnodedemo.sh期待される出力:
#!/bin/bash srun hostname出力は、スクリプトの内容が正しいことを示しています。
次のコマンドを実行して、処理のためにスクリプトを Slurm 管理クラスタに送信します。
sbatch cloudnodedemo.sh期待される出力:
Submitted batch job 1出力は、ジョブが送信され、ジョブ ID が割り当てられたことを示しています。
クラスタ スケーリングの結果を表示します。
次のコマンドを実行して、Slurm 管理クラスタのスケーリング ログを表示します。
cat /var/log/slurm-resume.log期待される出力:
namespace: default cluster: slurm-demo resume called, args [slurm-demo-worker-cpu-0] slurm cluster metadata: default slurm-demo get SlurmCluster CR slurm-demo succeed hostlists: [slurm-demo-worker-cpu-0] resume node slurm-demo-worker-cpu-0 resume worker -cpu-0 resume node -cpu-0 end出力は、Slurm 管理クラスタがワークロードに基づいて計算ノードを 1 つ自動的に追加して、送信されたジョブを実行することを示しています。
次のコマンドを実行して、クラスタ内のポッドを表示します。
kubectl get pod期待される出力:
NAME READY STATUS RESTARTS AGE slurm-demo-head-9hn67 1/1 Running 0 21m slurm-demo-worker-cpu-0 1/1 Running 0 43s出力は、slurm-demo-worker-cpu-0 ポッドがクラスタに追加されたことを示しています。この場合、ジョブが送信されるとクラスタはスケールアウトされます。
次のコマンドを実行して、クラスタ内のノードを表示します。
sinfo期待される出力:
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 10 idle~ slurm-job-demo-worker-cpu-[2-10] debug* up infinite 1 idle slurm-job-demo-worker-cpu-[0-1]出力は、slurm-demo-worker-cpu-0 ノードが新しく起動されたノードであり、さらに 10 個のクラウド上のノードがスケールアウトに使用できることを示しています。
次のコマンドを実行して、実行されたジョブに関する情報を表示します。
scontrol show job 1期待される出力:
JobId=1 JobName=cloudnodedemo.sh UserId=root(0) GroupId=root(0) MCS_label=N/A Priority=4294901757 Nice=0 Account=(null) QOS=(null) JobState=COMPLETED Reason=None Dependency=(null) Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0 RunTime=00:00:00 TimeLimit=UNLIMITED TimeMin=N/A SubmitTime=2024-05-28T11:37:36 EligibleTime=2024-05-28T11:37:36 AccrueTime=2024-05-28T11:37:36 StartTime=2024-05-28T11:37:36 EndTime=2024-05-28T11:37:36 Deadline=N/A SuspendTime=None SecsPreSuspend=0 LastSchedEval=2024-05-28T11:37:36 Scheduler=Main Partition=debug AllocNode:Sid=slurm-job-demo:93 ReqNodeList=(null) ExcNodeList=(null) NodeList=slurm-demo-worker-cpu-0 BatchHost=slurm-demo-worker-cpu-0 NumNodes=1 NumCPUs=1 NumTasks=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:* ReqTRES=cpu=1,mem=1M,node=1,billing=1 AllocTRES=cpu=1,mem=1M,node=1,billing=1 Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=* MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0 Features=(null) DelayBoot=00:00:00 OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null) Command=//cloudnodedemo.sh WorkDir=/ StdErr=//slurm-1.out StdIn=/dev/null StdOut=//slurm-1.out Power=出力の NodeList=slurm-demo-worker-cpu-0 は、ジョブが新しく追加されたノードで実行されていることを示しています。
しばらくしてから、次のコマンドを実行して、ノード スケールインの結果を表示します。
sinfo期待される出力:
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 11 idle~ slurm-demo-worker-cpu-[0-10]出力は、スケールアウトに使用できるノードの数が 11 になったことを示しています。これは、自動スケールインが完了したことを示しています。