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

Container Service for Kubernetes:ACK クラスタのポッドとして Slurm 管理クラスタをデプロイおよび実行する

最終更新日:Jun 11, 2025

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 コンポーネントをインストールする

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

  2. [マーケットプレイス] ページで、[ack-slurm-operator] コンポーネントを検索してクリックします。 [ack-slurm-operator] コンポーネントの詳細ページで、右上隅にある [デプロイ] をクリックします。[デプロイ] パネルで、コンポーネントのパラメータを構成します。

    クラスタパラメータのみを指定する必要があります。その他のパラメータにはデフォルト設定を使用します。

  3. パラメータを構成したら、[OK] をクリックします。

ステップ 2: Slurm 管理クラスタを作成する

Slurm 管理クラスタを手動で作成する

  1. ACK クラスタの MUNGE Uid 'N' Gid Emporium (MUNGE) ベースの認証用の Slurm シークレットを作成します。

    1. 次のコマンドを実行して、OpenSSL を使用してキーを作成します。このキーは、MUNGE ベースの認証に使用されます。

      openssl rand -base64 512 | tr -d '\r\n'
    2. 次のコマンドを実行して、シークレットを作成します。このシークレットは、前のステップで作成されたキーを保存するために使用されます。

      kubectl create secret generic <$MungeKeyName> --from-literal=munge.key=<$MungeKey>
      • <$MungeKeyName> を、mungekey などのキーのカスタム名に置き換えます。

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

    上記の手順を実行した後、シークレットを構成または Slurm 管理クラスタに関連付けて、MUNGE ベースの認証用のキーを取得して使用できます。

  2. 次のコマンドを実行して、Slurm 管理クラスタの ConfigMap を作成します。

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

    次のサンプルコードの 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 # test2
        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
        # Set SlurmctldHost to the name of the Slurm-managed cluster with the -0 suffix. For high-availability deployment, 
        # you can use the following configuration. The suffix depends on the number of slurmctld replicas:
        # 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 が作成されたことを示します。

  3. SlurmCluster CR を送信します。

    1. slurmcluster.yaml という名前のファイルを作成し、次のコンテンツをファイルにコピーします。サンプルコード:

      説明

      この例では、Compute Unified Device Architecture (CUDA) 1.14 と Slurm 23.06 を含む Ubuntu イメージが使用されています。イメージには、クラウド上のノードの自動スケーリング用に Alibaba Cloud によって開発されたコンポーネントが含まれています。カスタムイメージを使用する場合は、カスタムイメージを作成してアップロードできます。

      YAML ファイルのコンテンツを表示

      # This Kubernetes ConfigMap is used to deploy a Slurm-managed cluster on ACK by using a CustomResourceDefinition (CRD) of kai. 
      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 というノードグループが定義されています。
        - 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: # ポッドを特権モードで実行できるようにするセキュリティコンテキスト構成。
                  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

      上記の SlurmCluster CR に基づいて、1 つのヘッドノードと 4 つのワーカーノードを持つ Slurm 管理クラスタが作成されます。 Slurm 管理クラスタは、ACK クラスタ内でポッドとして実行されます。 SlurmCluster CR の mungeConfPath パラメータと slurmConfPath パラメータの値は、headGroupSpec パラメータと workerGroupSpecs パラメータで指定されたマウントターゲットと同じである必要があります。

    2. 次のコマンドを実行して、slurmcluster.yaml ファイルをクラスタにデプロイします。

      kubectl apply -f slurmcluster.yaml

      期待される出力:

      slurmcluster.kai.alibabacloud.com/slurm-job-demo created
    3. 次のコマンドを実行して、作成された Slurm 管理クラスタが期待どおりに実行されているかどうかを確認します。

      kubectl get slurmcluster

      期待される出力:

      NAME             AVAILABLE WORKERS   STATUS   AGE
      slurm-job-demo   5                   ready    14m

      出力は、Slurm 管理クラスタがデプロイされ、その 5 つのノードが準備完了であることを示します。

    4. 次のコマンドを実行して、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

nodeSelector:
  example: example

slurmctld ポッドの nodeSelector パラメータとしてレンダリングされます。

headNodeConfig.tolerations

slurmdbdConfigs.tolerations

slurmrestdConfigs.tolerations

workerNodesConfig.workerGroups[].tolerations

tolerations:
- key:
  value:
  operator:

slurmctld ポッドの tolerations としてレンダリングされます。

headNodeConfig.affinity

slurmdbdConfigs.affinity

slurmrestdConfigs.affinity

workerNodesConfig.workerGroups[].affinity

affinity:
  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

slurmctld ポッドのアフィニティルールとしてレンダリングされます。

headNodeConfig.resources

slurmdbdConfigs.resources

slurmrestdConfigs.resources

workerNodesConfig.workerGroups[].resources

resources:
  requests:
    cpu: 1
  limits:
    cpu: 1

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

imagePullSecrets:
- name: example

slurmctld イメージをプルするために使用されるシークレットとしてレンダリングされます。

headNodeConfig.podSecurityContext

slurmdbdConfigs.podSecurityContext

slurmrestdConfigs.podSecurityContext

workerNodesConfig.workerGroups[].podSecurityContext

podSecurityContext:
  runAsUser: 1000
  runAsGroup: 3000
  fsGroup: 2000
  supplementalGroups: [4000]

slurmctld のセキュリティコンテキストとしてレンダリングされます。

headNodeConfig.securityContext

slurmdbdConfigs.securityContext

slurmrestdConfigs.securityContext

workerNodesConfig.workerGroups[].securityContext

securityContext:
  allowPrivilegeEscalation: false

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 チャートをインストールするには、次の操作を実行します。

  1. 次のコマンドを実行して、Alibaba Cloud が提供する Helm リポジトリをローカルの Helm クライアントに追加します。

    helm repo add aliyun https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/

    この操作により、Slurm 管理クラスタを含む、Alibaba Cloud が提供するさまざまなチャートにアクセスできます。

  2. 次のコマンドを実行して、Helm チャートをプルして解凍します。

    helm pull aliyun/ack-slurm-cluster --untar=true

    この操作により、現在のディレクトリに ack-slurm-cluster という名前のディレクトリが作成されます。 ack-slurm-cluster ディレクトリには、チャートのすべてのファイルとテンプレートが含まれています。

  3. 次のコマンドを実行して、values.yaml ファイルのチャートパラメータを変更します。

    values.yaml ファイルには、チャートのデフォルト構成が含まれています。このファイルを修正して、ビジネス要件に基づいて、Slurm 構成、リソース要求と制限、ストレージなどのパラメータ設定を変更できます。

    cd ack-slurm-cluster
    vi values.yaml
  4. Helm を使用してチャートをインストールします。

    cd ..
    helm install my-slurm-cluster ack-slurm-cluster # my-slurm-cluster を実際の値に置き換えます。

    この操作により、Slurm 管理クラスタがデプロイされます。

  5. 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 -- bash

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

Slurm 管理対象クラスターの管理者または一般ユーザーは、kubectl exec コマンドを実行する権限を持っていない場合があります。 Slurm 管理対象クラスターを管理者または一般ユーザーとして使用する場合、SSH を使用して Slurm 管理対象クラスターにログインする必要があります。

  • 長期接続とスケーラビリティのために、サービスの外部 IP アドレスを使用してヘッドポッドにログインできます。このソリューションは、長期的な安定した接続が必要なシナリオに適しています。 Server Load Balancer(SLB)インスタンスとその関連付けられた外部 IP アドレスを使用して、内部ネットワーク内のどこからでも Slurm 管理対象クラスターにアクセスできます。

  • port-forward コマンドを使用して、一時的にリクエストを転送できます。このソリューションは、kubectl port-forward コマンドの継続的な実行に依存しているため、短期の O&M またはデバッグに適しています。

サービスの外部 IP アドレスを使用してヘッドポッドにログインする

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

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

    • サービスが着信リクエストを想定されるポッドにルーティングできるように、kai.alibabacloud.com/slurm-cluster: ack-slurm-cluster-1 および kai.alibabacloud.com/slurm-node-type: head ラベルをサービスに追加する必要があります。

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

    kubectl get svc
  3. SSH を使用してサービスに関連付けられたヘッドポッドにログインするには、次のコマンドを実行します。

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

port-forward コマンドを使用してリクエストを転送する

警告

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

  1. リクエスト転送のためにローカルホストのポートを有効にし、ローカルホストのポートをクラスター内で slurmctld が実行されているヘッドポッドのポート 22 にマップするには、次のコマンドを実行します。デフォルトでは、SSH はポート 22 を使用します。

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

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

ステップ 4:Slurm 管理クラスタを使用する

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

ノード間でユーザーを同期する

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

  1. ldap.yaml という名前のファイルを作成し、次の内容をファイルにコピーして、ユーザー情報を保存および管理する基本 LDAP インスタンスを作成します。

    ldap.yaml ファイルは、LDAP バックエンド ポッドとそれに関連付けられたサービスを定義します。ポッドには LDAP コンテナが含まれており、サービスは LDAP サービスを公開して、ネットワーク内で LDAP サービスにアクセスできるようにします。

    LDAP バックエンド ポッドとそれに関連付けられたサービスを表示する

    ---
    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: >-
        # これはデフォルトのイメージ起動設定ファイルです
        # このファイルは、コンテナの**最初の起動**で**起動ファイル**で使用される環境変数を定義します。
    
        # このファイルは、起動ファイルが初めて処理された直後に削除されます。
        # これらの値はすべて、コンテナ環境では使用できなくなります。
        # これにより、コンテナ構成を非公開に保つことができます。
        # 詳細情報: https://github.com/osixia/docker-light-baseimage
    
        # 必須で、新しい ldap サーバーにのみ使用されます。
        LDAP_ORGANISATION: Example Inc.
        LDAP_DOMAIN: example.org
        LDAP_BASE_DN: #空の場合、LDAP_DOMAIN から自動的に設定されます
        LDAP_ADMIN_PASSWORD: admin
        LDAP_CONFIG_PASSWORD: config
        LDAP_READONLY_USER: false
        LDAP_READONLY_USER_USERNAME: readonly
        LDAP_READONLY_USER_PASSWORD: readonly
    
        # バックエンド
        LDAP_BACKEND: hdb
    
        # TLS
        LDAP_TLS: true
        LDAP_TLS_CERT_FILENAME: ldap.crt
        LDAP_TLS_KEY_FILENAME: ldap.key
        LDAP_TLS_CA_CERT_FILENAME: ca.crt
    
        LDAP_TLS_ENFORCE: false
        LDAP_TLS_CIPHER_SUITE: SECURE256:-VERS-SSL3.0
        LDAP_TLS_PROTOCOL_MIN: 3.1
        LDAP_TLS_VERIFY_CLIENT: demand
    
        # レプリケーション
        LDAP_REPLICATION: false
        # 変数 LDAP_BASE_DN、 LDAP_ADMIN_PASSWORD、 LDAP_CONFIG_PASSWORD
        # は実行時に自動的に複製されます
    
        # 既存の ldap にレプリケーションを追加する場合
        # 構成に LDAP_REPLICATION_CONFIG_SYNCAPROV と LDAP_REPLICATION_DB_SYNCAPROV を追加してください
        # $LDAP_BASE_DN、$LDAP_ADMIN_PASSWORD、$LDAP_CONFIG_PASSWORD 変数を使用しないでください
        LDAP_REPLICATION_CONFIG_SYNCAPROV: binddn="cn=admin,cn=config" bindmethod=simple credentials=$LDAP_CONFIG_PASSWORD searchbase="cn=config" type=refreshAndPersist retry="60 +" timeout=1 starttls=critical
        LDAP_REPLICATION_DB_SYNCAPROV: binddn="cn=admin,$LDAP_BASE_DN" bindmethod=simple credentials=$LDAP_ADMIN_PASSWORD searchbase="$LDAP_BASE_DN" type=refreshAndPersist interval=00:00:00:10 retry="60 +" timeout=1 starttls=critical
        LDAP_REPLICATION_HOSTS: 
          - ldap://ldap.example.org # すべての ldap サーバーで順序が同じである必要があります
          - ldap://ldap2.example.org
    
    
        # 設定後、設定を削除する
        LDAP_REMOVE_CONFIG_AFTER_SETUP: true
    
        # cfsls 環境変数プレフィックス
        LDAP_CFSSL_PREFIX: ldap # cfsls-helper は最初に LDAP_CFSSL_* 変数、次に CFSSL_* 変数を検索します。
      env.yaml: >-
        # これはデフォルトのイメージ設定ファイルです
        # これらの値はコンテナ環境に保持されます。
    
        >
        コンテナの最初の起動後に使用されるすべての環境変数
        # はここで定義する必要があります。
        # 詳細情報: https://github.com/osixia/docker-light-baseimage
    
        # 一般的なコンテナ構成
        # http://www.openldap.org/doc/admin24/slapdconf.html の表 5.1 を参照して、使用可能なログ レベルを確認してください。
        LDAP_LOG_LEVEL: 256
    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
  3. オプション。 phpldapadmin.yaml という名前のファイルを作成し、次の内容をファイルにコピーして、LDAP フロントエンド ポッドとそれに関連付けられたサービスをデプロイします。 LDAP フロントエンド ポッドとそれに関連付けられたサービスは、管理効率を向上させるためにフロントエンド インターフェースを構成するために使用されます。

    LDAP フロントエンド ポッドとそれに関連付けられたサービスを表示する

    ---
    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
  4. ステップ 3 に基づいて Slurm 管理クラスタのポッドにログオンし、次のコマンドを実行して LDAP クライアント パッケージをインストールします。

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

    1. 次のコマンドを実行して、スクリプトとファイルを編集するための Vim パッケージをインストールします。

      apt update
      apt install vim
    2. /etc/ldap/ldap.conf ファイルの次のパラメータを変更して、LDAP クライアントを構成します。

      ...
      BASE	dc=example,dc=org # 値を LDAP ディレクトリ構造のルートノードの識別名に置き換えます。
      URI	ldap://ldap-service # 値を LDAP サーバーの Uniform Resource Identifier (URI) に置き換えます。
      ...
    3. /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) ファイルシステムを作成して、アクセス可能なディレクトリにすべてのジョブ ログを保存します。このようにして、計算ジョブが異なるノードで実行された場合でも、ジョブ用に生成されたログを一元的に収集して保存できます。これはログ管理を容易にします。次の操作を実行します。

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

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

  3. 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 パラメータの構成の前述のプロセスを繰り返します。

  4. 次のコマンドを実行して、SlurmCluster CR をデプロイします。

    重要

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

    kubectl  apply -f slurmcluster.yaml

    SlurmCluster CR がデプロイされると、ワーカー ノードは NAS ファイルシステムを共有できます。

Slurm 管理クラスタの自動スケーリングを実行する

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

クラウド上のノードに基づく Slurm クラスタの自動スケーリング

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

  • クラウド上のノード:論理ノード。論理ノードは、クラウド サービス プロバイダーがオンデマンドで作成および破棄できる VM インスタンスです。

ACK での Slurm の自動スケーリング

手順

  1. 自動スケーリング権限を構成します。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.io

    kubectl 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 を再構築し、新しい構成を適用します。

  2. 自動スケーリング ファイル /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.confslurm-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 を管理する

    1. 次の 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"
    2. helm upgrade コマンドを実行して、Slurm 構成を更新します。

  3. 新しい構成を適用する

    Slurm 管理クラスタの名前が slurm-job-demo の場合は、kubectl delete sts slurm-job-demo コマンドを実行して、slurmctld ポッドの新しい構成を適用します。

  4. 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 に設定されます。

  5. sbatch コマンドを使用してジョブを送信します。

    1. 次のコマンドを実行して、シェル スクリプトを作成します。

      cat << EOF > cloudnodedemo.sh

      コマンド プロンプトの後に次の内容を入力します。

      > #!/bin/bash
      > srun hostname
      > EOF
    2. 次のコマンドを実行して、スクリプトの内容が正しいかどうかを確認します。

      cat cloudnodedemo.sh

      期待される出力:

        #!/bin/bash
        srun hostname

      出力は、スクリプトの内容が正しいことを示しています。

    3. 次のコマンドを実行して、処理のためにスクリプトを Slurm 管理クラスタに送信します。

      sbatch cloudnodedemo.sh

      期待される出力:

      Submitted batch job 1

      出力は、ジョブが送信され、ジョブ ID が割り当てられたことを示しています。

  6. クラスタ スケーリングの結果を表示します。

    1. 次のコマンドを実行して、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 つ自動的に追加して、送信されたジョブを実行することを示しています。

    2. 次のコマンドを実行して、クラスタ内のポッドを表示します。

      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 ポッドがクラスタに追加されたことを示しています。この場合、ジョブが送信されるとクラスタはスケールアウトされます。

    3. 次のコマンドを実行して、クラスタ内のノードを表示します。

      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 個のクラウド上のノードがスケールアウトに使用できることを示しています。

    4. 次のコマンドを実行して、実行されたジョブに関する情報を表示します。

      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 は、ジョブが新しく追加されたノードで実行されていることを示しています。

    5. しばらくしてから、次のコマンドを実行して、ノード スケールインの結果を表示します。

      sinfo

      期待される出力:

      PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
      debug*       up   infinite     11  idle~ slurm-demo-worker-cpu-[0-10]

      出力は、スケールアウトに使用できるノードの数が 11 になったことを示しています。これは、自動スケールインが完了したことを示しています。