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.
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.
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
Login ke Konsol ACK. Di panel navigasi sebelah kiri, pilih Marketplace > Marketplace.
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.
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.
Jalankan perintah berikut untuk menghasilkan kunci menggunakan OpenSSL:
openssl rand -base64 512 | tr -d '\r\n'Jalankan perintah berikut untuk membuat Secret yang menyimpan kunci yang dihasilkan:
Ganti
<$MungeKeyName>dengan nama kustom untuk kunci Anda, misalnyamungekey.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.
Output yang diharapkan:
configmap/slurm-test createdOutput ini menunjukkan bahwa ConfigMap berhasil dibuat.
Kirimkan CR SlurmCluster
Buat file bernama
slurmcluster.yamldan 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 parametermungeConfPathdanslurmConfPathdalam CR SlurmCluster harus sesuai dengan titik pemasangan yang ditentukan di bagianslurmctlddanworkerGroupSpecs.Jalankan perintah berikut untuk mendeploy file
slurmcluster.yamlke kluster: Output yang diharapkan:kubectl apply -f slurmcluster.yamlslurmcluster.kai.alibabacloud.com/slurm-job-demo createdJalankan 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 slurmclusterNAME AVAILABLE WORKERS STATUS AGE slurm-job-demo 5 ready 14mJalankan perintah berikut untuk memverifikasi bahwa semua pod dalam kluster yang dikelola Slurm bernama
slurm-job-demoberada 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-clusterNAME 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 daya | Nama sumber daya | Deskripsi |
|---|---|---|
| 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. |
| SlurmCluster | Kluster yang dikelola Slurm yang dirender. |
Parameter chart Helm
| Parameter | Contoh | Deskripsi |
|---|---|---|
| clusterName | "" | Nama kluster. Digunakan untuk menghasilkan Secret dan role. Nilainya harus sesuai dengan nama kluster dalam file konfigurasi Slurm Anda. |
| headNodeConfig | N/A | Wajib diisi. Mengonfigurasi pod slurmctld. |
| workerNodesConfig | N/A | Mengonfigurasi pod slurmd. |
| workerNodesConfig.deleteSelfBeforeSuspend | true | Ketika 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. |
| slurmdbdConfigs | N/A | Mengonfigurasi pod slurmdbd. Jika dibiarkan kosong, tidak ada pod slurmdbd yang dibuat. |
| slurmrestdConfigs | N/A | Mengonfigurasi pod slurmrestd. Jika dibiarkan kosong, tidak ada pod slurmrestd yang dibuat. |
| headNodeConfig.hostNetwork / slurmdbdConfigs.hostNetwork / slurmrestdConfigs.hostNetwork / workerNodesConfig.workerGroups[].hostNetwork | false | Dirender sebagai parameter hostNetwork dari pod yang bersangkutan. |
| headNodeConfig.setHostnameAsFQDN / slurmdbdConfigs.setHostnameAsFQDN / slurmrestdConfigs.setHostnameAsFQDN / workerNodesConfig.workerGroups[].setHostnameAsFQDN | false | Dirender sebagai parameter setHostnameAsFQDN dari pod yang bersangkutan. |
| headNodeConfig.nodeSelector / slurmdbdConfigs.nodeSelector / slurmrestdConfigs.nodeSelector / workerNodesConfig.workerGroups[].nodeSelector | nodeSelector: example: example | Dirender sebagai parameter nodeSelector dari pod yang bersangkutan. |
| headNodeConfig.tolerations / slurmdbdConfigs.tolerations / slurmrestdConfigs.tolerations / workerNodesConfig.workerGroups[].tolerations | tolerations:- key: value: operator: | Dirender sebagai tolerations dari pod yang bersangkutan. |
| 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 dari pod yang bersangkutan. |
| headNodeConfig.resources / slurmdbdConfigs.resources / slurmrestdConfigs.resources / workerNodesConfig.workerGroups[].resources | resources: 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[].imagePullSecrets | imagePullSecrets:- name: example | Dirender sebagai Secret yang digunakan untuk menarik image kontainer. |
| headNodeConfig.podSecurityContext / slurmdbdConfigs.podSecurityContext / slurmrestdConfigs.podSecurityContext / workerNodesConfig.workerGroups[].podSecurityContext | podSecurityContext: runAsUser: 1000 runAsGroup: 3000 fsGroup: 2000 supplementalGroups: [4000] | Dirender sebagai konteks keamanan tingkat pod. |
| headNodeConfig.securityContext / slurmdbdConfigs.securityContext / slurmrestdConfigs.securityContext / workerNodesConfig.workerGroups[].securityContext | securityContext: allowPrivilegeEscalation: false | Dirender sebagai konteks keamanan kontainer utama. |
| headNodeConfig.volumeMounts / slurmdbdConfigs.volumeMounts / slurmrestdConfigs.volumeMounts / workerNodesConfig.workerGroups[].volumeMounts | N/A | Dirender sebagai konfigurasi pemasangan volume kontainer utama. |
| headNodeConfig.volumes / slurmdbdConfigs.volumes / slurmrestdConfigs.volumes / workerNodesConfig.workerGroups[].volumes | N/A | Dirender 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.createConfigsByConfigMap | true | Menentukan 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.mungeConfigPathInPod | N/A | Path 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.createConfigsBySecret | N/A | Menentukan apakah akan membuat Secret secara otomatis untuk konfigurasi MUNGE. |
| mungeConfigs.secretName | N/A | Nama Secret yang menyimpan konfigurasi MUNGE. |
| mungeConfigs.content | N/A | Konten dalam Secret yang dibuat secara otomatis. |
Untuk informasi selengkapnya tentang slurmConfigs.filesInConfigMap, lihat Slurm System Configuration Tool (schedmd.com).
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
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/Jalankan perintah berikut untuk menarik dan mengekstrak chart Helm: Hal ini membuat direktori bernama
ack-slurm-clusterdi direktori saat ini. Direktori tersebut berisi semua file dan templat chart.helm pull aliyun/ack-slurm-cluster --untar=trueModifikasi parameter chart dalam file
values.yaml. Filevalues.yamlberisi 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.yamlGunakan 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.Verifikasi bahwa kluster yang dikelola Slurm telah dideploy. Setelah deployment selesai, gunakan
kubectluntuk 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 -- bashLogin 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-forwarduntuk 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
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-1kai.alibabacloud.com/slurm-node-type: head
Jalankan perintah berikut untuk mendapatkan alamat IP eksternal LoadBalancer Service:
kubectl get svcJalankan 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
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.
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:22Selama perintah
port-forwardberjalan, 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
Buat file bernama
ldap.yamldan salin konten berikut ke dalam file tersebut. Hal ini membuat instance LDAP dasar yang menyimpan dan mengelola informasi pengguna. Fileldap.yamlmendefinisikan pod backend LDAP dan Service terkaitnya. Pod tersebut berisi kontainer LDAP, dan Service mengekspos layanan LDAP dalam jaringan.Jalankan perintah berikut untuk mendeploy Service backend LDAP: Output yang diharapkan:
kubectl apply -f ldap.yamldeployment.apps/ldap created service/ldap-service created secret/ldap-secret created
(Opsional) Deploy frontend LDAP
Buat file bernama
phpldapadmin.yamldan salin konten berikut ke dalam file tersebut. Hal ini mendeploy pod frontend LDAP dan Service terkaitnya untuk meningkatkan efisiensi manajemen melalui antarmuka web.Jalankan perintah berikut untuk mendeploy Service frontend LDAP:
kubectl apply -f phpldapadmin.yaml
Konfigurasi klien LDAP
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-ldapdSetelah paket
libnss-ldapddiinstal, konfigurasikan layanan autentikasi jaringan untuk kluster yang dikelola Slurm di dalam pod.Modifikasi parameter berikut dalam file
/etc/nslcd.confuntuk 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.
Buat sistem file NAS untuk menyimpan dan berbagi log setiap node. Untuk informasi selengkapnya, lihat Buat sistem file.
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.
Modifikasi CR SlurmCluster. Konfigurasikan parameter
volumeMountsdanvolumesdi bagianslurmctlddanworkerGroupSpecsuntuk 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.Jalankan perintah berikut untuk mendeploy CR SlurmCluster. Setelah CR SlurmCluster dideploy, node worker dapat berbagi sistem file NAS.
PentingJika CR SlurmCluster gagal dideploy, jalankan perintah
kubectl delete slurmcluster slurm-job-demountuk 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.
Auto scaling untuk Slurm on ACK
Prosedur
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-demodan namespace-nya adalahdefault. Buat file bernamarbac.yamldan salin konten berikut ke dalam file tersebut: Jalankankubectl apply -f rbac.yamluntuk mengirimkan daftar resource. Selanjutnya, berikan izin ke pod slurmctld. Jalankankubectl edit slurmcluster slurm-job-demountuk memodifikasi kluster yang dikelola Slurm. AturSpec.Slurmctld.Template.Spec.ServiceAccountNameke ServiceAccount yang Anda buat: Untuk menerapkan perubahan, bangun ulang StatefulSet yang mengelola slurmctld. Jalankankubectl get sts slurm-job-demountuk menemukan StatefulSet, lalu jalankankubectl delete sts slurm-job-demountuk 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.ioapiVersion: kai.alibabacloud.com/v1 kind: SlurmCluster ... spec: slurmctld: template: spec: serviceAccountName: slurm-job-demo ...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.confdisimpan di ConfigMap bernamaslurm-config, jalankankubectl edit slurm-configuntuk 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
Jalankan perintah
helm upgradeuntuk 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"Terapkan konfigurasi baru. Jika nama kluster yang dikelola Slurm adalah
slurm-job-demo, jalankankubectl delete sts slurm-job-demountuk menerapkan konfigurasi baru untuk pod slurmctld.Atur jumlah replika node worker ke 0 di file
slurmcluster.yamlagar Anda dapat mengamati aktivitas scaling node pada langkah-langkah berikutnya.Manajemen manual
Jalankan
kubectl edit slurmcluster slurm-job-demodan ubah nilaiworkerCountmenjadi 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[].workerCountmenjadi0. Lalu jalankanhelm upgrade slurm-job-demo .untuk memperbarui chart Helm saat ini. Hal ini mengatur jumlah replika node worker ke 0.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.
Jalankan perintah berikut untuk mengirimkan skrip ke kluster yang dikelola Slurm untuk diproses:
cat << EOF > cloudnodedemo.sh> #!/bin/bash > srun hostname > EOFcat cloudnodedemo.sh#!/bin/bash srun hostnamesbatch cloudnodedemo.shSubmitted batch job 1Lihat 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-0ditambahkan ke kluster, mengonfirmasi bahwa kluster melakukan scale-out saat tugas dikirim. Output yang diharapkan: Output ini menunjukkan bahwaslurm-demo-worker-cpu-0adalah node yang baru dimulai dan 10 node cloud lainnya tersedia untuk scale-out. Output yang diharapkan: Dalam output tersebut,NodeList=slurm-demo-worker-cpu-0menunjukkan 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.Setelah periode tertentu, jalankan perintah berikut untuk melihat hasil scale-in:
cat /var/log/slurm-resume.lognamespace: 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 endkubectl get podNAME READY STATUS RESTARTS AGE slurm-demo-head-9hn67 1/1 Running 0 21m slurm-demo-worker-cpu-0 1/1 Running 0 43ssinfoPARTITION 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 1JobId=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=sinfoPARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 11 idle~ slurm-demo-worker-cpu-[0-10]