すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ACK クラスター上での Slurm のコンテナー化とデプロイ

最終更新日:Mar 01, 2026

Container Service for Kubernetes (ACK) は、Slurm on Kubernetes ソリューションと ack-slurm-operator コンポーネントを提供します。これらを組み合わせることで、ハイパフォーマンスコンピューティング (HPC) や大規模な AI および機械学習 (ML) ワークロード向けに、ACK クラスターで Simple Linux Utility for Resource Management (Slurm) スケジューリングシステムをデプロイおよび管理できます。

Slurm の概要

Slurm は、クラスターリソース管理とジョブスケジューリングのための強力なオープンソースプラットフォームです。スーパーコンピューターや大規模な計算クラスターのパフォーマンスと効率を最適化するように設計されています。以下の図は、その主要コンポーネントがどのように連携して動作するかを示しています。

image
  • slurmctld:Slurm 制御デーモン。Slurm の中央管理コンポーネントとして、slurmctld はシステムリソースを監視し、ジョブをスケジュールし、クラスターの状態を管理します。セカンダリ slurmctld を設定してフェイルオーバーを行い、高可用性を確保できます。

  • slurmd:Slurm ノードデーモン。各計算ノードにデプロイされ、slurmd は slurmctld からの命令を受け取り、ジョブの開始と実行、ジョブステータスの報告、新しいジョブ割り当ての準備など、ジョブのライフサイクルを管理します。ジョブは slurmd を通じてスケジュールされます。

  • slurmdbd:Slurm データベースデーモン。このオプションのコンポーネントは、ジョブ履歴とアカウンティング情報のための中央集権的なデータベースを維持します。大規模クラスターの長期的な管理と監査に不可欠です。slurmdbd は、複数の Slurm 管理クラスターにまたがるデータを集約して、データ管理を簡素化できます。

  • Slurm CLI:Slurm は、ジョブ管理とシステム監視のために以下のコマンドラインツールを提供します:

    • scontrol:クラスターを管理し、クラスター構成を制御します。

    • squeue:キュー内のジョブのステータスを照会します。

    • srun:ジョブを投入し、管理します。

    • sbatch:コンピューティングリソースのスケジューリングと管理のために、ジョブをバッチで投入します。

    • sinfo:ノードの可用性を含む、クラスターの全体的なステータスを照会します。

Slurm on ACK の概要

Slurm オペレーターは、SlurmCluster カスタムリソース (CR) を使用して、Slurm クラスターの管理に必要な構成ファイルを定義します。これにより、Slurm 管理クラスターのデプロイとメンテナンスが簡素化され、コントロールプレーンの管理問題が解決されます。以下の図は、Slurm on ACK のアーキテクチャを示しています。

image

クラスター管理者は、SlurmCluster CR を定義することによって Slurm 管理クラスターをデプロイおよび管理します。その後、Slurm オペレーターはこの CR に基づいてクラスター内に Slurm 制御コンポーネントを作成します。Slurm 構成ファイルは、共有ボリュームまたは ConfigMap を使用して制御コンポーネントにマウントできます。

前提条件

Kubernetes 1.22 以降を実行し、GPU 高速化ノードを 1 つ含む ACK クラスターが作成されている必要があります。 詳細については、「GPU 高速化ノードを持つ ACK クラスターの作成」および「クラスターの更新」をご参照ください。

ステップ 1:ack-slurm-operator コンポーネントのインストール

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[マーケットプレイス] > [マーケットプレイス] を選択します。

  2. [マーケットプレイス] ページで、ack-slurm-operator を検索し、コンポーネントをクリックします。詳細ページで、右上隅の [デプロイ] をクリックします。[デプロイ] パネルで、パラメーターを設定します。[クラスター] パラメーターのみを指定する必要があります。他のすべてのパラメーターはデフォルト設定を使用します。

  3. パラメーターを設定した後、[OK] をクリックします。

ステップ 2:Slurm 管理クラスターの作成

Slurm 管理クラスターは、手動または Helm を使用して作成できます。ニーズに最も適した方法を選択してください。

Slurm 管理クラスターの手動作成

MUNGE 認証 Secret の作成

MUNGE (MUNGE Uid 'N' Gid Emporium) は、Slurm コンポーネント間の認証を提供します。MUNGE キーを保存するために Kubernetes Secret を作成する必要があります。

  1. 次のコマンドを実行して、OpenSSL を使用してキーを生成します:

       openssl rand -base64 512 | tr -d '\r\n'
  2. 次のコマンドを実行して、生成されたキーを保存する Secret を作成します:

    • <$MungeKeyName> を、mungekey のようなキーのカスタム名に置き換えます。

    • <$MungeKey> を、前のステップで生成されたキー文字列に置き換えます。

       kubectl create secret generic <$MungeKeyName> --from-literal=munge.key=<$MungeKey>

Secret を作成した後、MUNGE ベースの認証のために Slurm 管理クラスターに設定または関連付けることができます。

Slurm 管理クラスター用 ConfigMap の作成

この例では、CR の slurmConfPath パラメーターを指定することで、ConfigMap が Pod にマウントされます。これにより、Pod が再作成された場合でも、Pod の構成が自動的に期待される状態に復元されることが保証されます。

以下のサンプルコードの data パラメーターは、サンプルの ConfigMap を指定しています。ConfigMap を生成するには、Easy Configurator または Full Configurator ツールを使用することを推奨します。

サンプルコードの表示

kubectl create -f - << EOF
apiVersion: v1
data:
  slurm.conf: |
    ProctrackType=proctrack/linuxproc
    ReturnToService=1
    SlurmctldPidFile=/var/run/slurmctld.pid
    SlurmctldPort=6817
    SlurmdPidFile=/var/run/slurmd.pid
    SlurmdPort=6818
    SlurmdSpoolDir=/var/spool/slurmd
    SlurmUser=root # テスト2
    StateSaveLocation=/var/spool/slurmctld
    TaskPlugin=task/none
    InactiveLimit=0
    KillWait=30
    MinJobAge=300
    SlurmctldTimeout=120
    SlurmdTimeout=300
    Waittime=0
    SchedulerType=sched/builtin
    SelectType=select/cons_tres
    JobCompType=jobcomp/none
    JobAcctGatherFrequency=30
    SlurmctldDebug=info
    SlurmctldLogFile=/var/log/slurmctld.log
    SlurmdDebug=info
    SlurmdLogFile=/var/log/slurmd.log
    TreeWidth=65533
    MaxNodeCount=10000
    PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP

    ClusterName=slurm-job-demo
    # SlurmctldHost を、-0 サフィックスが付いた Slurm 管理クラスターの名前に設定します。高可用性デプロイメントの場合、
    # 次の設定を使用できます。サフィックスは slurmctld レプリカの数に依存します:
    # SlurmctldHost=slurm-job-demo-0
    # SlurmctldHost=slurm-job-demo-1
    SlurmctldHost=slurm-job-demo-0
kind: ConfigMap
metadata:
  name: slurm-test
  namespace: default
EOF

期待される出力:

configmap/slurm-test created

この出力は、ConfigMap が作成されたことを示します。

SlurmCluster CR の送信

説明 この例では、Compute Unified Device Architecture (CUDA) 11.4 と Slurm 23.06 を含む Ubuntu イメージが使用されます。このイメージには、オンクラウドノードのオートスケーリングのために Alibaba Cloud が開発したコンポーネントが含まれています。カスタムイメージを使用したい場合は、作成してアップロードすることができます。
  1. slurmcluster.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。この SlurmCluster CR は、1 つのヘッドノードと 4 つのワーカーノードを持つ Slurm 管理クラスターを作成します。このクラスターは ACK クラスター内で Pod として実行されます。SlurmCluster CR の mungeConfPathslurmConfPath パラメーターの値は、slurmctldworkerGroupSpecs セクションで指定されたマウントポイントと一致する必要があります。

    YAML ファイルの内容を表示

       # この Kubernetes リソースは、kai のカスタムリソース (CR) を使用して ACK 上に Slurm 管理クラスターをデプロイします。
       apiVersion: kai.alibabacloud.com/v1
       kind: SlurmCluster
       metadata:
         name: slurm-job-demo # クラスターの名前。
         namespace: default # クラスターがデプロイされる名前空間。
       spec:
         mungeConfPath: /var/munge # MUNGE 構成ファイルのパス。
         slurmConfPath: /var/slurm # Slurm 構成ファイルのパス。
         slurmctld: # ヘッドノードの仕様。コントローラーは StatefulSet を作成してヘッドノードを管理します。
           template:
             metadata: {}
             spec:
               containers:
               - image: registry-cn-hangzhou.ack.aliyuncs.com/acs/slurm-cuda:23.06-aliyun-cuda-11.4
                 imagePullPolicy: Always
                 name: slurmctld
                 ports:
                 - containerPort: 8080
                   protocol: TCP
                 resources:
                   requests:
                     cpu: "1"
                     memory: 1Gi
                 volumeMounts:
                 - mountPath: /var/slurm # Slurm 構成ファイルのマウントポイント。
                   name: config-slurm-test
                 - mountPath: /var/munge # MUNGE 認証キーのマウントポイント。
                   name: secret-slurm-test
               volumes:
               - configMap:
                   name: slurm-test
                 name: config-slurm-test
               - name: secret-slurm-test
                 secret:
                   secretName: slurm-test
         workerGroupSpecs: # ワーカーノードの仕様。この例では、cpu と cpu1 の 2 つのノードグループが定義されています。
         - groupName: cpu
           replicas: 2
           template:
             metadata: {}
             spec:
               containers:
               - env:
                 - name: NVIDIA_REQUIRE_CUDA
                 image: registry-cn-hangzhou.ack.aliyuncs.com/acs/slurm-cuda:23.06-aliyun-cuda-11.4
                 imagePullPolicy: Always
                 name: slurmd
                 resources:
                   requests:
                     cpu: "1"
                     memory: 1Gi
                 volumeMounts:
                 - mountPath: /var/slurm
                   name: config-slurm-test
                 - mountPath: /var/munge
                   name: secret-slurm-test
               volumes:
               - configMap:
                   name: slurm-test
                 name: config-slurm-test
               - name: secret-slurm-test
                 secret:
                   secretName: slurm-test
         - groupName: cpu1 # cpu1 ノードグループの定義。cpu と同様です。ビジネス要件に基づいてリソースや構成を変更します。
           replicas: 2
           template:
             metadata: {}
             spec:
               containers:
               - env:
                 - name: NVIDIA_REQUIRE_CUDA
                 image: registry-cn-hangzhou.ack.aliyuncs.com/acs/slurm-cuda:23.06-aliyun-cuda-11.4
                 imagePullPolicy: Always
                 name: slurmd
                 resources:
                   requests:
                     cpu: "1"
                     memory: 1Gi
                 securityContext: # Pod が特権モードで実行されることを許可する Security Context 構成。
                   privileged: true
                 volumeMounts:
                 - mountPath: /var/slurm
                   name: config-slurm-test
                 - mountPath: /var/munge
                   name: secret-slurm-test
               volumes:
               - configMap:
                   name: slurm-test
                 name: config-slurm-test
               - name: secret-slurm-test
                 secret:
                   secretName: slurm-test
  2. 次のコマンドを実行して、slurmcluster.yaml ファイルをクラスターにデプロイします: 期待される出力:

       kubectl apply -f slurmcluster.yaml
       slurmcluster.kai.alibabacloud.com/slurm-job-demo created
  3. 次のコマンドを実行して、Slurm 管理クラスターが期待どおりに実行されていることを確認します: 期待される出力: この出力は、Slurm 管理クラスターがデプロイされ、その 5 つのノードが準備完了状態であることを示します。

       kubectl get slurmcluster
       NAME             AVAILABLE WORKERS   STATUS   AGE
       slurm-job-demo   5                   ready    14m
  4. 次のコマンドを実行して、slurm-job-demo という名前の Slurm 管理クラスター内のすべての Pod が Running 状態であることを確認します: 期待される出力: この出力は、ヘッドノードと 4 つのワーカーノードが期待どおりに実行されていることを確認します。

       kubectl get pods -l app.kubernetes.io/name=slurm-cluster
       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

Helm を使用した Slurm 管理クラスターの作成

柔軟な構成で Slurm 管理クラスターを迅速にインストールおよび管理するために、Alibaba Cloud が提供する SlurmCluster チャートを Helm を使用してインストールできます。Helm チャートは charts-incubator (Alibaba Cloud チャートリポジトリ) からダウンロードします。パラメーターを設定すると、Helm はロールベースのアクセス制御 (RBAC)、ConfigMap、Secret、Slurm 管理クラスターなどのリソースを作成します。

Helm チャートによって作成されるリソース

リソースタイプリソース名説明
ConfigMap{{ .Values.slurmConfigs.configMapName }}.Values.slurmConfigs.createConfigsByConfigMapTrue に設定されている場合、この ConfigMap はユーザー定義の Slurm 構成を保存します。これは .Values.slurmConfigs.slurmConfigPathInPod で指定されたパスにマウントされ、Slurm 管理クラスターの .Spec.SlurmConfPath としてもレンダリングされます。Pod の起動時に、ConfigMap は /etc/slurm/ にコピーされ、アクセスが制限されます。
ServiceAccount{{ .Release.Namespace }}/{{ .Values.clusterName }}slurmctld Pod が SlurmCluster CR 構成を変更できるようにし、オンクラウドノードのオートスケーリングを有効にします。
Role{{ .Release.Namespace }}/{{ .Values.clusterName }}slurmctld Pod にオートスケーリングのための SlurmCluster CR 構成を変更する権限を付与します。
RoleBinding{{ .Release.Namespace }}/{{ .Values.clusterName }}オートスケーリング権限のために Role を ServiceAccount にバインドします。
Role{{ .Values.slurmOperatorNamespace }}/{{ .Values.clusterName }}slurmctld Pod が SlurmOperator 名前空間の Secret を変更できるようにします。Slurm と Kubernetes が同じ物理サーバー群にデプロイされている場合、Slurm 管理クラスターはこのリソースを使用してトークンを更新できます。
RoleBinding{{ .Values.slurmOperatorNamespace }}/{{ .Values.clusterName }}トークン更新のためにオペレーター名前空間の Role を ServiceAccount にバインドします。
Secret{{ .Values.mungeConfigs.secretName }}Slurm コンポーネント通信のための MUNGE 認証キーを保存します。.Values.mungeConfigs.createConfigsBySecretTrue に設定されている場合、この Secret は "munge.key"={{ .Values.mungeConfigs.content }} で自動的に作成されます。マウントパスは .Spec.MungeConfPath からレンダリングされ、Pod の起動コマンドはこのパスから /etc/munge/munge.key を初期化します。
SlurmClusterレンダリングされた Slurm 管理クラスター。

Helm チャートのパラメーター

パラメーター説明
clusterName""クラスター名。Secret とロールの生成に使用されます。値は Slurm 構成ファイル内のクラスター名と一致する必要があります。
headNodeConfigN/A必須。slurmctld Pod を構成します。
workerNodesConfigN/Aslurmd Pod を構成します。
workerNodesConfig.deleteSelfBeforeSuspendtruetrue に設定すると、ワーカー Pod に preStop フックが自動的に追加されます。これにより、ノードが削除される前に自動的にノードのドレインがトリガーされ、ノードがスケジュール不可としてマークされます。
slurmdbdConfigsN/Aslurmdbd Pod を構成します。空のままにすると、slurmdbd Pod は作成されません。
slurmrestdConfigsN/Aslurmrestd Pod を構成します。空のままにすると、slurmrestd Pod は作成されません。
headNodeConfig.hostNetwork / slurmdbdConfigs.hostNetwork / slurmrestdConfigs.hostNetwork / workerNodesConfig.workerGroups[].hostNetworkfalseそれぞれの Pod の hostNetwork パラメーターとしてレンダリングされます。
headNodeConfig.setHostnameAsFQDN / slurmdbdConfigs.setHostnameAsFQDN / slurmrestdConfigs.setHostnameAsFQDN / workerNodesConfig.workerGroups[].setHostnameAsFQDNfalseそれぞれの Pod の setHostnameAsFQDN パラメーターとしてレンダリングされます。
headNodeConfig.nodeSelector / slurmdbdConfigs.nodeSelector / slurmrestdConfigs.nodeSelector / workerNodesConfig.workerGroups[].nodeSelectornodeSelector:
example: example

それぞれの Pod の nodeSelector パラメーターとしてレンダリングされます。
headNodeConfig.tolerations / slurmdbdConfigs.tolerations / slurmrestdConfigs.tolerations / workerNodesConfig.workerGroups[].tolerationstolerations:
- key:
value:
operator:







それぞれの Pod の tolerations としてレンダリングされます。
headNodeConfig.affinity / slurmdbdConfigs.affinity / slurmrestdConfigs.affinity / workerNodesConfig.workerGroups[].affinityaffinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- zone-a
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value














































それぞれの Pod のアフィニティルールとしてレンダリングされます。
headNodeConfig.resources / slurmdbdConfigs.resources / slurmrestdConfigs.resources / workerNodesConfig.workerGroups[].resourcesresources:
requests:
cpu: 1
limits:
cpu: 1










それぞれの Pod のプライマリコンテナーのリソースとしてレンダリングされます。ワーカー Pod のプライマリコンテナーのリソース制限は、Slurm ノードのリソース制限としてレンダリングされます。
headNodeConfig.image / slurmdbdConfigs.image / slurmrestdConfigs.image / workerNodesConfig.workerGroups[].image"registry-cn-hangzhou.ack.aliyuncs.com/acs/slurm:23.06-1.6-aliyun-49259f59"コンテナーイメージとしてレンダリングされます。ai-models-on-ack/framework/slurm/building-slurm-image からカスタムイメージをビルドすることもできます。
headNodeConfig.imagePullSecrets / slurmdbdConfigs.imagePullSecrets / slurmrestdConfigs.imagePullSecrets / workerNodesConfig.workerGroups[].imagePullSecretsimagePullSecrets:
- name: example

コンテナーイメージをプルするために使用される Secret としてレンダリングされます。
headNodeConfig.podSecurityContext / slurmdbdConfigs.podSecurityContext / slurmrestdConfigs.podSecurityContext / workerNodesConfig.workerGroups[].podSecurityContextpodSecurityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
supplementalGroups: [4000]










Pod レベルの Security Context としてレンダリングされます。
headNodeConfig.securityContext / slurmdbdConfigs.securityContext / slurmrestdConfigs.securityContext / workerNodesConfig.workerGroups[].securityContextsecurityContext:
allowPrivilegeEscalation: false

プライマリコンテナーの Security Context としてレンダリングされます。
headNodeConfig.volumeMounts / slurmdbdConfigs.volumeMounts / slurmrestdConfigs.volumeMounts / workerNodesConfig.workerGroups[].volumeMountsN/Aプライマリコンテナーのボリュームマウント構成としてレンダリングされます。
headNodeConfig.volumes / slurmdbdConfigs.volumes / slurmrestdConfigs.volumes / workerNodesConfig.workerGroups[].volumesN/APod にマウントされるボリュームとしてレンダリングされます。
slurmConfigs.slurmConfigPathInPod""Pod 内の Slurm 構成ファイルのマウントパス。構成ファイルがボリュームとしてマウントされている場合、この値を slurm.conf がマウントされているパスに設定します。Pod の起動コマンドはファイルを /etc/slurm/ にコピーし、アクセスを制限します。
slurmConfigs.createConfigsByConfigMaptrueSlurm 構成用の ConfigMap を自動的に作成するかどうかを指定します。
slurmConfigs.configMapName""Slurm 構成を保存する ConfigMap の名前。
slurmConfigs.filesInConfigMap""自動的に作成される ConfigMap の内容。
mungeConfigs.mungeConfigPathInPodN/APod 内の MUNGE 構成ファイルのマウントパス。構成ファイルがボリュームとしてマウントされている場合、この値を munge.key がマウントされているパスに設定します。Pod の起動コマンドはファイルを /etc/munge/ にコピーし、アクセスを制限します。
mungeConfigs.createConfigsBySecretN/AMUNGE 構成用の Secret を自動的に作成するかどうかを指定します。
mungeConfigs.secretNameN/AMUNGE 構成を保存する Secret の名前。
mungeConfigs.contentN/A自動的に作成される Secret の内容。

slurmConfigs.filesInConfigMap の詳細については、「Slurm System Configuration Tool (schedmd.com)」をご参照ください。

重要

Pod の作成後に slurmConfigs.filesInConfigMap を変更した場合、変更を有効にするには Pod を再作成する必要があります。Pod を再作成する前に変更を確認することを推奨します。

Helm チャートのインストール

  1. 次のコマンドを実行して、Alibaba Cloud Helm リポジトリをローカルの Helm クライアントに追加します: これにより、Slurm 管理クラスターチャートを含む、Alibaba Cloud が提供するさまざまなチャートにアクセスできるようになります。

       helm repo add aliyun https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
  2. 次のコマンドを実行して、Helm チャートをプルして解凍します: これにより、現在のディレクトリに ack-slurm-cluster という名前のディレクトリが作成されます。このディレクトリには、すべてのチャートファイルとテンプレートが含まれています。

       helm pull aliyun/ack-slurm-cluster --untar=true
  3. values.yaml ファイルでチャートのパラメーターを変更します。values.yaml ファイルには、デフォルトのチャート構成が含まれています。このファイルを変更して、Slurm 構成、リソースのリクエストと制限、ストレージなどのパラメーター設定を要件に合わせてカスタマイズします。

       cd ack-slurm-cluster
       vi values.yaml
  4. Helm を使用してチャートをインストールします: これにより、Slurm 管理クラスターがデプロイされます。

       cd ..
       helm install my-slurm-cluster ack-slurm-cluster # my-slurm-cluster を希望のリリース名に置き換えます。
  5. Slurm 管理クラスターがデプロイされたことを確認します。デプロイが完了したら、kubectl を使用してデプロイステータスを確認し、Slurm 管理クラスターが期待どおりに実行されていることを確認します:

       kubectl get pods -l app.kubernetes.io/name=slurm-cluster

ステップ 3:Slurm 管理クラスターへのログイン

Kubernetes クラスター管理者としてのログイン

Kubernetes クラスター管理者は、Kubernetes クラスター全体を管理する権限を持っています。Slurm 管理クラスターは Kubernetes クラスター内で Pod として実行されるため、管理者は kubectl を使用して任意の Slurm 管理クラスターの任意の Pod にログインでき、デフォルトでルート権限を持ちます。

次のコマンドを実行して、Slurm 管理クラスターの Pod にログインします:

# slurm-job-demo-head-x9sgs をご利用のクラスター内の Pod の名前に置き換えます。
kubectl exec -it slurm-job-demo-xxxxx -- bash

Slurm 管理クラスターの一般ユーザーとしてのログイン

Slurm 管理クラスターの管理者または一般ユーザーは、kubectl exec コマンドを実行する権限を持っていない場合があります。この場合、SSH を使用して Slurm 管理クラスターにログインできます。2 つの方法があります:

  • LoadBalancer サービス:サービスの外部 IP アドレスを使用してヘッド Pod にアクセスします。この方法は、長期的で安定した接続に適しています。Classic Load Balancer (CLB) インスタンスとその外部 IP アドレスを使用して、内部ネットワーク内のどこからでも Slurm 管理クラスターにアクセスできます。

  • ポートフォワーディング:一時的なアクセスのために kubectl port-forward コマンドを使用します。この方法は、ポートフォワードコマンドを継続的に実行する必要があるため、短期的な運用保守 (O&M) やデバッグに適しています。

LoadBalancer サービスを使用したヘッド Pod へのログイン

  1. LoadBalancer サービスを作成して、クラスター内の内部サービスを外部アクセス可能にします。詳細については、「既存の SLB インスタンスを使用してアプリケーションを公開する」または「自動的に作成された SLB インスタンスを使用してアプリケーションを公開する」をご参照ください。

    • LoadBalancer サービスは、内部向け Classic Load Balancer (CLB) インスタンスを使用する必要があります。

    • サービスに次のラベルを追加して、受信リクエストを期待される Pod にルーティングするようにします:

      • kai.alibabacloud.com/slurm-cluster: ack-slurm-cluster-1

      • kai.alibabacloud.com/slurm-node-type: head

  2. 次のコマンドを実行して、LoadBalancer サービスの外部 IP アドレスを取得します:

       kubectl get svc
  3. 次のコマンドを実行して、SSH を使用してヘッド Pod にログインします:

       # $YOURUSER をユーザー名に、$EXTERNAL_IP をサービスの外部 IP アドレスに置き換えます。
       ssh $YOURUSER@$EXTERNAL_IP

port-forward コマンドを使用したリクエストの転送

警告

port-forward コマンドを使用するには、Kubernetes クラスターの kubeconfig ファイルをローカルホストに保存する必要があります。これはセキュリティリスクを引き起こす可能性があります。本番環境ではこの方法を使用しないことを推奨します。

  1. 次のコマンドを実行して、リクエスト転送用のローカルポートを有効にし、slurmctld を実行しているヘッド Pod のポート 22 にマッピングします。SSH はデフォルトでポート 22 を使用します。

       # $NAMESPACE、$CLUSTERNAME、および $LOCALPORT を実際の値に置き換えます。
       kubectl port-forward -n $NAMESPACE svc/$CLUSTERNAME $LOCALPORT:22
  2. port-forward コマンドが実行されている間に、次のコマンドを実行してログインします。現在のホスト上のすべてのユーザーがクラスターにログインしてジョブを投入できます。

       # $YOURUSER をヘッド Pod にログインするために使用するユーザー名に置き換えます。
       ssh -p $LOCALPORT $YOURUSER@localhost

ステップ 4:Slurm 管理クラスターの使用

以下のセクションでは、ノード間でユーザーを同期する方法、ノード間でログを共有する方法、および Slurm 管理クラスターのオートスケーリングを実行する方法について説明します。

ノード間でのユーザー同期

Slurm は中央集権的なユーザー認証サービスを提供していません。sbatch コマンドを使用してジョブを投入する際、投入したユーザーのアカウントがジョブを実行するために選択されたノードに存在しない場合、ジョブは失敗する可能性があります。この問題を解決するには、Slurm 管理クラスターに Lightweight Directory Access Protocol (LDAP) を設定します。LDAP は認証のための中央集権的なバックエンドサービスとして機能し、Slurm がユーザー ID を認証できるようにします。

LDAP バックエンドのデプロイ

  1. ldap.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。これにより、ユーザー情報を保存および管理する基本的な LDAP インスタンスが作成されます。ldap.yaml ファイルは、LDAP バックエンド Pod とそれに関連するサービスを定義します。Pod には LDAP コンテナーが含まれ、サービスはネットワーク内で LDAP サービスを公開します。

    LDAP バックエンド Pod とそれに関連するサービスの表示

       ---
       apiVersion: apps/v1
       kind: Deployment
       metadata:
         namespace: default
         name: ldap
         labels:
           app: ldap
       spec:
         selector:
           matchLabels:
             app: ldap
         revisionHistoryLimit: 10
         template:
           metadata:
             labels:
               app: ldap
           spec:
             securityContext:
               seLinuxOptions: {}
             imagePullSecrets: []
             restartPolicy: Always
             initContainers: []
             containers:
               - image: 'osixia/openldap:1.4.0'
                 imagePullPolicy: IfNotPresent
                 name: ldap
                 volumeMounts:
                   - name: openldap-data
                     mountPath: /var/lib/ldap
                     subPath: data
                   - name: openldap-data
                     mountPath: /etc/ldap/slapd.d
                     subPath: config
                   - name: openldap-data
                     mountPath: /container/service/slapd/assets/certs
                     subPath: certs
                   - name: secret-volume
                     mountPath: /container/environment/01-custom
                   - name: container-run
                     mountPath: /container/run
                 args:
                   - '--copy-service'
                 resources:
                   limits:
                   requests:
                 env: []
                 readinessProbe:
                   tcpSocket:
                     port: openldap
                   initialDelaySeconds: 20
                   timeoutSeconds: 1
                   periodSeconds: 10
                   successThreshold: 1
                   failureThreshold: 10
                 livenessProbe:
                   tcpSocket:
                     port: openldap
                   initialDelaySeconds: 20
                   timeoutSeconds: 1
                   periodSeconds: 10
                   successThreshold: 1
                   failureThreshold: 10
                 lifecycle: {}
                 ports:
                   - name: openldap
                     containerPort: 389
                     protocol: TCP
                   - name: ssl-ldap-port
                     containerPort: 636
                     protocol: TCP
             volumes:
               - name: openldap-data
                 emptyDir: {}
               - name: secret-volume
                 secret:
                   secretName: ldap-secret
                   defaultMode: 420
                   items: []
               - name: container-run
                 emptyDir: {}
             dnsPolicy: ClusterFirst
             dnsConfig: {}
             terminationGracePeriodSeconds: 30
         progressDeadlineSeconds: 600
         strategy:
           type: RollingUpdate
           rollingUpdate:
             maxUnavailable: 25%
             maxSurge: 25%
         replicas: 1
       ---
       apiVersion: v1
       kind: Service
       metadata:
         annotations: {}
         labels:
           app: ldap
         name: ldap-service
         namespace: default
       spec:
         ports:
           - name: openldap
             port: 389
             protocol: TCP
             targetPort: openldap
           - name: ssl-ldap-port
             port: 636
             protocol: TCP
             targetPort: ssl-ldap-port
         selector:
           app: ldap
         sessionAffinity: None
         type: ClusterIP
       ---
       metadata:
         name: ldap-secret
         namespace: default
         annotations: {}
       data:
         env.startup.yaml: >-
           IyBUaGlzIGlzIHRoZSBkZWZhdWx0IGltYWdlIHN0YXJ0dXAgY29uZmlndXJhdGlvbiBmaWxlCiMgdGhpcyBmaWxlIGRlZmluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCBkdXJpbmcgdGhlIGNvbnRhaW5lciAqKmZpcnN0IHN0YXJ0KiogaW4gKipzdGFydHVwIGZpbGVzKiouCgojIFRoaXMgZmlsZSBpcyBkZWxldGVkIHJpZ2h0IGFmdGVyIHN0YXJ0dXAgZmlsZXMgYXJlIHByb2Nlc3NlZCBmb3IgdGhlIGZpcnN0IHRpbWUsCiMgYWZ0ZXIgdGhhdCBhbGwgdGhlc2UgdmFsdWVzIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBpbiB0aGUgY29udGFpbmVyIGVudmlyb25tZW50LgojIFRoaXMgaGVscHMgdG8ga2VlcCB5b3VyIGNvbnRhaW5lciBjb25maWd1cmF0aW9uIHNlY3JldC4KIyBtb3JlIGluZm9ybWF0aW9uIDogaHR0cHM6Ly9naXRodWIuY29tL29zaXhpYS9kb2NrZXItbGlnaHQtYmFzZWltYWdlCgojIFJlcXVpcmVkIGFuZCB1c2VkIGZvciBuZXcgbGRhcCBzZXJ2ZXIgb25seQpMREFQX09SR0FOSVNBVElPTjogRXhhbXBsZSBJbmMuCkxEQVBfRE9NQUlOOiBleGFtcGxlLm9yZwpMREFQX0JBU0VfRE46ICNpZiBlbXB0eSBhdXRvbWF0aWNhbGx5IHNldCBmcm9tIExEQVBfRE9NQUlOCgpMREFQX0FETUlOX1BBU1NXT1JEOiBhZG1pbgpMREFQX0NPTkZJR19QQVNTV09SRDogY29uZmlnCgpMREFQX1JFQURPTkxZX1VTRVI6IGZhbHNlCkxEQVBfUkVBRE9OTFlfVVNFUl9VU0VSTkFNRTogcmVhZG9ubHkKTERBUF9SRUFET05MWV9VU0VSX1BBU1NXT1JEOiByZWFkb25seQoKIyBCYWNrZW5kCkxEQVBfQkFDS0VORDogaGRiCgojIFRscwpMREFQX1RMUzogdHJ1ZQpMREFQX1RMU19DUlRfRklMRU5BTUU6IGxkYXAuY3J0CkxEQVBfVExTX0tFWV9GSUxFTkFNRTogbGRhcC5rZXkKTERBUF9UTFNfQ0FfQ1JUX0ZJTEVOQU1FOiBjYS5jcnQKCkxEQVBfVExTX0VORk9SQ0U6IGZhbHNlCkxEQVBfVExTX0NJUEhFUl9TVUlURTogU0VDVVJFMjU2Oi1WRVJTLVNTTDMuMApMREFQX1RMU19QUk9UT0NPTF9NSU46IDMuMQpMREFQX1RMU19WRVJJRllfQ0xJRU5UOiBkZW1hbmQKCiMgUmVwbGljYXRpb24KTERBUF9SRVBMSUNBVElPTjogZmFsc2UKIyB2YXJpYWJsZXMgJExEQVBfQkFTRV9ETiwgJExEQVBfQURNSU5fUEFTU1dPUkQsICRMREFQX0NPTkZJR19QQVNTV09SRAojIGFyZSBhdXRvbWF0aWNhbHkgcmVwbGFjZWQgYXQgcnVuIHRpbWUKCiMgaWYgeW91IHdhbnQgdG8gYWRkIHJlcGxpY2F0aW9uIHRvIGFuIGV4aXN0aW5nIGxkYXAKIyBhZGFwdCBMREFQX1JFUExJQ0FUSU9OX0NPTkZJR19TWU5DUFJPViBhbmQgTERBUF9SRVBMSUNBVElPTl9EQl9TWU5DUFJPViB0byB5b3VyIGNvbmZpZ3VyYXRpb24KIyBhdm9pZCB1c2luZyAkTERBUF9CQVNFX0ROLCAkTERBUF9BRE1JTl9QQVNTV09SRCBhbmQgJExEQVBfQ09ORklHX1BBU1NXT1JEIHZhcmlhYmxlcwpMREFQX1JFUExJQ0FUSU9OX0NPTkZJR19TWU5DUFJPVjogYmluZGRuPSJjbj1hZG1pbixjbj1jb25maWciIGJpbmRtZXRob2Q9c2ltcGxlIGNyZWRlbnRpYWxzPSRMREFQX0NPTkZJR19QQVNTV09SRCBzZWFyY2hiYXNlPSJjbj1jb25maWciIHR5cGU9cmVmcmVzaEFuZFBlcnNpc3QgcmV0cnk9IjYwICsiIHRpbWVvdXQ9MSBzdGFydHRscz1jcml0aWNhbApMREFQX1JFUExJQ0FUSU9OX0RCX1NZTkNQUk9WOiBiaW5kZG49ImNuPWFkbWluLCRMREFQX0JBU0VfRE4iIGJpbmRtZXRob2Q9c2ltcGxlIGNyZWRlbnRpYWxzPSRMREFQX0FETUlOX1BBU1NXT1JEIHNlYXJjaGJhc2U9IiRMREFQX0JBU0VfRE4iIHR5cGU9cmVmcmVzaEFuZFBlcnNpc3QgaW50ZXJ2YWw9MDA6MDA6MDA6MTAgcmV0cnk9IjYwICsiIHRpbWVvdXQ9MSBzdGFydHRscz1jcml0aWNhbApMREFQX1JFUExJQ0FUSU9OX0hPU1RTOgogIC0gbGRhcDovL2xkYXAuZXhhbXBsZS5vcmcgIyBUaGUgb3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvbiBhbGwgbGRhcCBzZXJ2ZXJzCiAgLSBsZGFwOi8vbGRhcDIuZXhhbXBsZS5vcmcKCgojIFJlbW92ZSBjb25maWcgYWZ0ZXIgc2V0dXAKTERBUF9SRU1PVkVfQ09ORklHX0FGVEVSX1NFVFVQOiB0cnVlCgojIGNmc3NsIGVudmlyb25tZW50IHZhcmlhYmxlcyBwcmVmaXgKTERBUF9DRlNTTF9QUkVGSVg6IGxkYXAgIyBjZnNzbC1oZWxwZXIgZmlyc3Qgc2VhcmNoIGNvbmZpZyBmcm9tIExEQVBfQ0ZTU0xfKiB2YXJpYWJsZXMsIGJlZm9yZSBDRlNTTF8qIHZhcmlhYmxlcy4K
         env.yaml: >-
           IyBUaGlzIGlzIHRoZSBkZWZhdWx0IGltYWdlIGNvbmZpZ3VyYXRpb24gZmlsZQojIFRoZXNlIHZhbHVlcyB3aWxsIHBlcnNpc3RzIGluIGNvbnRhaW5lciBlbnZpcm9ubWVudC4KCiPCoEFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCBhZnRlciB0aGUgY29udGFpbmVyIGZpcnN0IHN0YXJ0CiMgbXVzdCBiZSBkZWZpbmVkIGhlcmUuCiMgbW9yZSBpbmZvcm1hdGlvbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9vc2l4aWEvZG9ja2VyLWxpZ2h0LWJhc2VpbWFnZQoKIyBHZW5lcmFsIGNvbnRhaW5lciBjb25maWd1cmF0aW9uCiMgc2VlIHRhYmxlIDUuMSBpbiBodHRwOi8vd3d3Lm9wZW5sZGFwLm9yZy9kb2MvYWRtaW4yNC9zbGFwZGNvbmYyLmh0bWwgZm9yIHRoZSBhdmFpbGFibGUgbG9nIGxldmVscy4KTERBUF9MT0dfTEVWRUw6IDI1Ngo=
       type: Opaque
       kind: Secret
       apiVersion: v1
  2. 次のコマンドを実行して、LDAP バックエンドサービスをデプロイします: 期待される出力:

       kubectl apply -f ldap.yaml
       deployment.apps/ldap created
       service/ldap-service created
       secret/ldap-secret created

(オプション) LDAP フロントエンドのデプロイ

  1. phpldapadmin.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。これにより、Web インターフェイスを通じて管理効率を向上させるための LDAP フロントエンド Pod とそれに関連するサービスがデプロイされます。

    LDAP フロントエンド Pod とそれに関連するサービスの表示

       ---
       apiVersion: apps/v1
       kind: Deployment
       metadata:
         namespace: default
         name: phpldapadmin
         labels:
           io.kompose.service: phpldapadmin
       spec:
         selector:
           matchLabels:
             io.kompose.service: phpldapadmin
         revisionHistoryLimit: 10
         template:
           metadata:
             labels:
               io.kompose.service: phpldapadmin
           spec:
             securityContext:
               seLinuxOptions: {}
             imagePullSecrets: []
             restartPolicy: Always
             initContainers: []
             containers:
               - image: 'osixia/phpldapadmin:0.9.0'
                 imagePullPolicy: Always
                 name: phpldapadmin
                 volumeMounts: []
                 resources:
                   limits:
                   requests:
                 env:
                   - name: PHPLDAPADMIN_HTTPS
                     value: 'false'
                   - name: PHPLDAPADMIN_LDAP_HOSTS
                     value: ldap-service
                 lifecycle: {}
                 ports:
                   - containerPort: 80
                     protocol: TCP
             volumes: []
             dnsPolicy: ClusterFirst
             dnsConfig: {}
             terminationGracePeriodSeconds: 30
         progressDeadlineSeconds: 600
         strategy:
           type: RollingUpdate
           rollingUpdate:
             maxUnavailable: 25%
             maxSurge: 25%
         replicas: 1
       ---
       apiVersion: v1
       kind: Service
       metadata:
         namespace: default
         name: phpldapadmin
         annotations:
           k8s.kuboard.cn/workload: phpldapadmin
         labels:
           io.kompose.service: phpldapadmin
       spec:
         selector:
           io.kompose.service: phpldapadmin
         type: ClusterIP
         ports:
           - port: 8080
             targetPort: 80
             protocol: TCP
             name: '8080'
             nodePort: 0
         sessionAffinity: None

    次のコマンドを実行して、LDAP フロントエンドサービスをデプロイします:

       kubectl apply -f phpldapadmin.yaml

LDAP クライアントの設定

  1. ステップ 3 で説明したように Slurm 管理クラスターの Pod にログインし、次のコマンドを実行して LDAP クライアントパッケージをインストールします:

       apt update
       apt install libnss-ldapd
  2. libnss-ldapd パッケージがインストールされた後、Pod 内で Slurm 管理クラスターのネットワーク認証サービスを設定します。

    1. /etc/nslcd.conf ファイルの次のパラメーターを変更して、LDAP サーバーへの接続を定義します:

       apt update
       apt install vim
       ...
       BASE	dc=example,dc=org # 値を LDAP ディレクトリ構造のルートノードの識別名に置き換えます。
       URI	ldap://ldap-service # 値をご利用の LDAP サーバーの Uniform Resource Identifier (URI) に置き換えます。
       ...
       ...
       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) ファイルシステムを作成して、すべてのジョブログをアクセス可能なディレクトリに保存できます。これにより、どのノードがコンピューティングジョブを実行しても、ログを一元的に収集およびアクセスできます。

  1. 各ノードのログを保存および共有するために、NAS ファイルシステムを作成します。詳細については、「ファイルシステムの作成」をご参照ください。

  2. ACK コンソールにログインし、NAS ファイルシステム用の永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。詳細については、「静的プロビジョニングされた NAS ボリュームのマウント」をご参照ください。

  3. SlurmCluster CR を変更します。slurmctld および workerGroupSpecs セクションの volumeMounts および volumes パラメーターを設定して、作成した PVC を参照し、それを /home ディレクトリにマウントします。例:

       slurmctld:
       ...
       # /home をマウントポイントとして指定します。
         volumeMounts:
         - mountPath: /home
           name: test  # PVC を参照するボリュームの名前。
         volumes:
       # PVC 定義を追加します。
         - name: test  # volumeMounts の名前と一致する必要があります。
           persistentVolumeClaim:
             claimName: test  # ご利用の PVC の名前に置き換えます。
       ...
       workerGroupSpecs:
         # ... 各ワーキンググループに対してボリュームと volumeMounts の構成を繰り返します。
  4. 次のコマンドを実行して、SlurmCluster CR をデプロイします。SlurmCluster CR がデプロイされると、ワーカーノードは NAS ファイルシステムを共有できます。

    重要

    SlurmCluster CR のデプロイに失敗した場合は、kubectl delete slurmcluster slurm-job-demo コマンドを実行して CR を削除し、再デプロイしてください。

       kubectl apply -f slurmcluster.yaml

Slurm 管理クラスターのオートスケーリングの実行

デフォルトの Slurm イメージのルートパスには、slurm-resume.shslurm-suspend.shslurmctld-copilot などの実行可能ファイルとスクリプトが含まれています。これらは slurmctld と対話し、Slurm 管理クラスターをスケーリングします。

オンクラウドノードに基づく Slurm クラスターのオートスケーリング

Slurm on ACK は 2 種類のノードをサポートしています:

  • ローカルノード:slurmctld に直接接続されている物理計算ノード。

  • オンクラウドノード:クラウドサービスプロバイダーによってオンデマンドで作成および破棄できる VM インスタンスによってバックアップされた論理ノード。

image

Slurm on ACK のオートスケーリング

image

手順

  1. オートスケーリング権限の設定。 Helm がインストールされている場合、オートスケーリング権限は slurmctld Pod に自動的に設定されるため、このステップはスキップできます。ヘッド Pod は、オートスケーリングのために SlurmCluster CR にアクセスして更新する権限が必要です。RBAC を使用して必要な権限を付与することを推奨します。次の手順に従ってください: まず、slurmctld Pod 用の ServiceAccount、Role、および RoleBinding を作成します。次の例では、Slurm 管理クラスター名は slurm-job-demo で、名前空間は default です。rbac.yaml という名前のファイルを作成し、次の内容をファイルにコピーします: kubectl apply -f rbac.yaml を実行してリソースリストを送信します。次に、slurmctld Pod に権限を付与します。kubectl edit slurmcluster slurm-job-demo を実行して Slurm 管理クラスターを変更します。Spec.Slurmctld.Template.Spec.ServiceAccountName を作成した ServiceAccount に設定します: 変更を適用するには、slurmctld を管理する StatefulSet を再構築します。kubectl get sts slurm-job-demo を実行して StatefulSet を見つけ、次に kubectl delete sts slurm-job-demo を実行して削除します。Slurm オペレーターは StatefulSet を再構築し、新しい構成を適用します。

       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.io
       apiVersion: kai.alibabacloud.com/v1
       kind: SlurmCluster
       ...
       spec:
         slurmctld:
           template:
             spec:
               serviceAccountName: slurm-job-demo
       ...
  2. /etc/slurm/slurm.conf でオートスケーリングパラメーターを設定します。

    方法 A:共有ボリュームを使用した ConfigMap の管理

       # 以下のパラメーターは、オンクラウドノードを使用する場合に必要です。
       # SuspendProgram と ResumeProgram 機能は Alibaba Cloud によって開発されました。
       SuspendTimeout=600
       ResumeTimeout=600
       # ノード上でジョブが実行されていない場合に自動的に一時停止される間隔。
       SuspendTime=600
       # 1分あたりにスケーリングできるノード数を設定します。
       ResumeRate=1
       SuspendRate=1
       # NodeName パラメーターの値を ${cluster_name}-worker-${group_name}- の形式で設定する必要があります。この行でノードのリソース量を指定する必要があります。そうしないと、slurmctld Pod
       # は、ノードに 1 つの vCPU しかないと見なします。オンクラウドノードで指定したリソースが、workerGroupSpecs パラメーターで宣言されたリソースと同じであることを確認してください。そうしないと、リソースが無駄になる可能性があります。
       NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD
       # 以下の構成は固定です。変更しないでください。
       CommunicationParameters=NoAddrCache
       ReconfigFlags=KeepPowerSaveSettings
       SuspendProgram="/slurm-suspend.sh"
       ResumeProgram="/slurm-resume.sh"

    方法 B:ConfigMap の手動管理

    slurm.confslurm-config という名前の ConfigMap に保存されている場合、kubectl edit slurm-config を実行して次の構成を追加します:

       slurm.conf:
       ...
         # 以下のパラメーターは、オンクラウドノードを使用する場合に必要です。
         # SuspendProgram と ResumeProgram 機能は Alibaba Cloud によって開発されました。
         SuspendTimeout=600
         ResumeTimeout=600
         # ノード上でジョブが実行されていない場合に自動的に一時停止される間隔。
         SuspendTime=600
         # 1分あたりにスケーリングできるノード数を設定します。
         ResumeRate=1
         SuspendRate=1
         # NodeName パラメーターの値を ${cluster_name}-worker-${group_name}- の形式で設定する必要があります。この行でノードのリソース量を指定する必要があります。そうしないと、slurmctld Pod
         # は、ノードに 1 つの vCPU しかないと見なします。オンクラウドノードで指定したリソースが、workerGroupSpecs パラメーターで宣言されたリソースと同じであることを確認してください。そうしないと、リソースが無駄になる可能性があります。
         NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD
         # 以下の構成は固定です。変更しないでください。
         CommunicationParameters=NoAddrCache
         ReconfigFlags=KeepPowerSaveSettings
         SuspendProgram="/slurm-suspend.sh"
         ResumeProgram="/slurm-resume.sh"

    方法 C:Helm を使用した ConfigMap の管理

    1. helm upgrade コマンドを実行して Slurm 構成を更新します。

       slurm.conf:
       ...
         # 以下のパラメーターは、オンクラウドノードを使用する場合に必要です。
         # SuspendProgram と ResumeProgram 機能は Alibaba Cloud によって開発されました。
         SuspendTimeout=600
         ResumeTimeout=600
         # ノード上でジョブが実行されていない場合に自動的に一時停止される間隔。
         SuspendTime=600
         # 1分あたりにスケーリングできるノード数を設定します。
         ResumeRate=1
         SuspendRate=1
         # NodeName パラメーターの値を ${cluster_name}-worker-${group_name}- の形式で設定する必要があります。この行でノードのリソース量を指定する必要があります。そうしないと、slurmctld Pod
         # は、ノードに 1 つの vCPU しかないと見なします。オンクラウドノードで指定したリソースが、workerGroupSpecs パラメーターで宣言されたリソースと同じであることを確認してください。そうしないと、リソースが無駄になる可能性があります。
         NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD
         # 以下の構成は固定です。変更しないでください。
         CommunicationParameters=NoAddrCache
         ReconfigFlags=KeepPowerSaveSettings
         SuspendProgram="/slurm-suspend.sh"
         ResumeProgram="/slurm-resume.sh"
  3. 新しい構成の適用。 Slurm 管理クラスターの名前が slurm-job-demo の場合、kubectl delete sts slurm-job-demo を実行して slurmctld Pod の新しい構成を適用します。

  4. slurmcluster.yaml ファイルでワーカーノードのレプリカ数を 0 に設定し、後続のステップでノードのスケーリング活動を観察できるようにします。

    手動管理

    kubectl edit slurmcluster slurm-job-demo を実行し、Slurm 管理クラスターで workerCount の値を 10 に変更します。これにより、ワーカーノードのレプリカ数が 0 に設定されます。

    Helm を使用した管理

    values.yaml ファイルで、.Values.workerGroup[].workerCount0 に変更します。次に、helm upgrade slurm-job-demo . を実行して現在の Helm チャートを更新します。これにより、ワーカーノードのレプリカ数が 0 に設定されます。

  5. sbatch コマンドを使用してジョブを投入します。 コマンドプロンプトの後に次の内容を入力します: 期待される出力: この出力は、スクリプトの内容が正しいことを確認します。期待される出力: この出力は、ジョブが投入され、ジョブ ID が割り当てられたことを示します。

    1. 次のコマンドを実行して、スクリプトを Slurm 管理クラスターに処理のために投入します:

       cat << EOF > cloudnodedemo.sh
       > #!/bin/bash
       > srun hostname
       > EOF
       cat cloudnodedemo.sh
       #!/bin/bash
         srun hostname
       sbatch cloudnodedemo.sh
       Submitted batch job 1
  6. クラスターのスケーリング結果の表示。 期待される出力: この出力は、Slurm 管理クラスターが投入されたジョブを実行するために自動的に 1 つの計算ノードを追加したことを示します。期待される出力: この出力は、slurm-demo-worker-cpu-0 Pod がクラスターに追加されたことを示しており、ジョブの送信時にクラスターがスケールアウトしたことを確認できます。期待される出力: この出力は、slurm-demo-worker-cpu-0 が新しく起動したノードであり、さらに 10 のオンクラウドノードがスケールアウトに利用可能であることを示しています。期待される出力: 出力内の NodeList=slurm-demo-worker-cpu-0 は、ジョブが新しく追加されたノードで実行されたことを示します。期待される出力: この出力は、スケールアウトに利用可能なノード数が 11 に増加したことを示しており、自動スケールインが完了したことを確認できます。

    1. 一定期間後、次のコマンドを実行してスケールインの結果を表示します:

       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
       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
       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]
       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-job-demo-worker-cpu-0
          BatchHost=slurm-job-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=
       sinfo
       PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
       debug*       up   infinite     11  idle~ slurm-demo-worker-cpu-[0-10]