全部产品
Search
文档中心

Container Service for Kubernetes:Containerize dan deploy Slurm pada kluster ACK

更新时间:Mar 01, 2026

Container Service for Kubernetes (ACK) menyediakan solusi Slurm on Kubernetes beserta komponen ack-slurm-operator. Keduanya memungkinkan Anda mendeploy dan mengelola sistem penjadwalan Simple Linux Utility for Resource Management (Slurm) di kluster ACK untuk menangani beban kerja high performance computing (HPC) serta AI dan machine learning (ML) skala besar.

Pengenalan Slurm

Slurm adalah platform open source yang andal untuk manajemen sumber daya kluster dan penjadwalan tugas. Platform ini dirancang untuk mengoptimalkan performa dan efisiensi superkomputer serta kluster komputasi berskala besar. Gambar berikut menunjukkan cara komponen utamanya bekerja secara terintegrasi.

image
  • slurmctld: Daemon kontrol Slurm. Sebagai komponen manajemen pusat Slurm, slurmctld memantau sumber daya sistem, menjadwalkan tugas, dan mengelola status kluster. Anda dapat mengonfigurasi slurmctld sekunder untuk failover guna memastikan ketersediaan tinggi.

  • slurmd: Daemon node Slurm. Dideploy pada setiap node komputasi, slurmd menerima instruksi dari slurmctld dan mengelola siklus hidup tugas, termasuk memulai dan mengeksekusi tugas, melaporkan status tugas, serta mempersiapkan penugasan tugas baru. Tugas dijadwalkan melalui slurmd.

  • slurmdbd: Daemon database Slurm. Komponen opsional ini menyimpan database terpusat untuk riwayat tugas dan informasi akuntansi. Komponen ini penting untuk manajemen jangka panjang dan audit kluster berskala besar. slurmdbd dapat menggabungkan data dari beberapa kluster yang dikelola Slurm guna menyederhanakan manajemen data.

  • Slurm CLI: Slurm menyediakan alat baris perintah berikut untuk manajemen tugas dan pemantauan sistem:

    • scontrol: Mengelola kluster dan mengontrol konfigurasi kluster.

    • squeue: Menanyakan status tugas dalam antrian.

    • srun: Mengirimkan dan mengelola tugas.

    • sbatch: Mengirimkan tugas secara batch untuk penjadwalan dan pengelolaan sumber daya komputasi.

    • sinfo: Menanyakan status keseluruhan kluster, termasuk ketersediaan node.

Pengenalan Slurm on ACK

Operator Slurm menggunakan CustomResource (CR) SlurmCluster untuk menentukan file konfigurasi yang diperlukan dalam mengelola kluster Slurm. Hal ini menyederhanakan deployment dan pemeliharaan kluster yang dikelola Slurm serta menyelesaikan masalah manajemen control plane. Gambar berikut menunjukkan arsitektur Slurm on ACK.

image

Administrator kluster melakukan deployment dan mengelola kluster yang dikelola Slurm dengan mendefinisikan CR SlurmCluster. Operator Slurm kemudian membuat komponen kontrol Slurm di kluster berdasarkan CR tersebut. File konfigurasi Slurm dapat dipasang ke komponen kontrol menggunakan volume bersama atau ConfigMap.

Prasyarat

Kluster ACK yang menjalankan Kubernetes 1.22 atau versi lebih baru telah dibuat, dan kluster tersebut berisi satu node yang dipercepat GPU. Untuk informasi selengkapnya, lihat Buat kluster ACK dengan node yang dipercepat GPU dan Perbarui kluster.

Langkah 1: Instal komponen ack-slurm-operator

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

  2. Pada halaman Marketplace, cari ack-slurm-operator lalu klik komponen tersebut. Pada halaman detail, klik Deploy di pojok kanan atas. Pada panel Deploy, konfigurasikan parameter. Anda hanya perlu menentukan parameter Cluster. Gunakan pengaturan default untuk semua parameter lainnya.

  3. Setelah mengonfigurasi parameter, klik OK.

Langkah 2: Buat kluster yang dikelola Slurm

Anda dapat membuat kluster yang dikelola Slurm secara manual atau menggunakan Helm. Pilih metode yang paling sesuai dengan kebutuhan Anda.

Buat kluster yang dikelola Slurm secara manual

Buat Secret autentikasi MUNGE

MUNGE (MUNGE Uid 'N' Gid Emporium) menyediakan autentikasi antar komponen Slurm. Anda harus membuat Secret Kubernetes untuk menyimpan kunci MUNGE.

  1. Jalankan perintah berikut untuk menghasilkan kunci menggunakan OpenSSL:

       openssl rand -base64 512 | tr -d '\r\n'
  2. Jalankan perintah berikut untuk membuat Secret yang menyimpan kunci yang dihasilkan:

    • Ganti <$MungeKeyName> dengan nama kustom untuk kunci Anda, misalnya mungekey.

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

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

Setelah membuat Secret, Anda dapat mengonfigurasi atau mengaitkannya dengan kluster yang dikelola Slurm untuk autentikasi berbasis MUNGE.

Buat ConfigMap untuk kluster yang dikelola Slurm

Dalam contoh ini, ConfigMap dipasang ke pod dengan menentukan parameter slurmConfPath dalam CR. Hal ini memastikan bahwa konfigurasi pod secara otomatis dikembalikan ke kondisi yang diharapkan meskipun pod dibuat ulang.

Parameter data dalam kode contoh berikut menentukan ConfigMap sampel. Untuk menghasilkan ConfigMap, kami merekomendasikan penggunaan alat Easy Configurator atau Full Configurator.

Lihat kode contoh

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 ini menunjukkan bahwa ConfigMap berhasil dibuat.

Kirimkan CR SlurmCluster

Catatan Dalam contoh ini, digunakan image Ubuntu yang berisi Compute Unified Device Architecture (CUDA) 11.4 dan Slurm 23.06. Image ini mencakup komponen yang dikembangkan oleh Alibaba Cloud untuk auto scaling node cloud. Jika ingin menggunakan custom image, Anda dapat membuat dan mengunggahnya sendiri.
  1. Buat file bernama slurmcluster.yaml dan salin konten berikut ke dalam file tersebut. CR SlurmCluster ini membuat kluster yang dikelola Slurm dengan satu head node dan empat worker node. Kluster tersebut berjalan sebagai pod di kluster ACK. Nilai parameter mungeConfPath dan slurmConfPath dalam CR SlurmCluster harus sesuai dengan titik pemasangan yang ditentukan di bagian slurmctld dan workerGroupSpecs.

    Lihat isi file YAML

       # This Kubernetes resource deploys a Slurm-managed cluster on ACK by using a CustomResource (CR) of kai.
       apiVersion: kai.alibabacloud.com/v1
       kind: SlurmCluster
       metadata:
         name: slurm-job-demo # The name of the cluster.
         namespace: default # The namespace in which the cluster is deployed.
       spec:
         mungeConfPath: /var/munge # The path of the MUNGE configuration file.
         slurmConfPath: /var/slurm # The path of the Slurm configuration file.
         slurmctld: # The specifications of the head node. The controller creates a StatefulSet to manage the head node.
           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 # The mount target of the Slurm configuration file.
                   name: config-slurm-test
                 - mountPath: /var/munge # The mount target of the MUNGE authentication key.
                   name: secret-slurm-test
               volumes:
               - configMap:
                   name: slurm-test
                 name: config-slurm-test
               - name: secret-slurm-test
                 secret:
                   secretName: slurm-test
         workerGroupSpecs: # The specifications of the worker nodes. In this example, two node groups are defined: cpu and 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 # The cpu1 node group definition, similar to cpu. Modify resources or configurations based on your business requirements.
           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: # The security context configuration that allows the pod to run in privileged mode.
                   privileged: true
                 volumeMounts:
                 - mountPath: /var/slurm
                   name: config-slurm-test
                 - mountPath: /var/munge
                   name: secret-slurm-test
               volumes:
               - configMap:
                   name: slurm-test
                 name: config-slurm-test
               - name: secret-slurm-test
                 secret:
                   secretName: slurm-test
  2. Jalankan perintah berikut untuk mendeploy file slurmcluster.yaml ke kluster: Output yang diharapkan:

       kubectl apply -f slurmcluster.yaml
       slurmcluster.kai.alibabacloud.com/slurm-job-demo created
  3. Jalankan perintah berikut untuk memverifikasi bahwa kluster yang dikelola Slurm berjalan sesuai harapan: Output yang diharapkan: Output ini menunjukkan bahwa kluster yang dikelola Slurm telah dideploy dan kelima nodenya siap digunakan.

       kubectl get slurmcluster
       NAME             AVAILABLE WORKERS   STATUS   AGE
       slurm-job-demo   5                   ready    14m
  4. Jalankan perintah berikut untuk memverifikasi bahwa semua pod dalam kluster yang dikelola Slurm bernama slurm-job-demo berada dalam status Running: Output yang diharapkan: Output ini mengonfirmasi bahwa head node dan empat worker node berjalan sesuai harapan.

       kubectl get pods -l app.kubernetes.io/name=slurm-cluster
       NAME                                          READY   STATUS      RESTARTS     AGE
       slurm-job-demo-head-x9sgs                     1/1     Running     0            14m
       slurm-job-demo-worker-cpu-0                   1/1     Running     0            14m
       slurm-job-demo-worker-cpu-1                   1/1     Running     0            14m
       slurm-job-demo-worker-cpu1-0                  1/1     Running     0            14m
       slurm-job-demo-worker-cpu1-1                  1/1     Running     0            14m

Buat kluster yang dikelola Slurm menggunakan Helm

Untuk menginstal dan mengelola kluster yang dikelola Slurm secara cepat dengan konfigurasi fleksibel, Anda dapat menggunakan Helm untuk menginstal chart SlurmCluster yang disediakan oleh Alibaba Cloud. Unduh chart Helm dari charts-incubator (repositori chart Alibaba Cloud). Setelah mengonfigurasi parameter, Helm akan membuat resource seperti role-based access control (RBAC), ConfigMap, Secret, dan kluster yang dikelola Slurm.

Resource yang dibuat oleh chart Helm

Jenis sumber dayaNama sumber dayaDeskripsi
ConfigMap{{ .Values.slurmConfigs.configMapName }}Ketika .Values.slurmConfigs.createConfigsByConfigMap diatur ke True, ConfigMap ini menyimpan konfigurasi Slurm yang ditentukan pengguna. ConfigMap ini dipasang ke path yang ditentukan oleh .Values.slurmConfigs.slurmConfigPathInPod, yang juga dirender sebagai .Spec.SlurmConfPath dari kluster yang dikelola Slurm. Saat pod dimulai, ConfigMap disalin ke /etc/slurm/ dan aksesnya dibatasi.
ServiceAccount{{ .Release.Namespace }}/{{ .Values.clusterName }}Memungkinkan pod slurmctld untuk memodifikasi konfigurasi CR SlurmCluster, sehingga mengaktifkan auto scaling node cloud.
Role{{ .Release.Namespace }}/{{ .Values.clusterName }}Memberikan izin kepada pod slurmctld untuk memodifikasi konfigurasi CR SlurmCluster guna auto scaling.
RoleBinding{{ .Release.Namespace }}/{{ .Values.clusterName }}Mengikat Role ke ServiceAccount untuk izin auto scaling.
Role{{ .Values.slurmOperatorNamespace }}/{{ .Values.clusterName }}Memungkinkan pod slurmctld untuk memodifikasi Secret di namespace SlurmOperator. Ketika Slurm dan Kubernetes dideploy pada batch server fisik yang sama, kluster yang dikelola Slurm dapat menggunakan resource ini untuk memperpanjang token.
RoleBinding{{ .Values.slurmOperatorNamespace }}/{{ .Values.clusterName }}Mengikat Role namespace operator ke ServiceAccount untuk pembaruan token.
Secret{{ .Values.mungeConfigs.secretName }}Menyimpan kunci autentikasi MUNGE untuk komunikasi antar komponen Slurm. Ketika .Values.mungeConfigs.createConfigsBySecret diatur ke True, Secret ini dibuat secara otomatis dengan "munge.key"={{ .Values.mungeConfigs.content }}. Path pemasangan dirender dari .Spec.MungeConfPath, dan perintah startup pod menginisialisasi /etc/munge/munge.key dari path ini.
SlurmClusterKluster yang dikelola Slurm yang dirender.

Parameter chart Helm

ParameterContohDeskripsi
clusterName""Nama kluster. Digunakan untuk menghasilkan Secret dan role. Nilainya harus sesuai dengan nama kluster dalam file konfigurasi Slurm Anda.
headNodeConfigN/AWajib diisi. Mengonfigurasi pod slurmctld.
workerNodesConfigN/AMengonfigurasi pod slurmd.
workerNodesConfig.deleteSelfBeforeSuspendtrueKetika diatur ke true, hook preStop ditambahkan secara otomatis ke pod worker. Ini memicu draining node otomatis sebelum node dihapus dan menandai node sebagai tidak dapat dijadwalkan.
slurmdbdConfigsN/AMengonfigurasi pod slurmdbd. Jika dibiarkan kosong, tidak ada pod slurmdbd yang dibuat.
slurmrestdConfigsN/AMengonfigurasi pod slurmrestd. Jika dibiarkan kosong, tidak ada pod slurmrestd yang dibuat.
headNodeConfig.hostNetwork / slurmdbdConfigs.hostNetwork / slurmrestdConfigs.hostNetwork / workerNodesConfig.workerGroups[].hostNetworkfalseDirender sebagai parameter hostNetwork dari pod yang bersangkutan.
headNodeConfig.setHostnameAsFQDN / slurmdbdConfigs.setHostnameAsFQDN / slurmrestdConfigs.setHostnameAsFQDN / workerNodesConfig.workerGroups[].setHostnameAsFQDNfalseDirender sebagai parameter setHostnameAsFQDN dari pod yang bersangkutan.
headNodeConfig.nodeSelector / slurmdbdConfigs.nodeSelector / slurmrestdConfigs.nodeSelector / workerNodesConfig.workerGroups[].nodeSelectornodeSelector:
example: example
Dirender sebagai parameter nodeSelector dari pod yang bersangkutan.
headNodeConfig.tolerations / slurmdbdConfigs.tolerations / slurmrestdConfigs.tolerations / workerNodesConfig.workerGroups[].tolerationstolerations:
- key:
value:
operator:


Dirender sebagai tolerations dari pod yang bersangkutan.
headNodeConfig.affinity / slurmdbdConfigs.affinity / slurmrestdConfigs.affinity / workerNodesConfig.workerGroups[].affinityaffinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- zone-a
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value















Dirender sebagai aturan affinity dari pod yang bersangkutan.
headNodeConfig.resources / slurmdbdConfigs.resources / slurmrestdConfigs.resources / workerNodesConfig.workerGroups[].resourcesresources:
requests:
cpu: 1
limits:
cpu: 1



Dirender sebagai resource dari kontainer utama dalam pod yang bersangkutan. Batas resource kontainer utama pod worker dirender sebagai batas resource 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 kontainer. Anda juga dapat membuat custom image dari ai-models-on-ack/framework/slurm/building-slurm-image.
headNodeConfig.imagePullSecrets / slurmdbdConfigs.imagePullSecrets / slurmrestdConfigs.imagePullSecrets / workerNodesConfig.workerGroups[].imagePullSecretsimagePullSecrets:
- name: example
Dirender sebagai Secret yang digunakan untuk menarik image kontainer.
headNodeConfig.podSecurityContext / slurmdbdConfigs.podSecurityContext / slurmrestdConfigs.podSecurityContext / workerNodesConfig.workerGroups[].podSecurityContextpodSecurityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
supplementalGroups: [4000]



Dirender sebagai konteks keamanan tingkat pod.
headNodeConfig.securityContext / slurmdbdConfigs.securityContext / slurmrestdConfigs.securityContext / workerNodesConfig.workerGroups[].securityContextsecurityContext:
allowPrivilegeEscalation: false
Dirender sebagai konteks keamanan kontainer utama.
headNodeConfig.volumeMounts / slurmdbdConfigs.volumeMounts / slurmrestdConfigs.volumeMounts / workerNodesConfig.workerGroups[].volumeMountsN/ADirender sebagai konfigurasi pemasangan volume kontainer utama.
headNodeConfig.volumes / slurmdbdConfigs.volumes / slurmrestdConfigs.volumes / workerNodesConfig.workerGroups[].volumesN/ADirender sebagai volume yang dipasang ke pod.
slurmConfigs.slurmConfigPathInPod""Path pemasangan file konfigurasi Slurm di dalam pod. Jika file konfigurasi dipasang sebagai volume, atur nilai ini ke path tempat slurm.conf dipasang. Perintah startup pod menyalin file tersebut ke /etc/slurm/ dan membatasi akses.
slurmConfigs.createConfigsByConfigMaptrueMenentukan apakah akan membuat ConfigMap secara otomatis untuk konfigurasi Slurm.
slurmConfigs.configMapName""Nama ConfigMap yang menyimpan konfigurasi Slurm.
slurmConfigs.filesInConfigMap""Konten dalam ConfigMap yang dibuat secara otomatis.
mungeConfigs.mungeConfigPathInPodN/APath pemasangan file konfigurasi MUNGE di dalam pod. Jika file konfigurasi dipasang sebagai volume, atur nilai ini ke path tempat munge.key dipasang. Perintah startup pod menyalin file tersebut ke /etc/munge/ dan membatasi akses.
mungeConfigs.createConfigsBySecretN/AMenentukan apakah akan membuat Secret secara otomatis untuk konfigurasi MUNGE.
mungeConfigs.secretNameN/ANama Secret yang menyimpan konfigurasi MUNGE.
mungeConfigs.contentN/AKonten dalam Secret yang dibuat secara otomatis.

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

Penting

Jika Anda memodifikasi slurmConfigs.filesInConfigMap setelah pod dibuat, Anda harus membuat ulang pod agar perubahan tersebut berlaku. Kami menyarankan Anda memverifikasi modifikasi sebelum membuat ulang pod.

Instal chart Helm

  1. Jalankan perintah berikut untuk menambahkan repositori Helm Alibaba Cloud ke klien Helm lokal Anda: Hal ini memungkinkan Anda mengakses berbagai chart yang disediakan oleh Alibaba Cloud, termasuk chart kluster yang dikelola Slurm.

       helm repo add aliyun https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
  2. Jalankan perintah berikut untuk menarik dan mengekstrak chart Helm: Hal ini membuat direktori bernama ack-slurm-cluster di direktori saat ini. Direktori tersebut berisi semua file dan templat chart.

       helm pull aliyun/ack-slurm-cluster --untar=true
  3. Modifikasi parameter chart dalam file values.yaml. File values.yaml berisi konfigurasi chart default. Modifikasi file ini untuk menyesuaikan pengaturan parameter seperti konfigurasi Slurm, permintaan dan batas resource, serta penyimpanan sesuai kebutuhan Anda.

       cd ack-slurm-cluster
       vi values.yaml
  4. Gunakan Helm untuk menginstal chart: Hal ini mendeploy kluster yang dikelola Slurm.

       cd ..
       helm install my-slurm-cluster ack-slurm-cluster # Ganti my-slurm-cluster dengan nama rilis yang Anda inginkan.
  5. Verifikasi bahwa kluster yang dikelola Slurm telah dideploy. Setelah deployment selesai, gunakan kubectl untuk memeriksa status deployment dan memastikan kluster yang dikelola Slurm berjalan sesuai harapan:

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

Langkah 3: Login ke kluster yang dikelola Slurm

Login sebagai administrator kluster Kubernetes

Administrator kluster Kubernetes memiliki izin untuk mengelola seluruh kluster Kubernetes. Karena kluster yang dikelola Slurm berjalan sebagai pod di kluster Kubernetes, administrator dapat menggunakan kubectl untuk login ke pod mana pun dari kluster yang dikelola Slurm dan memiliki izin root secara default.

Jalankan perintah berikut untuk login ke pod kluster yang dikelola Slurm:

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

Login sebagai pengguna biasa kluster yang dikelola Slurm

Administrator atau pengguna biasa kluster yang dikelola Slurm mungkin tidak memiliki izin untuk menjalankan perintah kubectl exec. Dalam kasus ini, Anda dapat login ke kluster yang dikelola Slurm menggunakan SSH. Terdapat dua metode yang tersedia:

  • LoadBalancer Service: Gunakan alamat IP eksternal Service untuk mengakses head pod. Metode ini cocok untuk koneksi stabil jangka panjang. Anda dapat mengakses kluster yang dikelola Slurm dari mana saja dalam jaringan internal menggunakan instance Classic Load Balancer (CLB) dan alamat IP eksternalnya.

  • Port forwarding: Gunakan perintah kubectl port-forward untuk akses sementara. Metode ini cocok untuk operasi dan pemeliharaan (O&M) atau debugging jangka pendek karena memerlukan eksekusi terus-menerus perintah port-forward.

Login ke head pod menggunakan LoadBalancer Service

  1. Buat LoadBalancer Service untuk mengekspos layanan internal di kluster ke akses eksternal. Untuk informasi selengkapnya, lihat Gunakan instance SLB yang sudah ada untuk mengekspos aplikasi atau Gunakan instance SLB yang dibuat otomatis untuk mengekspos aplikasi.

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

    • Tambahkan label berikut ke Service agar meneruskan permintaan masuk ke pod yang diharapkan:

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

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

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

       kubectl get svc
  3. Jalankan perintah berikut untuk login ke head pod menggunakan SSH:

       # Ganti $YOURUSER dengan username Anda dan $EXTERNAL_IP dengan alamat IP eksternal Service.
       ssh $YOURUSER@$EXTERNAL_IP

Teruskan permintaan menggunakan perintah port-forward

Peringatan

Untuk menggunakan perintah port-forward, Anda harus menyimpan file kubeconfig kluster Kubernetes ke host lokal Anda. Hal ini dapat menimbulkan risiko keamanan. Kami menyarankan agar Anda tidak menggunakan metode ini di lingkungan produksi.

  1. Jalankan perintah berikut untuk mengaktifkan port lokal untuk penerusan permintaan dan memetakannya ke port 22 head pod yang menjalankan slurmctld. SSH menggunakan port 22 secara default.

       # Ganti $NAMESPACE, $CLUSTERNAME, dan $LOCALPORT dengan nilai aktual.
       kubectl port-forward -n $NAMESPACE svc/$CLUSTERNAME $LOCALPORT:22
  2. Selama perintah port-forward berjalan, jalankan perintah berikut untuk login. Semua pengguna di host saat ini dapat login ke kluster dan mengirimkan tugas.

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

Langkah 4: Gunakan kluster yang dikelola Slurm

Bagian berikut menjelaskan cara menyinkronkan pengguna di seluruh node, berbagi log di seluruh node, dan melakukan auto scaling untuk kluster yang dikelola Slurm.

Menyinkronkan pengguna di seluruh node

Slurm tidak menyediakan layanan autentikasi pengguna terpusat. Saat Anda menggunakan perintah sbatch untuk mengirimkan tugas, tugas tersebut mungkin gagal jika akun pengguna pengirim tidak ada di node yang dipilih untuk mengeksekusi tugas. Untuk mengatasi masalah ini, Anda dapat mengonfigurasi Lightweight Directory Access Protocol (LDAP) untuk kluster yang dikelola Slurm. LDAP berfungsi sebagai layanan backend terpusat untuk autentikasi, memungkinkan Slurm mengautentikasi identitas pengguna.

Deploy backend LDAP

  1. Buat file bernama ldap.yaml dan salin konten berikut ke dalam file tersebut. Hal ini membuat instance LDAP dasar yang menyimpan dan mengelola informasi pengguna. File ldap.yaml mendefinisikan pod backend LDAP dan Service terkaitnya. Pod tersebut berisi kontainer LDAP, dan Service mengekspos layanan LDAP dalam jaringan.

    Lihat pod backend LDAP dan Service 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: >-
           IyBUaGlzIGlzIHRoZSBkZWZhdWx0IGltYWdlIHN0YXJ0dXAgY29uZmlndXJhdGlvbiBmaWxlCiMgdGhpcyBmaWxlIGRlZmluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCBkdXJpbmcgdGhlIGNvbnRhaW5lciAqKmZpcnN0IHN0YXJ0KiogaW4gKipzdGFydHVwIGZpbGVzKiouCgojIFRoaXMgZmlsZSBpcyBkZWxldGVkIHJpZ2h0IGFmdGVyIHN0YXJ0dXAgZmlsZXMgYXJlIHByb2Nlc3NlZCBmb3IgdGhlIGZpcnN0IHRpbWUsCiMgYWZ0ZXIgdGhhdCBhbGwgdGhlc2UgdmFsdWVzIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBpbiB0aGUgY29udGFpbmVyIGVudmlyb25tZW50LgojIFRoaXMgaGVscHMgdG8ga2VlcCB5b3VyIGNvbnRhaW5lciBjb25maWd1cmF0aW9uIHNlY3JldC4KIyBtb3JlIGluZm9ybWF0aW9uIDogaHR0cHM6Ly9naXRodWIuY29tL29zaXhpYS9kb2NrZXItbGlnaHQtYmFzZWltYWdlCgojIFJlcXVpcmVkIGFuZCB1c2VkIGZvciBuZXcgbGRhcCBzZXJ2ZXIgb25seQpMREFQX09SR0FOSVNBVElPTjogRXhhbXBsZSBJbmMuCkxEQVBfRE9NQUlOOiBleGFtcGxlLm9yZwpMREFQX0JBU0VfRE46ICNpZiBlbXB0eSBhdXRvbWF0aWNhbGx5IHNldCBmcm9tIExEQVBfRE9NQUlOCgpMREFQX0FETUlOX1BBU1NXT1JEOiBhZG1pbgpMREFQX0NPTkZJR19QQVNTV09SRDogY29uZmlnCgpMREFQX1JFQURPTkxZX1VTRVI6IGZhbHNlCkxEQVBfUkVBRE9OTFlfVVNFUl9VU0VSTkFNRTogcmVhZG9ubHkKTERBUF9SRUFET05MWV9VU0VSX1BBU1NXT1JEOiByZWFkb25seQoKIyBCYWNrZW5kCkxEQVBfQkFDS0VORDogaGRiCgojIFRscwpMREFQX1RMUzogdHJ1ZQpMREFQX1RMU19DUlRfRklMRU5BTUU6IGxkYXAuY3J0CkxEQVBfVExTX0tFWV9GSUxFTkFNRTogbGRhcC5rZXkKTERBUF9UTFNfQ0FfQ1JUX0ZJTEVOQU1FOiBjYS5jcnQKCkxEQVBfVExTX0VORk9SQ0U6IGZhbHNlCkxEQVBfVExTX0NJUEhFUl9TVUlURTogU0VDVVJFMjU2Oi1WRVJTLVNTTDMuMApMREFQX1RMU19QUk9UT0NPTF9NSU46IDMuMQpMREFQX1RMU19WRVJJRllfQ0xJRU5UOiBkZW1hbmQKCiMgUmVwbGljYXRpb24KTERBUF9SRVBMSUNBVElPTjogZmFsc2UKIyB2YXJpYWJsZXMgJExEQVBfQkFTRV9ETiwgJExEQVBfQURNSU5fUEFTU1dPUkQsICRMREFQX0NPTkZJR19QQVNTV09SRAojIGFyZSBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIGF0IHJ1biB0aW1lCgojIGlmIHlvdSB3YW50IHRvIGFkZCByZXBsaWNhdGlvbiB0byBhbiBleGlzdGluZyBsZGFwCiMgYWRhcHQgTERBUF9SRVBMSUNBVElPTl9DT05GSUdfU1lOQ1BST1YgYW5kIExEQVBfUkVQTElDQVRJT05fREJfU1lOQ1BST1YgdG8geW91ciBjb25maWd1cmF0aW9uCiMgYXZvaWQgdXNpbmcgJExEQVBfQkFTRV9ETiwgJExEQVBfQURNSU5fUEFTU1dPUkQgYW5kICRMREFQX0NPTkZJR19QQVNTV09SRCB2YXJpYWJsZXMKTERBUF9SRVBMSUNBVElPTl9DT05GSUdfU1lOQ1BST1Y6IGJpbmRkbj0iY249YWRtaW4sY249Y29uZmlnIiBiaW5kbWV0aG9kPXNpbXBsZSBjcmVkZW50aWFscz0kTERBUF9DT05GSUdfUEFTU1dPUkQgc2VhcmNoYmFzZT0iY249Y29uZmlnIiB0eXBlPXJlZnJlc2hBbmRQZXJzaXN0IHJldHJ5PSI2MCArIiB0aW1lb3V0PTEgc3RhcnR0bHM9Y3JpdGljYWwKTERBUF9SRVBMSUNBVElPTl9EQl9TWU5DUFJPVjogYmluZGRuPSJjbj1hZG1pbiwkTERBUF9CQVNFX0ROIiBiaW5kbWV0aG9kPXNpbXBsZSBjcmVkZW50aWFscz0kTERBUF9BRE1JTl9QQVNTV09SRCBzZWFyY2hiYXNlPSIkTERBUF9CQVNFX0ROIiB0eXBlPXJlZnJlc2hBbmRQZXJzaXN0IGludGVydmFsPTAwOjAwOjAwOjEwIHJldHJ5PSI2MCArIiB0aW1lb3V0PTEgc3RhcnR0bHM9Y3JpdGljYWwKTERBUF9SRVBMSUNBVElPTl9IT1NUUzoKICAtIGxkYXA6Ly9sZGFwLmV4YW1wbGUub3JnICMgVGhlIG9yZGVyIG11c3QgYmUgdGhlIHNhbWUgb24gYWxsIGxkYXAgc2VydmVycwogIC0gbGRhcDovL2xkYXAyLmV4YW1wbGUub3JnCgoKIyBSZW1vdmUgY29uZmlnIGFmdGVyIHNldHVwCkxEQVBfUkVNT1ZFX0NPTkZJR19BRlRFUl9TRVRVUDogdHJ1ZQoKIyBjZnNzbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcHJlZml4CkxEQVBfQ0ZTU0xfUFJFRklYOiBsZGFwICMgY2Zzc2wtaGVscGVyIGZpcnN0IHNlYXJjaCBjb25maWcgZnJvbSBMREFQX0NGU1NMXyogdmFyaWFibGVzLCBiZWZvcmUgQ0ZTU0xfKiB2YXJpYWJsZXMuCg==
         env.yaml: >-
           IyBUaGlzIGlzIHRoZSBkZWZhdWx0IGltYWdlIGNvbmZpZ3VyYXRpb24gZmlsZQojIFRoZXNlIHZhbHVlcyB3aWxsIHBlcnNpc3QgaW4gY29udGFpbmVyIGVudmlyb25tZW50LgoKIyDCoEFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCBhZnRlciB0aGUgY29udGFpbmVyIGZpcnN0IHN0YXJ0CiMgbXVzdCBiZSBkZWZpbmVkIGhlcmUuCiMgbW9yZSBpbmZvcm1hdGlvbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9vc2l4aWEvZG9ja2VyLWxpZ2h0LWJhc2VpbWFnZQoKIyBHZW5lcmFsIGNvbnRhaW5lciBjb25maWd1cmF0aW9uCiMgc2VlIHRhYmxlIDUuMSBpbiBodHRwOi8vd3d3Lm9wZW5sZGFwLm9yZy9kb2MvYWRtaW4yNC9zbGFwZGNvbmYyLmh0bWwgZm9yIHRoZSBhdmFpbGFibGUgbG9nIGxldmVscy4KTERBUF9MT0dfTEVWRUw6IDI1Ngo=
       type: Opaque
       kind: Secret
       apiVersion: v1
  2. Jalankan perintah berikut untuk mendeploy Service backend LDAP: Output yang diharapkan:

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

(Opsional) Deploy frontend LDAP

  1. Buat file bernama phpldapadmin.yaml dan salin konten berikut ke dalam file tersebut. Hal ini mendeploy pod frontend LDAP dan Service terkaitnya untuk meningkatkan efisiensi manajemen melalui antarmuka web.

    Lihat pod frontend LDAP dan Service 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 mendeploy Service frontend LDAP:

       kubectl apply -f phpldapadmin.yaml

Konfigurasi klien LDAP

  1. Login ke pod di kluster yang dikelola Slurm seperti dijelaskan pada Langkah 3, lalu jalankan perintah berikut untuk menginstal paket klien LDAP:

       apt update
       apt install libnss-ldapd
  2. Setelah paket libnss-ldapd diinstal, konfigurasikan layanan autentikasi jaringan untuk kluster yang dikelola Slurm di dalam pod.

    1. Modifikasi parameter berikut dalam file /etc/nslcd.conf untuk menentukan koneksi ke server LDAP:

       apt update
       apt install vim
       ...
       BASE	dc=example,dc=org # Ganti nilai dengan distinguished name node root dalam struktur direktori LDAP.
       URI	ldap://ldap-service # Ganti nilai dengan uniform resource identifier (URI) server LDAP Anda.
       ...
       ...
       uri ldap://ldap-service # Ganti nilai 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 path ke file sertifikat certificate authority (CA) yang digunakan untuk memverifikasi sertifikat server LDAP.
       ...

Berbagi dan mengakses log

Secara default, log tugas yang dihasilkan oleh perintah sbatch disimpan di node yang mengeksekusi tugas. Hal ini dapat menyulitkan penampilan log secara terpusat. Untuk menyederhanakan manajemen log, Anda dapat membuat sistem file File Storage NAS (NAS) untuk menyimpan semua log tugas di direktori yang dapat diakses. Hal ini memungkinkan log dikumpulkan dan diakses secara terpusat terlepas dari node mana yang mengeksekusi tugas komputasi.

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

  2. Login ke Konsol ACK, lalu buat persistent volume (PV) dan persistent volume claim (PVC) untuk sistem file NAS. Untuk informasi selengkapnya, lihat Pasang volume NAS yang disediakan secara statis.

  3. Modifikasi CR SlurmCluster. Konfigurasikan parameter volumeMounts dan volumes di bagian slurmctld dan workerGroupSpecs untuk mereferensikan PVC yang dibuat dan memasangnya ke direktori /home. Contoh:

       slurmctld:
       ...
       # Tentukan /home sebagai titik pemasangan.
         volumeMounts:
         - mountPath: /home
           name: test  # Nama volume yang mereferensikan PVC.
         volumes:
       # Tambahkan definisi PVC.
         - name: test  # Harus sesuai dengan nama di volumeMounts.
           persistentVolumeClaim:
             claimName: test  # Ganti dengan nama PVC Anda.
       ...
       workerGroupSpecs:
         # ... Ulangi konfigurasi volume dan volumeMounts untuk setiap grup worker.
  4. Jalankan perintah berikut untuk mendeploy CR SlurmCluster. Setelah CR SlurmCluster dideploy, node worker dapat berbagi sistem file NAS.

    Penting

    Jika CR SlurmCluster gagal dideploy, jalankan perintah kubectl delete slurmcluster slurm-job-demo untuk menghapus CR tersebut lalu deploy ulang.

       kubectl apply -f slurmcluster.yaml

Lakukan auto scaling untuk kluster yang dikelola Slurm

Path root image Slurm default berisi file yang dapat dieksekusi dan skrip seperti slurm-resume.sh, slurm-suspend.sh, dan slurmctld-copilot. Skrip-skrip ini berinteraksi dengan slurmctld untuk melakukan scaling kluster yang dikelola Slurm.

Auto scaling untuk kluster Slurm berbasis node cloud

Slurm on ACK mendukung dua jenis node:

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

  • Node cloud: Node logis yang didukung oleh instans VM yang dapat dibuat dan dihapus sesuai permintaan oleh penyedia layanan cloud.

image

Auto scaling untuk Slurm on ACK

image

Prosedur

  1. Konfigurasikan izin auto scaling. Jika Helm diinstal, izin auto scaling dikonfigurasi secara otomatis untuk pod slurmctld dan Anda dapat melewati langkah ini. Pod head memerlukan izin untuk mengakses dan memperbarui CR SlurmCluster guna auto scaling. Kami menyarankan Anda menggunakan RBAC untuk memberikan izin yang diperlukan. Ikuti langkah-langkah berikut: Pertama, buat ServiceAccount, Role, dan RoleBinding untuk pod slurmctld. Dalam contoh berikut, nama kluster yang dikelola Slurm adalah slurm-job-demo dan namespace-nya adalah default. Buat file bernama rbac.yaml dan salin konten berikut ke dalam file tersebut: Jalankan kubectl apply -f rbac.yaml untuk mengirimkan daftar resource. Selanjutnya, berikan izin ke pod slurmctld. Jalankan kubectl edit slurmcluster slurm-job-demo untuk memodifikasi kluster yang dikelola Slurm. Atur Spec.Slurmctld.Template.Spec.ServiceAccountName ke ServiceAccount yang Anda buat: Untuk menerapkan perubahan, bangun ulang StatefulSet yang mengelola slurmctld. Jalankan kubectl get sts slurm-job-demo untuk menemukan StatefulSet, lalu jalankan kubectl delete sts slurm-job-demo untuk menghapusnya. Operator Slurm akan membangun ulang StatefulSet dan menerapkan konfigurasi baru.

       apiVersion: v1
       kind: ServiceAccount
       metadata:
         name: slurm-job-demo
       ---
       apiVersion: rbac.authorization.k8s.io/v1
       kind: Role
       metadata:
         name: slurm-job-demo
       rules:
       - apiGroups: ["kai.alibabacloud.com"]
         resources: ["slurmclusters"]
         verbs: ["get", "watch", "list", "update", "patch"]
         resourceNames: ["slurm-job-demo"]
       ---
       apiVersion: rbac.authorization.k8s.io/v1
       kind: RoleBinding
       metadata:
         name: slurm-job-demo
       subjects:
       - kind: ServiceAccount
         name: slurm-job-demo
       roleRef:
         kind: Role
         name: slurm-job-demo
         apiGroup: rbac.authorization.k8s.io
       apiVersion: kai.alibabacloud.com/v1
       kind: SlurmCluster
       ...
       spec:
         slurmctld:
           template:
             spec:
               serviceAccountName: slurm-job-demo
       ...
  2. Konfigurasikan parameter auto scaling di /etc/slurm/slurm.conf.

    Metode A: Kelola ConfigMap menggunakan volume bersama

       # Parameter berikut wajib jika Anda menggunakan node cloud.
       # Fitur SuspendProgram dan ResumeProgram dikembangkan oleh Alibaba Cloud.
       SuspendTimeout=600
       ResumeTimeout=600
       # Interval penangguhan otomatis node ketika tidak ada tugas yang berjalan di node tersebut.
       SuspendTime=600
       # Tetapkan jumlah node yang dapat di-scale per menit.
       ResumeRate=1
       SuspendRate=1
       # Anda harus mengatur nilai parameter NodeName dalam format ${cluster_name}-worker-${group_name}-. Anda harus menentukan jumlah resource untuk node di baris ini. Jika tidak, pod slurmctld
       # menganggap node hanya memiliki satu vCPU. Pastikan resource yang Anda tentukan pada node cloud sama dengan yang dideklarasikan di parameter workerGroupSpecs. Jika tidak, resource dapat terbuang.
       NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD
       # Konfigurasi berikut bersifat tetap. Jangan ubah.
       CommunicationParameters=NoAddrCache
       ReconfigFlags=KeepPowerSaveSettings
       SuspendProgram="/slurm-suspend.sh"
       ResumeProgram="/slurm-resume.sh"

    Metode B: Kelola ConfigMap secara manual

    Jika slurm.conf disimpan di ConfigMap bernama slurm-config, jalankan kubectl edit slurm-config untuk menambahkan konfigurasi berikut:

       slurm.conf:
       ...
         # Parameter berikut wajib jika Anda menggunakan node cloud.
         # Fitur SuspendProgram dan ResumeProgram dikembangkan oleh Alibaba Cloud.
         SuspendTimeout=600
         ResumeTimeout=600
         # Interval penangguhan otomatis node ketika tidak ada tugas yang berjalan di node tersebut.
         SuspendTime=600
         # Tetapkan jumlah node yang dapat di-scale per menit.
         ResumeRate=1
         SuspendRate=1
         # Anda harus mengatur nilai parameter NodeName dalam format ${cluster_name}-worker-${group_name}-. Anda harus menentukan jumlah resource untuk node di baris ini. Jika tidak, pod slurmctld
         # menganggap node hanya memiliki satu vCPU. Pastikan resource yang Anda tentukan pada node cloud sama dengan yang dideklarasikan di parameter workerGroupSpecs. Jika tidak, resource dapat terbuang.
         NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD
         # Konfigurasi berikut bersifat tetap. Jangan ubah.
         CommunicationParameters=NoAddrCache
         ReconfigFlags=KeepPowerSaveSettings
         SuspendProgram="/slurm-suspend.sh"
         ResumeProgram="/slurm-resume.sh"

    Metode C: Gunakan Helm untuk mengelola ConfigMap

    1. Jalankan perintah helm upgrade untuk memperbarui konfigurasi Slurm.

       slurm.conf:
       ...
         # Parameter berikut wajib jika Anda menggunakan node cloud.
         # Fitur SuspendProgram dan ResumeProgram dikembangkan oleh Alibaba Cloud.
         SuspendTimeout=600
         ResumeTimeout=600
         # Interval penangguhan otomatis node ketika tidak ada tugas yang berjalan di node tersebut.
         SuspendTime=600
         # Tetapkan jumlah node yang dapat di-scale per menit.
         ResumeRate=1
         SuspendRate=1
         # Anda harus mengatur nilai parameter NodeName dalam format ${cluster_name}-worker-${group_name}-. Anda harus menentukan jumlah resource untuk node di baris ini. Jika tidak, pod slurmctld
         # menganggap node hanya memiliki satu vCPU. Pastikan resource yang Anda tentukan pada node cloud sama dengan yang dideklarasikan di parameter workerGroupSpecs. Jika tidak, resource dapat terbuang.
         NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD
         # Konfigurasi berikut bersifat tetap. Jangan ubah.
         CommunicationParameters=NoAddrCache
         ReconfigFlags=KeepPowerSaveSettings
         SuspendProgram="/slurm-suspend.sh"
         ResumeProgram="/slurm-resume.sh"
  3. Terapkan konfigurasi baru. Jika nama kluster yang dikelola Slurm adalah slurm-job-demo, jalankan kubectl delete sts slurm-job-demo untuk menerapkan konfigurasi baru untuk pod slurmctld.

  4. Atur jumlah replika node worker ke 0 di file slurmcluster.yaml agar Anda dapat mengamati aktivitas scaling node pada langkah-langkah berikutnya.

    Manajemen manual

    Jalankan kubectl edit slurmcluster slurm-job-demo dan ubah nilai workerCount menjadi 10 di kluster yang dikelola Slurm. Hal ini mengatur jumlah replika node worker ke 0.

    Kelola menggunakan Helm

    Di file values.yaml, ubah .Values.workerGroup[].workerCount menjadi 0. Lalu jalankan helm upgrade slurm-job-demo . untuk memperbarui chart Helm saat ini. Hal ini mengatur jumlah replika node worker ke 0.

  5. Kirimkan tugas menggunakan perintah sbatch. Masukkan konten berikut setelah prompt perintah: Output yang diharapkan: Output ini mengonfirmasi bahwa konten skrip benar. Output yang diharapkan: Output ini menunjukkan bahwa tugas telah dikirim dan diberi ID tugas.

    1. Jalankan perintah berikut untuk mengirimkan skrip ke kluster yang dikelola Slurm untuk diproses:

       cat << EOF > cloudnodedemo.sh
       > #!/bin/bash
       > srun hostname
       > EOF
       cat cloudnodedemo.sh
       #!/bin/bash
         srun hostname
       sbatch cloudnodedemo.sh
       Submitted batch job 1
  6. Lihat hasil scaling kluster. Output yang diharapkan: Output ini menunjukkan bahwa kluster yang dikelola Slurm secara otomatis menambahkan satu node komputasi untuk mengeksekusi tugas yang dikirim. Output yang diharapkan: Output ini menunjukkan bahwa pod slurm-demo-worker-cpu-0 ditambahkan ke kluster, mengonfirmasi bahwa kluster melakukan scale-out saat tugas dikirim. Output yang diharapkan: Output ini menunjukkan bahwa slurm-demo-worker-cpu-0 adalah node yang baru dimulai dan 10 node cloud lainnya tersedia untuk scale-out. Output yang diharapkan: Dalam output tersebut, NodeList=slurm-demo-worker-cpu-0 menunjukkan bahwa tugas dieksekusi di node yang baru ditambahkan. Output yang diharapkan: Output ini menunjukkan bahwa jumlah node yang tersedia untuk scale-out meningkat menjadi 11, mengonfirmasi bahwa scale-in otomatis telah selesai.

    1. Setelah periode tertentu, jalankan perintah berikut untuk melihat hasil scale-in:

       cat /var/log/slurm-resume.log
       namespace: default cluster: slurm-demo
         resume called, args [slurm-demo-worker-cpu-0]
         slurm cluster metadata: default slurm-demo
         get SlurmCluster CR slurm-demo succeed
         hostlists: [slurm-demo-worker-cpu-0]
         resume node slurm-demo-worker-cpu-0
         resume worker -cpu-0
         resume node -cpu-0 end
       kubectl get pod
       NAME                                          READY   STATUS    RESTARTS        AGE
       slurm-demo-head-9hn67                         1/1     Running   0               21m
       slurm-demo-worker-cpu-0                       1/1     Running   0               43s
       sinfo
       PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
       debug*       up   infinite      10  idle~ slurm-job-demo-worker-cpu-[2-10]
       debug*       up   infinite      1   idle slurm-job-demo-worker-cpu-[0-1]
       scontrol show job 1
       JobId=1 JobName=cloudnodedemo.sh
          UserId=root(0) GroupId=root(0) MCS_label=N/A
          Priority=4294901757 Nice=0 Account=(null) QOS=(null)
          JobState=COMPLETED Reason=None Dependency=(null)
          Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
          RunTime=00:00:00 TimeLimit=UNLIMITED TimeMin=N/A
          SubmitTime=2024-05-28T11:37:36 EligibleTime=2024-05-28T11:37:36
          AccrueTime=2024-05-28T11:37:36
          StartTime=2024-05-28T11:37:36 EndTime=2024-05-28T11:37:36 Deadline=N/A
          SuspendTime=None SecsPreSuspend=0 LastSchedEval=2024-05-28T11:37:36 Scheduler=Main
          Partition=debug AllocNode:Sid=slurm-job-demo:93
          ReqNodeList=(null) ExcNodeList=(null)
          NodeList=slurm-job-demo-worker-cpu-0
          BatchHost=slurm-job-demo-worker-cpu-0
          NumNodes=1 NumCPUs=1 NumTasks=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
          ReqTRES=cpu=1,mem=1M,node=1,billing=1
          AllocTRES=cpu=1,mem=1M,node=1,billing=1
          Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
          MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
          Features=(null) DelayBoot=00:00:00
          OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null)
          Command=//cloudnodedemo.sh
          WorkDir=/
          StdErr=//slurm-1.out
          StdIn=/dev/null
          StdOut=//slurm-1.out
          Power=
       sinfo
       PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
       debug*       up   infinite     11  idle~ slurm-demo-worker-cpu-[0-10]