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
Masuk ke Konsol ACK. Di panel navigasi di sebelah kiri, pilih .
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.
Setelah Anda mengonfigurasi parameter, klik OK.
Langkah 2: Buat klaster yang dikelola Slurm
Buat klaster yang dikelola Slurm secara manual
Buat Secret Slurm untuk otentikasi berbasis MUNGE Uid 'N' Gid Emporium (MUNGE) untuk klaster ACK.
Jalankan perintah berikut untuk membuat kunci menggunakan OpenSSL. Kunci ini digunakan untuk otentikasi berbasis MUNGE.
openssl rand -base64 512 | tr -d '\r\n'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, sepertimungekey.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.
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
datadalam kode sampel berikut menentukan ConfigMap sampel. Untuk menghasilkan ConfigMap, kami sarankan Anda menggunakan alat Easy Configurator atau Full Configurator.Output yang diharapkan:
configmap/slurm-test createdOutput yang diharapkan menunjukkan bahwa ConfigMap telah dibuat.
Kirimkan CR SlurmCluster.
Buat file bernama slurmcluster.yaml dan salin konten berikut ke file tersebut. Contoh kode:
CatatanDalam 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.
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.
Jalankan perintah berikut untuk menyebarkan file slurmcluster.yaml ke klaster:
kubectl apply -f slurmcluster.yamlOutput yang diharapkan:
slurmcluster.kai.alibabacloud.com/slurm-job-demo createdJalankan perintah berikut untuk memeriksa apakah klaster yang dikelola Slurm yang dibuat berjalan sesuai harapan:
kubectl get slurmclusterOutput yang diharapkan:
NAME AVAILABLE WORKERS STATUS AGE slurm-job-demo 5 ready 14mOutput menunjukkan bahwa klaster yang dikelola Slurm telah disebarkan dan lima nodenya siap.
Jalankan perintah berikut untuk memeriksa apakah pod di dalam klaster yang dikelola Slurm bernama slurm-job-demo berada dalam keadaan Running:
kubectl get podOutput 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 14mOutput 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 | | Dirender sebagai parameter nodeSelector pod slurmctld. |
headNodeConfig.tolerations slurmdbdConfigs.tolerations slurmrestdConfigs.tolerations workerNodesConfig.workerGroups[].tolerations | | Dirender sebagai tolerations pod slurmctld. |
headNodeConfig.affinity slurmdbdConfigs.affinity slurmrestdConfigs.affinity workerNodesConfig.workerGroups[].affinity | | Dirender sebagai aturan affinity pod slurmctld. |
headNodeConfig.resources slurmdbdConfigs.resources slurmrestdConfigs.resources workerNodesConfig.workerGroups[].resources | | 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 | | Dirender sebagai Secret yang digunakan untuk menarik image slurmctld. |
headNodeConfig.podSecurityContext slurmdbdConfigs.podSecurityContext slurmrestdConfigs.podSecurityContext workerNodesConfig.workerGroups[].podSecurityContext | | Dirender sebagai konteks keamanan slurmctld. |
headNodeConfig.securityContext slurmdbdConfigs.securityContext slurmrestdConfigs.securityContext workerNodesConfig.workerGroups[].securityContext | | 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).
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:
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.
Jalankan perintah berikut untuk menarik dan mengekstrak bagan Helm:
helm pull aliyun/ack-slurm-cluster --untar=trueOperasi ini membuat direktori bernama
ack-slurm-clusterdi direktori saat ini. Direktori ack-slurm-cluster berisi semua file dan template bagan.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.yamlGunakan 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.
Periksa apakah klaster yang dikelola Slurm telah disebarkan.
Setelah penyebaran selesai, Anda dapat menggunakan alat
kubectlyang 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 -- bashMasuk 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
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-1dankai.alibabacloud.com/slurm-node-type: headke Layanan sehingga Layanan dapat merutekan permintaan masuk ke pod yang diharapkan.
Jalankan perintah berikut untuk mendapatkan alamat IP eksternal Layanan LoadBalancer:
kubectl get svcJalankan 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
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.
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:22Jalankan perintah berikut ketika perintah
port-forwardsedang 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:
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.
Jalankan perintah berikut untuk menyebarkan Layanan backend LDAP:
kubectl apply -f ldap.yamlOutput yang diharapkan:
deployment.apps/ldap created service/ldap-service created secret/ldap-secret createdOpsional. 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.
Jalankan perintah berikut untuk menyebarkan Layanan frontend LDAP:
kubectl apply -f phpldapadmin.yamlMasuk ke pod di klaster yang dikelola Slurm berdasarkan Langkah 3 dan jalankan perintah berikut untuk menginstal paket klien LDAP:
apt update apt install libnss-ldapdSetelah paket libnss-ldapd diinstal, konfigurasikan layanan otentikasi jaringan untuk klaster yang dikelola Slurm di dalam pod.
Jalankan perintah berikut untuk menginstal paket Vim untuk mengedit skrip dan file:
apt update apt install vimUbah 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. ...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:
Buat sistem file NAS untuk menyimpan dan berbagi log setiap node. Untuk informasi lebih lanjut, lihat Buat sistem file.
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.
Modifikasi CR SlurmCluster.
Konfigurasikan parameter
volumeMountsdanvolumesdi dalam parameterheadGroupSpecdanworkerGroupSpecuntuk 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.Jalankan perintah berikut untuk menyebarkan CR SlurmCluster.
PentingJika CR SlurmCluster gagal disebarkan, jalankan perintah
kubectl delete slurmcluster slurm-job-demountuk menghapus CR dan menyebarkannya ulang.kubectl apply -f slurmcluster.yamlSetelah 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
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 menjadidefault. Buat file bernamarbac.yamldan 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.ioJalankan perintah
kubectl apply -f rbac.yamluntuk mengirimkan daftar sumber daya.Berikan izin ke pod slurmctld. Jalankan perintah
kubectl edit slurmcluster slurm-job-demountuk 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-demountuk menemukan StatefulSet yang mengelola pod slurmctld. Jalankan perintahkubectl delete sts slurm-job-demountuk menghapus StatefulSet ini. Operator Slurm akan membangun ulang StatefulSet dan menerapkan konfigurasi baru.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.confdisimpan di ConfigMapslurm-config, Anda dapat menjalankan perintahkubectl edit slurm-configuntuk 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
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"Jalankan perintah
helm upgradeuntuk memperbarui konfigurasi Slurm.
Terapkan konfigurasi baru
Jika nama klaster yang dikelola Slurm adalah
slurm-job-demo, jalankan perintahkubectl delete sts slurm-job-demountuk menerapkan konfigurasi baru untuk pod slurmctld.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 perintahkubectl edit slurmcluster slurm-job-demountuk 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.Kirimkan pekerjaan menggunakan perintah sbatch.
Jalankan perintah berikut untuk membuat skrip Shell:
cat << EOF > cloudnodedemo.shMasukkan konten berikut setelah prompt perintah:
> #!/bin/bash > srun hostname > EOFJalankan perintah berikut untuk memeriksa apakah konten skrip benar:
cat cloudnodedemo.shOutput yang diharapkan:
#!/bin/bash srun hostnameOutput menunjukkan bahwa konten skrip benar.
Jalankan perintah berikut untuk mengirimkan skrip ke klaster yang dikelola Slurm untuk diproses:
sbatch cloudnodedemo.shOutput yang diharapkan:
Submitted batch job 1Output menunjukkan bahwa pekerjaan telah dikirimkan dan diberi ID pekerjaan.
Lihat hasil penskalaan klaster.
Jalankan perintah berikut untuk melihat log penskalaan klaster yang dikelola Slurm:
cat /var/log/slurm-resume.logOutput 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 endOutput menunjukkan bahwa klaster yang dikelola Slurm secara otomatis menambahkan satu node komputasi berdasarkan beban kerja untuk mengeksekusi pekerjaan yang dikirimkan.
Jalankan perintah berikut untuk melihat pod di dalam klaster:
kubectl get podOutput 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 43sOutput menunjukkan bahwa pod slurm-demo-worker-cpu-0 ditambahkan ke klaster. Dalam hal ini, klaster diperluas ketika pekerjaan dikirimkan.
Jalankan perintah berikut untuk melihat node di dalam klaster:
sinfoOutput 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.
Jalankan perintah berikut untuk melihat informasi tentang pekerjaan yang dieksekusi:
scontrol show job 1Output 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.
Setelah beberapa waktu, jalankan perintah berikut untuk melihat hasil penskalaan masuk node:
sinfoOutput 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.