全部产品
Search
文档中心

Container Service for Kubernetes:Menyebarkan dan menjalankan klaster yang dikelola Slurm sebagai pod di dalam klaster ACK

更新时间:Jul 02, 2025

Container Service for Kubernetes (ACK) menyediakan solusi Slurm on Kubernetes dan komponen ack-slurm-operator. Keduanya memungkinkan Anda menyebarkan serta mengelola sistem penjadwalan Simple Linux Utility for Resource Management (Slurm) di klaster ACK secara efisien untuk komputasi performa tinggi (HPC) dan pembelajaran mesin (AI dan ML) skala besar.

Pengenalan Slurm

Slurm adalah platform open source yang kuat untuk manajemen sumber daya klaster dan penjadwalan pekerjaan. Dirancang untuk mengoptimalkan performa dan efisiensi superkomputer serta klaster komputasi besar. Komponen utamanya bekerja sama untuk memastikan efisiensi dan fleksibilitas sistem yang tinggi. Gambar berikut menunjukkan cara kerja Slurm.

  • slurmctld: daemon kontrol Slurm. Sebagai otak dari Slurm, slurmctld memantau sumber daya sistem, menjadwalkan pekerjaan, dan mengelola status klaster. Untuk meningkatkan keandalan sistem, Anda dapat mengonfigurasi slurmctld sekunder untuk mencegah gangguan layanan jika slurmctld utama gagal. Ini memastikan ketersediaan tinggi sistem.

  • slurmd: daemon node Slurm. Slurmd diterapkan pada setiap node komputasi. Slurmd menerima instruksi dari slurmctld dan mengelola pekerjaan, termasuk memulai dan mengeksekusi pekerjaan, melaporkan status pekerjaan, dan mempersiapkan tugas baru. Slurmd berfungsi sebagai antarmuka untuk komunikasi langsung dengan sumber daya komputasi. Pekerjaan dijadwalkan berdasarkan slurmd.

  • slurmdbd: daemon basis data Slurm. Slurmdbd adalah komponen opsional tetapi penting untuk pengelolaan jangka panjang dan audit klaster besar karena mempertahankan basis data terpusat untuk menyimpan riwayat pekerjaan dan informasi akuntansi. Slurmdbd dapat mengumpulkan data di seluruh beberapa klaster yang dikelola Slurm untuk menyederhanakan dan meningkatkan efisiensi manajemen data.

  • SlurmCLI: SlurmCLI menyediakan perintah berikut untuk mempermudah manajemen pekerjaan dan pemantauan sistem:

    • scontrol: digunakan untuk mengelola klaster dan mengontrol konfigurasi klaster.

    • squeue: digunakan untuk menanyakan status pekerjaan dalam antrian.

    • srun: digunakan untuk mengirimkan dan mengelola pekerjaan.

    • sbatch: digunakan untuk mengirimkan pekerjaan secara batch. Komponen ini membantu Anda menjadwalkan dan mengelola sumber daya komputasi.

    • sinfo: digunakan untuk menanyakan status keseluruhan klaster, termasuk ketersediaan node.

Pengenalan Slurm pada ACK

Operator Slurm menggunakan CustomResource (CR) SlurmCluster untuk mendefinisikan file konfigurasi yang diperlukan untuk mengelola klaster Slurm dan menyelesaikan masalah manajemen control plane. Ini menyederhanakan penyebaran dan pemeliharaan klaster yang dikelola Slurm. Gambar berikut menunjukkan arsitektur Slurm pada ACK. Administrator klaster dapat menyebarkan dan mengelola klaster yang dikelola Slurm dengan menggunakan SlurmCluster. Operator Slurm membuat komponen kontrol Slurm di dalam klaster berdasarkan SlurmCluster. File konfigurasi Slurm dapat dipasang ke komponen kontrol menggunakan volume bersama atau ConfigMap.

Prasyarat

Klaster ACK yang menjalankan Kubernetes 1.22 atau lebih baru telah dibuat, dan klaster tersebut berisi satu node dengan akselerasi GPU. Untuk informasi lebih lanjut, lihat Buat klaster ACK dengan node akselerasi GPU dan Perbarui klaster.

Langkah 1: Instal komponen ack-slurm-operator

  1. Masuk ke Konsol ACK. Di panel navigasi di sebelah kiri, pilih Marketplace > Marketplace.

  2. Di halaman Marketplace, cari komponen ack-slurm-operator dan klik komponen tersebut. Di halaman detail komponen ack-slurm-operator, klik Deploy di pojok kanan atas. Di panel Sebarkan, konfigurasikan parameter untuk komponen tersebut.

    Anda hanya perlu menentukan parameter Klaster. Gunakan pengaturan default untuk parameter lainnya.

  3. Setelah Anda mengonfigurasi parameter, klik OK.

Langkah 2: Buat klaster yang dikelola Slurm

Buat klaster yang dikelola Slurm secara manual

  1. Buat Secret Slurm untuk otentikasi berbasis MUNGE Uid 'N' Gid Emporium (MUNGE) untuk klaster ACK.

    1. Jalankan perintah berikut untuk membuat kunci menggunakan OpenSSL. Kunci ini digunakan untuk otentikasi berbasis MUNGE.

      openssl rand -base64 512 | tr -d '\r\n'
    2. Jalankan perintah berikut untuk membuat Secret. Secret ini digunakan untuk menyimpan kunci yang dibuat pada langkah sebelumnya.

      kubectl create secret generic <$MungeKeyName> --from-literal=munge.key=<$MungeKey>
      • Ganti <$MungeKeyName> dengan nama kustom kunci Anda, seperti mungekey.

      • Ganti <$MungeKey> dengan string kunci yang dihasilkan pada langkah sebelumnya.

    Setelah Anda melakukan langkah-langkah di atas, Anda dapat mengonfigurasi atau mengaitkan Secret dengan klaster yang dikelola Slurm untuk mendapatkan dan menggunakan kunci untuk otentikasi berbasis MUNGE.

  2. Jalankan perintah berikut untuk membuat ConfigMap untuk klaster yang dikelola Slurm.

    Dalam contoh ini, ConfigMap berikut dipasang ke pod dengan menentukan parameter slurmConfPath di CR. Ini memastikan bahwa konfigurasi pod dapat dipulihkan secara otomatis ke keadaan yang diharapkan bahkan jika pod dibuat ulang.

    Parameter data dalam kode sampel berikut menentukan ConfigMap sampel. Untuk menghasilkan ConfigMap, kami sarankan Anda menggunakan alat Easy Configurator atau Full Configurator.

    Lihat kode sampel

    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

    Output yang diharapkan:

    configmap/slurm-test created

    Output yang diharapkan menunjukkan bahwa ConfigMap telah dibuat.

  3. Kirimkan CR SlurmCluster.

    1. Buat file bernama slurmcluster.yaml dan salin konten berikut ke file tersebut. Contoh kode:

      Catatan

      Dalam contoh ini, gambar Ubuntu yang berisi Compute Unified Device Architecture (CUDA) 11.4 dan Slurm 23.06 digunakan. Gambar tersebut berisi komponen yang dikembangkan oleh Alibaba Cloud untuk penskalaan otomatis node cloud. Jika Anda ingin menggunakan gambar kustom, Anda dapat membuat dan mengunggah gambar kustom.

      Lihat isi file YAML

      # ConfigMap Kubernetes ini digunakan untuk menyebarkan klaster yang dikelola Slurm di ACK menggunakan CustomResourceDefinition (CRD) dari kai.
      apiVersion: kai.alibabacloud.com/v1
      kind: SlurmCluster
      metadata:
        name: slurm-job-demo # Nama klaster.
        namespace: default # Namespace tempat klaster disebarkan.
      spec:
        mungeConfPath: /var/munge # Jalur file konfigurasi layanan MUNGE.
        slurmConfPath: /var/slurm # Jalur file konfigurasi layanan Slurm.
        slurmctld: # Spesifikasi node kepala (node control plane). Controller membuat StatefulSet untuk mengelola node kepala.
          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 # Target pemasangan file konfigurasi layanan Slurm.
                  name: config-slurm-test
                - mountPath: /var/munge # Target pemasangan file konfigurasi kunci yang digunakan untuk otentikasi berbasis MUNGE.
                  name: secret-slurm-test 
              volumes:
              - configMap:
                  name: slurm-test
                name: config-slurm-test
              - name: secret-slurm-test
                secret:
                  secretName: slurm-test
        workerGroupSpecs: # Spesifikasi node pekerja. Dalam contoh ini, grup node berikut didefinisikan: cpu dan 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 # Definisi grup node cpu1, yang mirip dengan grup node cpu. Anda dapat memodifikasi sumber daya atau konfigurasi grup node berdasarkan kebutuhan bisnis Anda.
          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: # Konfigurasi konteks keamanan yang memungkinkan pod berjalan dalam mode istimewa.
                  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

      Klaster yang dikelola Slurm dengan satu node kepala dan empat node pekerja dibuat berdasarkan CR SlurmCluster di atas. Klaster yang dikelola Slurm berjalan sebagai pod di dalam klaster ACK. Nilai parameter mungeConfPath dan slurmConfPath di dalam CR SlurmCluster harus sama dengan target pemasangan yang ditentukan di dalam parameter headGroupSpec dan workerGroupSpecs.

    2. Jalankan perintah berikut untuk menyebarkan file slurmcluster.yaml ke klaster:

      kubectl apply -f slurmcluster.yaml

      Output yang diharapkan:

      slurmcluster.kai.alibabacloud.com/slurm-job-demo created
    3. Jalankan perintah berikut untuk memeriksa apakah klaster yang dikelola Slurm yang dibuat berjalan sesuai harapan:

      kubectl get slurmcluster

      Output yang diharapkan:

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

      Output menunjukkan bahwa klaster yang dikelola Slurm telah disebarkan dan lima nodenya siap.

    4. Jalankan perintah berikut untuk memeriksa apakah pod di dalam klaster yang dikelola Slurm bernama slurm-job-demo berada dalam keadaan Running:

      kubectl get pod

      Output yang diharapkan:

      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

      Output menunjukkan bahwa node kepala dan empat node pekerja berjalan sesuai harapan di dalam klaster yang dikelola Slurm.

Buat klaster yang dikelola Slurm menggunakan Helm

Untuk menginstal dan mengelola klaster yang dikelola Slurm dengan cepat serta memodifikasi konfigurasi klaster secara fleksibel, Anda dapat menggunakan Helm untuk menginstal bagan SlurmCluster yang disediakan oleh Alibaba Cloud. Unduh bagan Helm untuk klaster yang dikelola Slurm dari charts-incubator (repositori bagan Helm Alibaba Cloud). Setelah Anda mengonfigurasi parameter, Helm membuat sumber daya seperti kontrol akses berbasis peran (RBAC), ConfigMap, Secret, dan klaster yang dikelola Slurm.

Bagan Helm berisi konfigurasi sumber daya berikut.

Jenis sumber daya

Nama sumber daya

Deskripsi

ConfigMap

{{ .Values.slurmConfigs.configMapName }}

Ketika parameter .Values.slurmConfigs.createConfigsByConfigMap diatur ke True, ConfigMap dibuat dan digunakan untuk menyimpan konfigurasi Slurm yang ditentukan pengguna. ConfigMap dipasang ke jalur yang ditentukan oleh parameter .Values.slurmConfigs.slurmConfigPathInPod. Jalur yang ditentukan juga dirender ke parameter .Spec.SlurmConfPath klaster yang dikelola Slurm dan perintah startup pod. Ketika pod dimulai, ConfigMap disalin ke jalur /etc/slurm/ dan akses ke ConfigMap dibatasi.

ServiceAccount

{{ .Release.Namespace }}/{{ .Values.clusterName }}

Sumber daya ini memungkinkan pod slurmctld memodifikasi konfigurasi klaster yang dikelola Slurm. Klaster yang dikelola Slurm dapat menggunakan sumber daya ini untuk mengaktifkan penskalaan otomatis node cloud.

Role

{{ .Release.Namespace }}/{{ .Values.clusterName }}

Sumber daya ini memungkinkan pod slurmctld memodifikasi konfigurasi klaster yang dikelola Slurm. Klaster yang dikelola Slurm dapat menggunakan sumber daya ini untuk mengaktifkan penskalaan otomatis node cloud.

RoleBinding

{{ .Release.Namespace }}/{{ .Values.clusterName }}

Sumber daya ini memungkinkan pod slurmctld memodifikasi konfigurasi klaster yang dikelola Slurm. Klaster yang dikelola Slurm dapat menggunakan sumber daya ini untuk mengaktifkan penskalaan otomatis node cloud.

Role

{{ .Values.slurmOperatorNamespace }}/{{ .Values.clusterName }}

Sumber daya ini memungkinkan pod slurmctld memodifikasi Secret di namespace SlurmOperator. Ketika Slurm dan Kubernetes diterapkan pada batch fisik server yang sama, klaster yang dikelola Slurm dapat menggunakan sumber daya ini untuk memperbarui token.

RoleBinding

{{ .Values.slurmOperatorNamespace }}/{{ .Values.clusterName }}

Sumber daya ini memungkinkan pod slurmctld memodifikasi Secret di namespace SlurmOperator. Ketika Slurm dan Kubernetes diterapkan pada batch fisik server yang sama, klaster yang dikelola Slurm dapat menggunakan sumber daya ini untuk memperbarui token.

Secret

{{ .Values.mungeConfigs.secretName }}

Sumber daya ini digunakan oleh komponen Slurm untuk otentikasi ketika mereka berkomunikasi satu sama lain. Ketika parameter .Values.mungeConfigs.createConfigsBySecret diatur ke True, sumber daya ini dibuat secara otomatis. Sumber daya ini berisi konten berikut: "munge.key"={{ .Values.mungeConfigs.content }}. Ketika parameter .Values.mungeConfigs.createConfigsBySecret diatur ke True, parameter .Values.mungeConfigs.createConfigsBySecret dirender sebagai parameter .Spec.MungeConfPath dan kemudian dirender sebagai jalur pemasangan sumber daya di dalam pod. Perintah startup pod menginisialisasi /etc/munge/munge.key berdasarkan jalur pemasangan.

SlurmCluster

Klaster yang dikelola Slurm yang dirender.

Tabel berikut menjelaskan parameter yang relevan.

Parameter

Contoh

Deskripsi

clusterName

""

Nama klaster. Nama klaster digunakan untuk menghasilkan Secret dan role. Nilainya harus sama dengan nama klaster yang ditentukan di file konfigurasi Slurm lainnya.

headNodeConfig

N/A

Parameter ini wajib. Parameter ini menentukan konfigurasi pod slurmctld.

workerNodesConfig

N/A

Konfigurasi pod slurmd.

workerNodesConfig.deleteSelfBeforeSuspend

true

Ketika nilainya diatur ke true, hook preStop secara otomatis ditambahkan ke pod pekerja. Hook preStop memicu drain node otomatis sebelum node dihapus dan menandai node sebagai tidak dapat dijadwalkan.

slurmdbdConfigs

N/A

Parameter ini menentukan konfigurasi pod slurmdbd. Jika Anda membiarkan parameter ini kosong, tidak ada pod yang dibuat untuk menjalankan slurmdbd.

slurmrestdConfigs

N/A

Parameter ini menentukan konfigurasi pod slurmrestd. Jika Anda membiarkan parameter ini kosong, tidak ada pod yang dibuat untuk menjalankan slurmrestd.

headNodeConfig.hostNetwork

slurmdbdConfigs.hostNetwork

slurmrestdConfigs.hostNetwork

workerNodesConfig.workerGroups[].hostNetwork

false

Dirender sebagai parameter hostNetwork pod slurmctld.

headNodeConfig.setHostnameAsFQDN

slurmdbdConfigs.setHostnameAsFQDN

slurmrestdConfigs.setHostnameAsFQDN

workerNodesConfig.workerGroups[].setHostnameAsFQDN

false

Dirender sebagai parameter setHostnameAsFQDN pod slurmctld.

headNodeConfig.nodeSelector

slurmdbdConfigs.nodeSelector

slurmrestdConfigs.nodeSelector

workerNodesConfig.workerGroups[].nodeSelector

nodeSelector:
  example: example

Dirender sebagai parameter nodeSelector pod slurmctld.

headNodeConfig.tolerations

slurmdbdConfigs.tolerations

slurmrestdConfigs.tolerations

workerNodesConfig.workerGroups[].tolerations

tolerations:
- key:
  value:
  operator:

Dirender sebagai tolerations pod slurmctld.

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

Dirender sebagai aturan affinity pod slurmctld.

headNodeConfig.resources

slurmdbdConfigs.resources

slurmrestdConfigs.resources

workerNodesConfig.workerGroups[].resources

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

Dirender sebagai sumber daya kontainer utama di dalam pod slurmctld. Batas sumber daya kontainer utama di dalam pod pekerja dirender sebagai batas sumber daya node Slurm.

headNodeConfig.image

slurmdbdConfigs.image

slurmrestdConfigs.image

workerNodesConfig.workerGroups[].image

"registry-cn-hangzhou.ack.aliyuncs.com/acs/slurm:23.06-1.6-aliyun-49259f59"

Dirender sebagai image slurmctld. Anda juga dapat mengunduh image kustom dari 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

Dirender sebagai Secret yang digunakan untuk menarik image slurmctld.

headNodeConfig.podSecurityContext

slurmdbdConfigs.podSecurityContext

slurmrestdConfigs.podSecurityContext

workerNodesConfig.workerGroups[].podSecurityContext

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

Dirender sebagai konteks keamanan slurmctld.

headNodeConfig.securityContext

slurmdbdConfigs.securityContext

slurmrestdConfigs.securityContext

workerNodesConfig.workerGroups[].securityContext

securityContext:
  allowPrivilegeEscalation: false

Dirender sebagai konteks keamanan kontainer utama di dalam pod slurmctld.

headNodeConfig.volumeMounts

slurmdbdConfigs.volumeMounts

slurmrestdConfigs.volumeMounts

workerNodesConfig.workerGroups[].volumeMounts

N/A

Dirender sebagai konfigurasi pemasangan volume kontainer utama di dalam pod slurmctld.

headNodeConfig.volumes

slurmdbdConfigs.volumes

slurmrestdConfigs.volumes

workerNodesConfig.workerGroups[].volumes

N/A

Dirender sebagai volume yang dipasang ke pod slurmctld.

slurmConfigs.slurmConfigPathInPod

""

Jalur pemasangan file konfigurasi Slurm di dalam pod. Jika file konfigurasi Slurm dipasang ke pod sebagai volume, Anda harus mengatur nilainya ke jalur tempat file slurm.conf dipasang. Perintah startup pod akan menyalin file di jalur pemasangan ke jalur /etc/slurm/ dan membatasi akses ke file tersebut.

slurmConfigs.createConfigsByConfigMap

true

Menentukan apakah akan membuat ConfigMap secara otomatis untuk menyimpan konfigurasi Slurm.

slurmConfigs.configMapName

""

Nama ConfigMap yang menyimpan konfigurasi Slurm.

slurmConfigs.filesInConfigMap

""

Konten di dalam ConfigMap yang dibuat secara otomatis untuk menyimpan konfigurasi Slurm.

mungeConfigs.mungeConfigPathInPod

N/A

Jalur pemasangan file konfigurasi MUNGE di dalam pod. Jika file konfigurasi MUNGE dipasang ke pod sebagai volume, Anda harus mengatur nilainya ke jalur tempat file munge.key dipasang. Perintah startup pod akan menyalin file di jalur pemasangan ke jalur /etc/munge/ dan membatasi akses ke file tersebut.

mungeConfigs.createConfigsBySecret

N/A

Menentukan apakah akan membuat Secret secara otomatis untuk menyimpan konfigurasi MUNGE.

mungeConfigs.secretName

N/A

Nama Secret yang menyimpan konfigurasi MUNGE.

mungeConfigs.content

N/A

Konten di dalam Secret yang dibuat secara otomatis untuk menyimpan konfigurasi MUNGE.

Untuk informasi lebih lanjut tentang slurmConfigs.filesInConfigMap, lihat Slurm System Configuration Tool (schedmd.com).

Penting

Jika Anda memodifikasi parameter slurmConfigs.filesInConfigMap setelah pod dibuat, Anda harus membuat ulang pod agar modifikasi berlaku. Dalam hal ini, kami sarankan Anda memeriksa apakah parameter telah dimodifikasi sesuai kebutuhan sebelum membuat ulang pod.

Lakukan operasi berikut untuk menginstal bagan Helm:

  1. Jalankan perintah berikut untuk menambahkan repositori Helm yang disediakan oleh Alibaba Cloud ke klien Helm lokal Anda:

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

    Operasi ini memungkinkan Anda mengakses berbagai bagan yang disediakan oleh Alibaba Cloud, termasuk klaster yang dikelola Slurm.

  2. Jalankan perintah berikut untuk menarik dan mengekstrak bagan Helm:

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

    Operasi ini membuat direktori bernama ack-slurm-cluster di direktori saat ini. Direktori ack-slurm-cluster berisi semua file dan template bagan.

  3. Jalankan perintah berikut untuk memodifikasi parameter bagan di file values.yaml.

    File values.yaml berisi konfigurasi default bagan. Anda dapat memodifikasi file ini untuk mengubah pengaturan parameter, seperti konfigurasi Slurm, permintaan dan batas sumber daya, serta penyimpanan, berdasarkan kebutuhan bisnis Anda.

    cd ack-slurm-cluster
    vi values.yaml
  4. Gunakan Helm untuk menginstal bagan.

    cd ..
    helm install my-slurm-cluster ack-slurm-cluster # Ganti my-slurm-cluster dengan nilai aktual.

    Operasi ini menyebarkan klaster yang dikelola Slurm.

  5. Periksa apakah klaster yang dikelola Slurm telah disebarkan.

    Setelah penyebaran selesai, Anda dapat menggunakan alat kubectl yang disediakan oleh Kubernetes untuk memeriksa status penyebaran. Pastikan bahwa klaster yang dikelola Slurm berjalan sesuai harapan.

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

Langkah 3: Masuk ke klaster yang dikelola Slurm

Masuk sebagai administrator klaster Kubernetes

Administrator klaster Kubernetes memiliki izin untuk mengelola klaster Kubernetes. Klaster yang dikelola Slurm berjalan sebagai pod di dalam klaster Kubernetes. Oleh karena itu, administrator klaster Kubernetes dapat menggunakan kubectl untuk masuk ke pod apa pun dari klaster yang dikelola Slurm di dalam klaster Kubernetes, dan memiliki izin pengguna root klaster yang dikelola Slurm secara default.

Jalankan perintah berikut untuk masuk ke pod klaster yang dikelola Slurm:

# Ganti slurm-job-demo-head-x9sgs dengan nama pod di klaster Anda.
kubectl exec -it slurm-job-demo-xxxxx -- bash

Masuk sebagai pengguna biasa klaster yang dikelola Slurm

Administrator atau pengguna biasa klaster yang dikelola Slurm mungkin tidak memiliki izin untuk menjalankan perintah kubectl exec. Jika Anda menggunakan klaster yang dikelola Slurm sebagai administrator atau pengguna biasa, Anda perlu masuk ke klaster yang dikelola Slurm menggunakan SSH.

  • Anda dapat menggunakan alamat IP eksternal Layanan untuk masuk ke head pod untuk koneksi jangka panjang dan skalabilitas. Solusi ini cocok untuk skenario yang memerlukan koneksi jangka panjang dan stabil. Anda dapat mengakses klaster yang dikelola Slurm dari mana saja dalam jaringan internal menggunakan instance Server Load Balancer (SLB) dan alamat IP eksternal terkait.

  • Anda dapat menggunakan perintah port-forward untuk meneruskan permintaan untuk sementara waktu. Solusi ini cocok untuk pemeliharaan atau debugging jangka pendek karena bergantung pada eksekusi terus-menerus dari perintah kubectl port-forward.

Masuk ke head pod menggunakan alamat IP eksternal Layanan

  1. Buat Layanan LoadBalancer untuk mengekspos layanan internal di dalam klaster ke akses eksternal. Untuk informasi lebih lanjut, lihat Gunakan instance SLB yang ada untuk mengekspos aplikasi atau Gunakan instance SLB yang dibuat secara otomatis untuk mengekspos aplikasi.

    • Layanan LoadBalancer harus menggunakan instance Classic Load Balancer (CLB) dengan akses internal.

    • Anda perlu menambahkan label kai.alibabacloud.com/slurm-cluster: ack-slurm-cluster-1 dan kai.alibabacloud.com/slurm-node-type: head ke Layanan sehingga Layanan dapat merutekan permintaan masuk ke pod yang diharapkan.

  2. Jalankan perintah berikut untuk mendapatkan alamat IP eksternal Layanan LoadBalancer:

    kubectl get svc
  3. Jalankan perintah berikut untuk masuk ke head pod yang terkait dengan Layanan menggunakan SSH:

    # Ganti $YOURUSER dengan nama pengguna aktual dari head pod dan $EXTERNAL_IP dengan alamat IP eksternal Layanan.
    ssh $YOURUSER@$EXTERNAL_IP

Teruskan permintaan menggunakan perintah port-forward

Peringatan

Untuk menggunakan perintah port-forward untuk meneruskan permintaan, Anda harus menyimpan file KubeConfig klaster Kubernetes ke host lokal Anda. Ini dapat menyebabkan risiko keamanan. Kami sarankan Anda tidak menggunakan metode ini di lingkungan produksi.

  1. Jalankan perintah berikut untuk mengaktifkan port host lokal untuk penerusan permintaan dan memetakan port host lokal ke port 22 head pod di mana slurmctld berjalan di dalam klaster. Secara default, SSH menggunakan port 22.

    # Ganti $NAMESPACE, $CLUSTERNAME, dan $LOCALPORT dengan nilai aktual.
    kubectl port-forward -n $NAMESPACE svc/$CLUSTERNAME $LOCALPORT:22
  2. Jalankan perintah berikut ketika perintah port-forward sedang berjalan. Semua pengguna di host saat ini dapat masuk ke klaster dan mengirimkan pekerjaan.

    # Ganti $YOURUSER dengan nama pengguna yang ingin Anda gunakan untuk masuk ke head pod.
    ssh -p $LOCALPORT $YOURUSER@localhost

Langkah 4: Gunakan klaster yang dikelola Slurm

Bagian berikut menjelaskan cara menyinkronkan pengguna di seluruh node, berbagi log di seluruh node, dan melakukan penskalaan otomatis untuk klaster yang dikelola Slurm.

Sinkronkan pengguna di seluruh node

Slurm tidak menyediakan layanan otentikasi pengguna terpusat. Ketika Anda menjalankan perintah sbatch untuk mengirimkan pekerjaan ke klaster yang dikelola Slurm, pekerjaan tersebut mungkin gagal dieksekusi jika akun pengguna yang mengirimkan pekerjaan tidak ada di node yang dipilih untuk mengeksekusi pekerjaan. Untuk menyelesaikan masalah ini, Anda dapat mengonfigurasi Lightweight Directory Access Protocol (LDAP) untuk klaster yang dikelola Slurm untuk mengelola pengguna. LDAP berfungsi sebagai layanan backend terpusat untuk otentikasi. Dengan cara ini, Slurm dapat mengotentikasi identitas pengguna berdasarkan layanan tersebut. Lakukan operasi berikut:

  1. Buat file bernama ldap.yaml dan salin konten berikut ke file tersebut untuk membuat instans LDAP dasar yang menyimpan dan mengelola informasi pengguna.

    File ldap.yaml mendefinisikan pod backend LDAP dan Layanan terkaitnya. Pod tersebut berisi kontainer LDAP, dan Layanan mengekspos layanan LDAP sehingga layanan LDAP dapat diakses dalam jaringan.

    Lihat pod backend LDAP dan Layanan terkaitnya

    ---
    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: >-
        # Ini adalah file konfigurasi startup gambar default
        # file ini mendefinisikan variabel lingkungan yang digunakan selama kontainer **pertama kali** dalam **file startup**.
    
        # File ini dihapus setelah file startup diproses untuk pertama kalinya,
        # setelah itu semua nilai ini tidak akan tersedia di lingkungan kontainer.
        # Hal ini membantu menjaga konfigurasi kontainer tetap aman.
        # informasi lebih lanjut: https://github.com/osixia/docker-light-baseimage
    
        # Diperlukan dan digunakan hanya untuk server ldap baru
        LDAP_ORGANISATION: Contoh Inc.
        LDAP_DOMAIN: example.org
        LDAP_BASE_DN: #jika kosong secara otomatis disetel dari LDAP_DOMAIN
    
        LDAP_ADMIN_PASSWORD: admin
        LDAP_CONFIG_PASSWORD: config
    
        LDAP_READONLY_USER: false
        LDAP_READONLY_USER_USERNAME: readonly
        LDAP_READONLY_USER_PASSWORD: readonly
    
        # Backend
        LDAP_BACKEND: hdb
    
        # Tls
        LDAP_TLS: true
        LDAP_TLS_CRT_FILENAME: ldap.crt
        LDAP_TLS_KEY_FILENAME: ldap.key
        LDAP_TLS_CA_CRT_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
    
        # Replikasi
        LDAP_REPLICATION: false
        # variabel $LDAP_BASE_DN, $LDAP_ADMIN_PASSWORD, $LDAP_CONFIG_PASSWORD
        # secara otomatis diganti pada waktu runtime
    
        # jika Anda ingin menambahkan replikasi ke ldap yang sudah ada
        # sesuaikan LDAP_REPLICATION_CONFIG_SYNCPROV dan LDAP_REPLICATION_DB_SYNCPROV ke konfigurasi Anda
        # hindari menggunakan variabel $LDAP_BASE_DN, $LDAP_ADMIN_PASSWORD dan $LDAP_CONFIG_PASSWORD
        LDAP_REPLICATION_CONFIG_SYNCPROV: 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_SYNCPROV: 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 # Urutan harus sama di semua server ldap
          - ldap://ldap2.example.org
    
    
        # Hapus konfigurasi setelah setup
        LDAP_REMOVE_CONFIG_AFTER_SETUP: true
    
        # variabel lingkungan cfsll dengan awalan
        LDAP_CFSSL_PREFIX: ldap # cfssl-helper pencarian pertama konfig dari variabel LDAP_CFSSL_*, sebelum CFSSL_* variables.
      env.yaml: >-
        # Ini adalah file konfigurasi gambar default
        # Nilai-nilai ini akan bertahan di lingkungan kontainer.
    
        # Semua variabel lingkungan yang digunakan setelah kontainer pertama kali mulai
        # harus didefinisikan di sini.
        # informasi lebih lanjut : https://github.com/osixia/docker-light-baseimage
    
        # Konfigurasi umum kontainer
        # lihat tabel 5.1 di http://www.openldap.org/doc/admin24/slapdconf2.html untuk level log yang tersedia.
        LDAP_LOG_LEVEL: 256
    type: Opaque
    kind: Secret
    apiVersion: v1
    
  2. Jalankan perintah berikut untuk menyebarkan Layanan backend LDAP:

    kubectl apply -f ldap.yaml

    Output yang diharapkan:

    deployment.apps/ldap created
    service/ldap-service created
    secret/ldap-secret created
  3. Opsional. Buat file bernama phpldapadmin.yaml dan salin konten berikut ke file tersebut untuk menyebarkan pod frontend LDAP dan Layanan terkaitnya. Pod frontend LDAP dan Layanan terkait digunakan untuk mengonfigurasi antarmuka frontend guna meningkatkan efisiensi manajemen.

    Lihat pod frontend LDAP dan Layanan terkaitnya

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

    Jalankan perintah berikut untuk menyebarkan Layanan frontend LDAP:

    kubectl apply -f phpldapadmin.yaml
  4. Masuk ke pod di klaster yang dikelola Slurm berdasarkan Langkah 3 dan jalankan perintah berikut untuk menginstal paket klien LDAP:

    apt update
    apt install libnss-ldapd
  5. Setelah paket libnss-ldapd diinstal, konfigurasikan layanan otentikasi jaringan untuk klaster yang dikelola Slurm di dalam pod.

    1. Jalankan perintah berikut untuk menginstal paket Vim untuk mengedit skrip dan file:

      apt update
      apt install vim
    2. Ubah parameter berikut di file /etc/ldap/ldap.conf untuk mengonfigurasi klien LDAP:

      ...
      BASE	dc=example,dc=org # Ganti nilai ini dengan nama unik dari root node dalam struktur direktori LDAP.
      URI	ldap://ldap-service # Ganti nilai ini dengan pengenal sumber daya seragam (URI) server LDAP Anda.
      ...
    3. Ubah parameter berikut di file /etc/nslcd.conf untuk mendefinisikan koneksi ke server LDAP:

      ...
      uri ldap://ldap-service # Ganti nilai ini dengan URI server LDAP Anda.
      base dc=example,dc=org # Tentukan parameter ini berdasarkan struktur direktori LDAP Anda.
      ...
      tls_cacertfile /etc/ssl/certs/ca-certificates.crt # Tentukan jalur ke file sertifikat otoritas sertifikat (CA) yang digunakan untuk memverifikasi sertifikat server LDAP.
      ...

Berbagi dan akses log

Secara default, log pekerjaan yang dihasilkan ketika Anda menggunakan perintah sbatch disimpan langsung di node yang mengeksekusi pekerjaan. Ini bisa tidak nyaman untuk melihat log. Untuk melihat log dengan mudah, Anda dapat membuat sistem file File Storage NAS (NAS) untuk menyimpan semua log pekerjaan di direktori yang dapat diakses. Dengan cara ini, meskipun pekerjaan komputasi dieksekusi pada node yang berbeda, log yang dihasilkan untuk pekerjaan tersebut dapat dikumpulkan dan disimpan secara terpusat. Ini memudahkan manajemen log. Lakukan operasi berikut:

  1. Buat sistem file NAS untuk menyimpan dan berbagi log setiap node. Untuk informasi lebih lanjut, lihat Buat sistem file.

  2. Masuk ke Konsol ACK, dan buat volume persisten (PV) dan klaim volume persisten (PVC) untuk sistem file NAS. Untuk informasi lebih lanjut, lihat Pasang volume NAS yang diprovision secara statis.

  3. Modifikasi CR SlurmCluster.

    Konfigurasikan parameter volumeMounts dan volumes di dalam parameter headGroupSpec dan workerGroupSpec untuk mereferensikan PVC yang dibuat dan pasang PVC ke direktori /home. Contoh:

    headGroupSpec:
    ...
    # Tentukan /home sebagai target pemasangan.
      volumeMounts:
      - mountPath: /home
        name: test  # Nama volume yang mereferensikan PVC.
      volumes:
    # Tambahkan definisi PVC.
      - name: test  # Nilai parameter ini harus sama dengan parameter nama di dalam volumeMounts.
        persistentVolumeClaim:
          claimName: test  # Ganti nilai ini dengan nama PVC.
    ...
    workerGroupSpecs:
      # ... Ulangi proses konfigurasi volume dan volumeMounts untuk setiap parameter workerGroupSpec.

  4. Jalankan perintah berikut untuk menyebarkan CR SlurmCluster.

    Penting

    Jika CR SlurmCluster gagal disebarkan, jalankan perintah kubectl delete slurmcluster slurm-job-demo untuk menghapus CR dan menyebarkannya ulang.

    kubectl apply -f slurmcluster.yaml

    Setelah CR SlurmCluster disebarkan, node pekerja dapat berbagi sistem file NAS.

Lakukan penskalaan otomatis untuk klaster yang dikelola Slurm

Root path dari image Slurm default berisi file eksekusi dan skrip seperti slurm-resume.sh, slurm-suspend.sh, dan slurmctld-copilot. Mereka digunakan untuk berinteraksi dengan slurmctld untuk menskalakan klaster yang dikelola Slurm.

Penskalaan otomatis untuk klaster Slurm berbasis node cloud

  • Node lokal: node komputasi fisik yang terhubung langsung ke slurmctld.

  • Node cloud: node logis. Node logis adalah instance VM yang dapat dibuat dan dihapus sesuai permintaan oleh penyedia layanan cloud.

Penskalaan otomatis untuk Slurm pada ACK

Prosedur

  1. Konfigurasikan izin penskalaan otomatis. Ketika Helm diinstal, izin penskalaan otomatis dikonfigurasi secara otomatis untuk pod slurmctld. Anda dapat melewati langkah ini.

    Pod kepala memerlukan izin untuk mengakses dan memperbarui CR SlurmCluster untuk penskalaan otomatis. Oleh karena itu, kami sarankan Anda menggunakan RBAC untuk memberikan izin yang diperlukan ke pod kepala saat menggunakan fitur penskalaan otomatis. Anda dapat melakukan langkah-langkah berikut untuk mengonfigurasi izin:

    Pertama, Anda harus membuat ServiceAccount, Role, dan RoleBinding yang diperlukan oleh pod slurmctld. Contoh: Tetapkan nama klaster yang dikelola Slurm menjadi slurm-job-demo, dan tetapkan namespace menjadi default. Buat file bernama rbac.yaml dan salin konten berikut ke file tersebut:

    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

    Jalankan perintah kubectl apply -f rbac.yaml untuk mengirimkan daftar sumber daya.

    Berikan izin ke pod slurmctld. Jalankan perintah kubectl edit slurmcluster slurm-job-demo untuk memodifikasi klaster yang dikelola Slurm. Atur parameter Spec.Slurmctld.Template.Spec.ServiceAccountName ke akun layanan yang Anda buat.

    apiVersion: kai.alibabacloud.com/v1
    kind: SlurmCluster
    ...
    spec:
      slurmctld:
        template:
          spec:
            serviceAccountName: slurm-job-demo
    ...

    Bangun ulang StatefulSet yang mengelola slurmctld untuk menerapkan perubahan yang baru saja Anda buat. Jalankan perintah kubectl get sts slurm-job-demo untuk menemukan StatefulSet yang mengelola pod slurmctld. Jalankan perintah kubectl delete sts slurm-job-demo untuk menghapus StatefulSet ini. Operator Slurm akan membangun ulang StatefulSet dan menerapkan konfigurasi baru.

  2. Konfigurasikan file penskalaan otomatis /etc/slurm/slurm.conf.

    Kelola ConfigMaps menggunakan volume bersama

    # Parameter berikut diperlukan jika Anda menggunakan node cloud.
    # Fitur SuspendProgram dan ResumeProgram dikembangkan oleh Alibaba Cloud.
    SuspendTimeout=600
    ResumeTimeout=600
    # Interval di mana node secara otomatis ditangguhkan ketika tidak ada pekerjaan yang berjalan di node.
    SuspendTime=600
    # Tetapkan jumlah node yang dapat diskalakan per menit.
    ResumeRate=1
    SuspendRate=1
    # Anda harus menetapkan nilai parameter NodeName dalam format ${cluster_name}-worker-${group_name}-. Anda harus menentukan jumlah sumber daya untuk node di baris ini. Jika tidak, pod slurmctld
    # menganggap bahwa node hanya memiliki satu vCPU. Pastikan sumber daya yang Anda tentukan pada node cloud sama dengan yang dideklarasikan di parameter workerGroupSpec. Jika tidak, sumber daya mungkin terbuang.
    NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD
    # Konfigurasi berikut tetap. Biarkan mereka tidak berubah.
    CommunicationParameters=NoAddrCache
    ReconfigFlags=KeepPowerSaveSettings
    SuspendProgram="/slurm-suspend.sh"
    ResumeProgram="/slurm-resume.sh"

    Kelola ConfigMaps secara manual.

    Jika slurm.conf disimpan di ConfigMap slurm-config, Anda dapat menjalankan perintah kubectl edit slurm-config untuk menambahkan konfigurasi berikut ke ConfigMap:

    slurm.conf:
    ...
      # Parameter berikut diperlukan jika Anda menggunakan node cloud.
      # Fitur SuspendProgram dan ResumeProgram dikembangkan oleh Alibaba Cloud.
      SuspendTimeout=600
      ResumeTimeout=600
      # Interval di mana node secara otomatis ditangguhkan ketika tidak ada pekerjaan yang berjalan di node.
      SuspendTime=600
      # Tetapkan jumlah node yang dapat diskalakan per menit.
      ResumeRate=1
      SuspendRate=1
      # Anda harus menetapkan nilai parameter NodeName dalam format ${cluster_name}-worker-${group_name}-. Anda harus menentukan jumlah sumber daya untuk node di baris ini. Jika tidak, pod slurmctld
      # menganggap bahwa node hanya memiliki satu vCPU. Pastikan sumber daya yang Anda tentukan pada node cloud sama dengan yang dideklarasikan di parameter workerGroupSpec. Jika tidak, sumber daya mungkin terbuang.
      NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD
      # Konfigurasi berikut tetap. Biarkan mereka tidak berubah.
      CommunicationParameters=NoAddrCache
      ReconfigFlags=KeepPowerSaveSettings
      SuspendProgram="/slurm-suspend.sh"
      ResumeProgram="/slurm-resume.sh"

    Kelola ConfigMaps menggunakan Helm

    1. Tambahkan ConfigMap berikut ke file values.yaml:

      slurm.conf:
      ...
        # Parameter berikut diperlukan jika Anda menggunakan node cloud.
        # Fitur SuspendProgram dan ResumeProgram dikembangkan oleh Alibaba Cloud.
        SuspendTimeout=600
        ResumeTimeout=600
        # Interval di mana node secara otomatis ditangguhkan ketika tidak ada pekerjaan yang berjalan di node.
        SuspendTime=600
        # Tetapkan jumlah node yang dapat diskalakan per menit.
        ResumeRate=1
        SuspendRate=1
        # Anda harus menetapkan nilai parameter NodeName dalam format ${cluster_name}-worker-${group_name}-. Anda harus menentukan jumlah sumber daya untuk node di baris ini. Jika tidak, pod slurmctld
        # menganggap bahwa node hanya memiliki satu vCPU. Pastikan sumber daya yang Anda tentukan pada node cloud sama dengan yang dideklarasikan di parameter workerGroupSpec. Jika tidak, sumber daya mungkin terbuang.
        NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD
        # Konfigurasi berikut tetap. Biarkan mereka tidak berubah.
        CommunicationParameters=NoAddrCache
        ReconfigFlags=KeepPowerSaveSettings
        SuspendProgram="/slurm-suspend.sh"
        ResumeProgram="/slurm-resume.sh"
    2. Jalankan perintah helm upgrade untuk memperbarui konfigurasi Slurm.

  3. Terapkan konfigurasi baru

    Jika nama klaster yang dikelola Slurm adalah slurm-job-demo, jalankan perintah kubectl delete sts slurm-job-demo untuk menerapkan konfigurasi baru untuk pod slurmctld.

  4. Ubah jumlah replika node pekerja menjadi 0 di file slurmcluster.yaml sehingga Anda dapat melihat aktivitas penskalaan node di langkah-langkah selanjutnya.

    Kelola secara manual

    Tetapkan nama klaster yang dikelola Slurm menjadi slurm-job-demo. Jalankan perintah kubectl edit slurmcluster slurm-job-demo untuk mengubah nilai workerCount menjadi 10 di klaster yang dikelola Slurm. Operasi ini mengubah jumlah replika node pekerja menjadi 0.

    Kelola menggunakan Helm

    Di file values.yaml, ubah parameter .Values.workerGroup[].workerCount menjadi 0. Kemudian, jalankan perintah helm upgrade slurm-job-demo . untuk memperbarui bagan Helm saat ini. Operasi ini menetapkan jumlah replika node pekerja menjadi 0.

  5. Kirimkan pekerjaan menggunakan perintah sbatch.

    1. Jalankan perintah berikut untuk membuat skrip Shell:

      cat << EOF > cloudnodedemo.sh

      Masukkan konten berikut setelah prompt perintah:

      > #!/bin/bash
      > srun hostname
      > EOF
    2. Jalankan perintah berikut untuk memeriksa apakah konten skrip benar:

      cat cloudnodedemo.sh

      Output yang diharapkan:

        #!/bin/bash
        srun hostname

      Output menunjukkan bahwa konten skrip benar.

    3. Jalankan perintah berikut untuk mengirimkan skrip ke klaster yang dikelola Slurm untuk diproses:

      sbatch cloudnodedemo.sh

      Output yang diharapkan:

      Submitted batch job 1

      Output menunjukkan bahwa pekerjaan telah dikirimkan dan diberi ID pekerjaan.

  6. Lihat hasil penskalaan klaster.

    1. Jalankan perintah berikut untuk melihat log penskalaan klaster yang dikelola Slurm:

      cat /var/log/slurm-resume.log

      Output yang diharapkan:

       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

      Output menunjukkan bahwa klaster yang dikelola Slurm secara otomatis menambahkan satu node komputasi berdasarkan beban kerja untuk mengeksekusi pekerjaan yang dikirimkan.

    2. Jalankan perintah berikut untuk melihat pod di dalam klaster:

      kubectl get pod

      Output yang diharapkan:

      NAME                                          READY   STATUS    RESTARTS        AGE
      slurm-demo-head-9hn67                         1/1     Running   0               21m
      slurm-demo-worker-cpu-0                       1/1     Running   0               43s

      Output menunjukkan bahwa pod slurm-demo-worker-cpu-0 ditambahkan ke klaster. Dalam hal ini, klaster diperluas ketika pekerjaan dikirimkan.

    3. Jalankan perintah berikut untuk melihat node di dalam klaster:

      sinfo

      Output yang diharapkan:

      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]

      Output menunjukkan bahwa node slurm-demo-worker-cpu-0 adalah node yang baru dimulai dan sepuluh node cloud lainnya tersedia untuk perluasan.

    4. Jalankan perintah berikut untuk melihat informasi tentang pekerjaan yang dieksekusi:

      scontrol show job 1

      Output yang diharapkan:

      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=

      Dalam output, NodeList=slurm-demo-worker-cpu-0 menunjukkan bahwa pekerjaan dieksekusi pada node yang baru ditambahkan.

    5. Setelah beberapa waktu, jalankan perintah berikut untuk melihat hasil penskalaan masuk node:

      sinfo

      Output yang diharapkan:

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

      Output menunjukkan bahwa jumlah node yang tersedia untuk perluasan menjadi 11. Ini menunjukkan bahwa penskalaan otomatis masuk telah selesai.