全部产品
Search
文档中心

Container Service for Kubernetes:Implementasi penjadwalan kolokasi untuk Slurm dan Kubernetes di cluster ACK

更新时间:Dec 16, 2025

Topik ini menjelaskan cara mengimplementasikan penjadwalan kolokasi untuk Slurm dan Kubernetes dalam Container Service for Kubernetes (ACK) cluster. Solusi ini membantu Anda mengoptimalkan alokasi sumber daya dan penjadwalan beban kerja untuk pekerjaan komputasi kinerja tinggi (HPC) serta aplikasi berbasis kontainer di cluster Anda. Selain itu, solusi ini meningkatkan pemanfaatan sumber daya, stabilitas cluster, dan performa beban kerja. Anda dapat menggunakan solusi ini untuk memenuhi kebutuhan berbagai skenario komputasi dan membangun platform komputasi yang efisien dan fleksibel.

Ikhtisar

Mengapa kita perlu mengimplementasikan penjadwalan kolokasi di cluster ACK?

  • Solusi penjadwalan default: ACK secara statis mengalokasikan sumber daya. ACK dan Slurm menjadwalkan beban kerja secara terpisah. Di cluster Slurm, setiap pod Slurm memprakonsumsi sumber daya cluster. Kubernetes tidak dapat menggunakan sumber daya idle yang telah diprakonsumsi oleh pod Slurm. Hal ini menghasilkan fragmen sumber daya cluster. Jika Anda ingin memodifikasi konfigurasi sumber daya dari sebuah pod Slurm, Anda harus menghapus dan membuat ulang pod tersebut. Oleh karena itu, dalam skenario di mana ada kesenjangan besar antara sumber daya yang digunakan oleh cluster Slurm dan sumber daya yang digunakan oleh cluster Kubernetes, sulit untuk memigrasikan beban kerja ke node lain.

  • Solusi penjadwalan kolokasi: ACK menyediakan komponen ack-slurm-operator untuk mengimplementasikan penjadwalan kolokasi untuk Slurm dan Kubernetes di cluster ACK. Solusi ini menjalankan copilot di cluster Kubernetes dan plugin sumber daya ekstensi di cluster Slurm. Ini memungkinkan Kubernetes dan Slurm berbagi sumber daya cluster serta menghindari pengalokasian sumber daya berulang kali.

Gambar berikut menunjukkan solusi berbagi sumber daya sebelumnya.

Alokasi sumber daya statis dan penjadwalan beban kerja terpisah

Penjadwalan kolokasi untuk Slurm dan Kubernetes

Gambar berikut menunjukkan cara kerja solusi penjadwalan kolokasi.

yuque_diagram (2)

Komponen utama

Deskripsi

SlurmOperator

Komponen ini meluncurkan kluster Slurm di dalam kluster ACK. Kluster Slurm di-container-kan dan setiap pod pekerja Slurm berjalan pada node terpisah. Komponen sistem Slurm lainnya dijadwalkan ke node acak.

SlurmCopilot

Komponen ini menggunakan token kluster untuk berkoordinasi dengan slurmctld dalam alokasi sumber daya. Secara default, ketika slurmctld dijalankan, komponen ini secara otomatis menghasilkan token dan memperbarui token tersebut ke Secret menggunakan kubectl. Untuk memperbarui token secara manual, Anda dapat menggunakan skrip inisialisasi kustom atau mencabut izin pembaruan Secret. Kemudian, Anda perlu memperbarui token secara manual ke ack-slurm-jwt-token di namespace ack-slurm-operator. ack-slurm-jwt-token adalah pasangan nilai-kunci. Kuncinya adalah nama kluster dan nilainya adalah konten token yang dihasilkan dan di-enkode Base64 (base64 --wrap=0). Setelah pemeriksaan admission ditambahkan ke GenericNode, komponen ini memodifikasi jumlah sumber daya yang tersedia pada node yang sesuai di slurmctld. Setelah modifikasi selesai, status sumber daya diperbarui ke GenericNode. Lalu, komponen ini memberi tahu ACK scheduler untuk melakukan penjadwalan beban kerja.

Slurmctld

Pengelola pusat dari Slurm. Komponen ini memantau sumber daya dan pekerjaan di kluster Slurm, menjadwalkan pekerjaan, dan mengalokasikan sumber daya. Untuk meningkatkan ketersediaan slurmctld, Anda dapat mengonfigurasi pod sekunder untuk slurmctld.

GenericNodes

Komponen ini adalah resource kustom yang berfungsi sebagai buku besar sumber daya antara Kubernetes dan Slurm. Ketika scheduler ACK menjadwalkan pod ke node, pemeriksaan masuk ditambahkan ke GenericNode dari node untuk meminta sistem Slurm mengonfirmasi alokasi sumber daya.

Slurmd

Daemon yang berjalan di setiap node komputasi. Komponen ini menjalankan pekerjaan dan melaporkan status node dan pekerjaan ke slurmctld.

Slurmdbd

Daemon database Slurm. Komponen ini mencatat dan mengelola informasi buku besar dari pekerjaan yang berbeda dan menyediakan operasi API untuk kueri data dan statistik. slurmdbd adalah komponen opsional. Jika Anda tidak menginstal slurmdbd, Anda dapat mencatat informasi buku besar dalam file.

Slurmrested

Daemon API RESTful yang memungkinkan Anda berinteraksi dengan Slurm dan menggunakan fitur-fitur Slurm dengan memanggil API RESTful. slurmrestd adalah komponen opsional. Jika Anda tidak menginstal slurmrestd, Anda dapat menggunakan alat baris perintah untuk berinteraksi dengan Slurm.

1. Persiapkan lingkungan

1.1 Instal ack-slurm-operator

Sebuah cluster ACK yang menjalankan Kubernetes 1.26 atau lebih baru telah dibuat. Untuk informasi lebih lanjut, lihat Buat Cluster ACK dengan Node GPU-accelerated dan Perbarui Cluster.

Instal ack-slurm-operator dan aktifkan fitur Copilot. Dengan cara ini, Anda dapat menggunakan Slurm untuk menjadwalkan pekerjaan dan menggunakan Kubernetes untuk menjadwalkan pod pada batch server fisik yang sama.

  1. Masuk ke Konsol ACK. Klik nama cluster yang Anda buat. Pada halaman detail cluster, klik callout secara berurutan untuk menginstal ack-slurm-operator.

    Parameter Application Name dan Namespace bersifat opsional. Klik Next (callout ④). Dalam pesan Confirm, klik Yes. Dalam kasus ini, aplikasi default ack-slurm-operator dan namespace default ack-slurm-operator digunakan.

    image

  2. Pilih versi terbaru untuk Chart Version. Atur enableCopilot (callout ) menjadi true dan watchNamespace (callout ) menjadi default. Anda dapat mengatur watchNamespace ke namespace kustom berdasarkan kebutuhan bisnis Anda. Lalu, klik OK untuk menginstal ack-slurm-operator.image

  3. Opsional: Perbarui ack-slurm-operator.

    Masuk ke Konsol ACK. Pada halaman Informasi Cluster, pilih Aplikasi > Helm. Pada halaman Aplikasi, temukan ack-slurm-operator dan klik Perbarui.image

1.2 Instal dan konfigurasikan ack-slurm-cluster

Untuk menerapkan dan mengelola cluster Slurm dengan cepat serta memodifikasi konfigurasi cluster secara fleksibel, Anda dapat menggunakan Helm untuk menginstal paket SlurmClusterart yang disediakan oleh Alibaba Cloud. Unduh Helm chart untuk cluster Slurm dari charts-incubator dan atur parameter yang relevan. Lalu, Helm akan membuat sumber daya kontrol akses berbasis peran (RBAC), ConfigMaps, Secrets, dan cluster Slurm untuk Anda.

Tampilkan Isi Helm Chart dan Deskripsi Parameter

Helm chart mencakup konfigurasi sumber daya berikut.

Jenis Sumber Daya

Nama Sumber Daya

Fungsi dan Fitur

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 dari cluster 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 cluster Slurm. Cluster 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 cluster Slurm. Cluster 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 cluster Slurm. Cluster Slurm dapat menggunakan sumber daya ini untuk mengaktifkan penskalaan otomatis node cloud.

Role

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

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

RoleBinding

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

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

Secret

{{ .Values.mungeConfigs.secretName }}

Sumber daya ini digunakan oleh komponen Slurm untuk autentikasi ketika mereka berkomunikasi satu sama lain. Ketika parameter .Values.mungeConfigs.createConfigsBySecret diatur ke True, sumber daya ini secara otomatis dibuat. 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 lalu dirender sebagai jalur mount sumber daya di pod. Perintah startup pod menginisialisasi /etc/munge/munge.key berdasarkan jalur mount.

SlurmCluster

Dapat disesuaikan

Cluster Slurm yang dirender.

Tabel berikut menjelaskan parameter yang relevan.

Parameter

Contoh

Deskripsi

clusterName

N/A

Nama cluster. Nama cluster digunakan untuk menghasilkan Secrets dan roles. Nilainya harus sama dengan nama cluster yang ditentukan dalam file konfigurasi Slurm lainnya.

headNodeConfig

N/A

Parameter ini wajib. Parameter ini menentukan konfigurasi pod slurmctld.

workerNodesConfig

N/A

Parameter ini menentukan konfigurasi pod slurmd.

workerNodesConfig.deleteSelfBeforeSuspend

true

Ketika nilainya diatur ke true, hook preStop secara otomatis ditambahkan ke worker pod. 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 dari pod slurmctld.

headNodeConfig.setHostnameAsFQDN

slurmdbdConfigs.setHostnameAsFQDN

slurmrestdConfigs.setHostnameAsFQDN

workerNodesConfig.workerGroups[].setHostnameAsFQDN

false

Dirender sebagai parameter setHostnameAsFQDN dari pod slurmctld.

headNodeConfig.nodeSelector

slurmdbdConfigs.nodeSelector

slurmrestdConfigs.nodeSelector

workerNodesConfig.workerGroups[].nodeSelector

nodeSelector:
  example: example

Dirender sebagai parameter nodeSelector dari pod slurmctld.

headNodeConfig.tolerations

slurmdbdConfigs.tolerations

slurmrestdConfigs.tolerations

workerNodesConfig.workerGroups[].tolerations

tolerations:
- key:
  value:
  operator:

Dirender sebagai tolerations dari pod slurmctld.

headNodeConfig.affinity

slurmdbdConfigs.affinity

slurmrestdConfigs.affinity

workerNodesConfig.workerGroups[].affinity

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: topology.kubernetes.io/zone
          operator: In
          values:
          - zone-a
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 1
      preference:
        matchExpressions:
        - key: another-node-label-key
          operator: In
          values:
          - another-node-label-value

Dirender sebagai aturan afinitas pod slurmctld.

headNodeConfig.resources

slurmdbdConfigs.resources

slurmrestdConfigs.resources

workerNodesConfig.workerGroups[].resources

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

Dirender sebagai sumber daya kontainer utama di pod slurmctld. Batas sumber daya kontainer utama di 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 di main · AliyunContainerService/ai-models-on-ack (github.com).

headNodeConfig.imagePullSecrets

slurmdbdConfigs.imagePullSecrets

slurmrestdConfigs.imagePullSecrets

workerNodesConfig.workerGroups[].imagePullSecrets

imagePullSecrets:
- name: example

Dirender sebagai Secret yang digunakan untuk menarik image slurmctld.

headNodeConfig.podSecurityContext

slurmdbdConfigs.podSecurityContext

slurmrestdConfigs.podSecurityContext

workerNodesConfig.workerGroups[].podSecurityContext

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

Dirender sebagai konteks keamanan slurmctld.

headNodeConfig.securityContext

slurmdbdConfigs.securityContext

slurmrestdConfigs.securityContext

workerNodesConfig.workerGroups[].securityContext

securityContext:
  allowPrivilegeEscalation: false

Dirender sebagai konteks keamanan kontainer utama di pod slurmctld.

headNodeConfig.volumeMounts

slurmdbdConfigs.volumeMounts

slurmrestdConfigs.volumeMounts

workerNodesConfig.workerGroups[].volumeMounts

N/A

Dirender sebagai konfigurasi pemasangan volume kontainer utama di pod slurmctld.

headNodeConfig.volumes

slurmdbdConfigs.volumes

slurmrestdConfigs.volumes

workerNodesConfig.workerGroups[].volumes

N/A

Dirender sebagai volume yang dipasang ke pod slurmctld.

slurmConfigs.slurmConfigPathInPod

N/A

Jalur mount file konfigurasi Slurm di 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 mount ke jalur /etc/slurm/ dan membatasi akses ke file tersebut.

slurmConfigs.createConfigsByConfigMap

true

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

slurmConfigs.configMapName

N/A

Nama ConfigMap yang menyimpan konfigurasi Slurm.

slurmConfigs.filesInConfigMap

N/A

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

mungeConfigs.mungeConfigPathInPod

N/A

Jalur mount file konfigurasi MUNGE di 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 mount ke jalur /etc/munge/ dan membatasi akses ke file tersebut.

mungeConfigs.createConfigsBySecret

N/A

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

mungeConfigs.secretName

N/A

Nama Secret yang menyimpan konfigurasi MUNGE.

mungeConfigs.content

N/A

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

Untuk informasi lebih lanjut tentang parameter slurmConfigs.filesInConfigMap, lihat Alat Konfigurasi Sistem Slurm (schedmd.com).

Penting

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

Lakukan operasi berikut:

  1. Jalankan perintah berikut untuk menambahkan repositori chart yang disediakan oleh Alibaba Cloud ke klien Helm Anda: Setelah repositori ditambahkan, Anda dapat mengakses Helm chart yang disediakan oleh Alibaba Cloud, seperti chart komponen ack-slurm-cluster.

    helm repo add aliyun https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
  2. Jalankan perintah berikut untuk menarik dan mendekompres chart ack-slurm-cluster. Operasi ini membuat subdirektori bernama ack-slurm-cluster di direktori saat ini. Direktori ack-slurm-cluster berisi semua file dan template yang termasuk dalam chart.

    helm pull aliyun/ack-slurm-cluster --untar=true
  3. Jalankan perintah berikut untuk memodifikasi parameter chart di file values.yaml.

    File values.yaml berisi konfigurasi default dari chart. Anda dapat memodifikasi pengaturan parameter di file berdasarkan kebutuhan bisnis Anda. Pengaturan tersebut mencakup konfigurasi Slurm, permintaan sumber daya dan batasnya, serta konfigurasi penyimpanan.

    cd ack-slurm-cluster
    vi values.yaml

    Tampilkan Langkah-langkah untuk Menghasilkan JSON Web Token (JWT) dan Mengirimkan JWT ke Cluster

    Hasilkan kunci untuk plugin autentikasi JWT dan jalankan perintah untuk mengimpor kunci ke cluster. Untuk informasi lebih lanjut, lihat Plugin Autentikasi JWT.

    1. Dapatkan JSON Web Key (JWK) untuk menandatangani dan mengautentikasi JWT.

      Plugin autentikasi JWT menggunakan JWK (RFC7517) untuk menandatangani dan mengautentikasi JWT. Untuk mengonfigurasi plugin autentikasi JWT, Anda harus terlebih dahulu menghasilkan JWK yang valid. Anda dapat menghasilkan JWK secara manual atau menggunakan generator JWK online, seperti mkjwk.org, untuk menghasilkan JWK. Contoh kode berikut menunjukkan konten JWK. Kunci privat digunakan untuk menandatangani JWT. Kunci publik di plugin autentikasi JWT digunakan untuk mengautentikasi JWT. Contoh konten JWK:

      {
        "kty": "RSA",
        "e": "AQAB",
        "kid": "O9fpdhrViq2zaaaBEWZITz",
        "use": "sig",
        "alg": "RS256",
        "n": "qSVxcknOm0uCq5vGsOmaorPDzHUubBmZZ4UXj-9do7w9X1uKFXAnqfto4TepSNuYU2bA_-tzSLAGBsR-BqvT6w9SjxakeiyQpVmexxnDw5WZwpWenUAcYrfSPEoNU-0hAQwFYgqZwJQMN8ptxkd0170PFauwACOx4Hfr-9FPGy8NCoIO4MfLXzJ3mJ7xqgIZp3NIOGXz-GIAbCf13ii7kSStpYqN3L_zzpvXUAos1FJ9IPXRV84tIZpFVh2lmRh0h8ImK-vI42dwlD_hOIzayL1Xno2R0T-d5AwTSdnep7g-Fwu8-sj4cCRWq3bd61Zs2QOJ8iustH0vSRMYdP5oYQ"
      }        

      JWK sebelumnya dalam format JSON. Jika Anda ingin mengonfigurasi plugin autentikasi JWT dalam format YAML, Anda harus menggunakan JWK dalam format YAML.*

      • Untuk plugin autentikasi JWT, Anda hanya perlu mengonfigurasi kunci publik. Simpan kredensial kunci privat Anda. Tabel berikut menjelaskan algoritme penandatanganan yang didukung oleh plugin autentikasi JWT.

      Algoritme tanda tangan

      Pengaturan alg yang didukung

      RSASSA-PKCS1-V1_5 dengan SHA-2

      RS256, RS384, RS512

      Kurva Eliptik (ECDSA) dengan SHA-2

      ES256, ES384, ES512

      HMAC menggunakan SHA-2

      HS256, HS384, HS512

      Penting

      Saat mengonfigurasi kunci jenis HS256, HS384, atau HS512, nilai kunci dikodekan dalam Base64URL. Jika tanda tangannya tidak valid, periksa apakah kunci Anda memiliki format yang sama dengan kunci yang digunakan untuk menghasilkan token.

    2. Impor JWK ke cluster.

      kubectl create configmap jwt --from-literal=jwt_hs256.key={{ .jwtkey }}

    Tampilkan Langkah-langkah untuk Menentukan Alamat Database dan Mengonfigurasi Sumber Daya Generik (GRE)

    Aktifkan slurmrestd dan slurmdbd. Modifikasi parameter .Values.slurmConfigs.filesInConfigMap di file values.yaml untuk menentukan alamat database dan mengonfigurasi GRE.

    slurmConfigs:
      ...
      filesInConfigMap:
        gres.conf: |
          # Konfigurasikan Copilot untuk memperbarui informasi tentang sumber daya yang dialokasikan dari Kubernetes ke Slurm.
          Name=k8scpu Flags=CountOnly
          Name=k8smemory Flags=CountOnly
        slurmdbd.conf: |
          # Jalur log. Jalur tersebut harus sama dengan jalur yang ditentukan dalam konfigurasi autentikasi berikut.
          LogFile=/var/log/slurmdbd.log
          # Saat menggunakan slurmrestd, Anda harus menentukan autentikasi JWT.
          AuthAltTypes=auth/jwt
          # slurmdbd perlu menggunakan kunci di jalur berikut untuk mengautentikasi token. Gunakan konfigurasi berikut untuk memasang kunci ke pod.
          AuthAltParameters=jwt_key=/var/jwt/jwt_hs256.key
          AuthType=auth/munge
          SlurmUser=slurm
          # Tentukan akun database MySQL.
          StoragePass=
          StorageHost=
          StorageType=accounting_storage/mysql
          StorageUser=root
          StoragePort=3306
        slurm.conf: |
          # Tentukan atribut sumber daya ekstensi berikut untuk node di cluster Slurm: k8scpu dan k8smemory. Ini mencegah node memasuki status DOWN.
          NodeFeaturesPlugins=node_features/k8s_resources
          # Aktifkan Slurm untuk secara otomatis menambahkan k8scpu dan k8smemory saat Anda menggunakan Slurm untuk mengirim pekerjaan.
          JobSubmitPlugins=k8s_resource_completion
          AccountingStorageHost=slurm-test-slurmdbd
          # Saat menggunakan slurmrestd, Anda harus menentukan autentikasi JWT.
          AuthAltTypes=auth/jwt
          # slurmctld perlu menggunakan kunci di jalur berikut untuk mengautentikasi token. Gunakan konfigurasi berikut untuk memasang kunci ke pod.
          AuthAltParameters=jwt_key=/var/jwt/jwt_hs256.key
          # Konfigurasikan Copilot untuk memperbarui informasi tentang sumber daya yang dialokasikan dari Kubernetes ke Slurm.
          GresTypes=k8scpu,k8smemory
          # Tentukan ${slurmClusterName}-slurmdbd. slurmOperator secara otomatis menerapkan slurmdbd.
          AccuntingStorageHost=
          AccountingStoragePort=6819
          AccountingStorageType=accounting_storage/slurmdbd
          # Informasi yang digunakan oleh plugin JobComp untuk mengakses database MySQL.
          JobCompHost=
          JobCompLoc=/var/log/slurm/slurm_jobcomp.log
          JobCompPass=
          JobCompPort=3306
          JobCompType=jobcomp/mysql
          JobCompUser=root
          # Konfigurasi yang memastikan ketersediaan tinggi.
          SlurmctldHost=

    Tampilkan Langkah-langkah untuk Mengonfigurasi Pod slurmrestd dan Pod slurmdbd

    Konfigurasikan pod slurmrestd dan pod slurmdbd.

    ...
    headNodeConfig:
      image: "registry-cn-hangzhou.ack.aliyuncs.com/acs/slurm:23.06-1.6-aliyun-49259f59"
      # Pasang kunci JWT yang dihasilkan ke Slurm. Jalur mount harus sama dengan jalur yang ditentukan di bagian sebelumnya.
      volumes: 
      - configMap:
          defaultMode: 444
          name: jwt
        name: config-jwt
      volumeMounts: 
      - mountPath: /var/jwt
        name: config-jwt
    slurmdbdConfigs:
      nodeSelector: {}
      tolerations: []
      affinity: {}
      resources: {}
      image: "registry-cn-hangzhou.ack.aliyuncs.com/acs/slurm:23.06-1.6-aliyun-49259f59"
      imagePullSecrets: []
      # jika .slurmConfigs.createConfigsByConfigMap adalah true, slurmConfPath dan volume dan volumeMounts akan diatur secara otomatis sebagai:
      #  volumeMounts:
      #    - name: config-{{ .Values.slurmConfigs.configMapName }}
      #      mountPath: {{ .Values.slurmConfigs.slurmConfigPathInPod }}
      # volumes:
      #   - name: config-{{ .Values.slurmConfigs.configMapName }}
      #     configMap:
      #       name: {{ .Values.slurmConfigs.configMapName }}
      # juga untuk mungeConfigs.createConfigsBySecret
      # Pasang kunci JWT yang dihasilkan ke Slurm. Jalur mount harus sama dengan jalur yang ditentukan di bagian sebelumnya.
    
      volumes: 
      - configMap:
          defaultMode: 444
          name: jwt
        name: config-jwt
      volumeMounts: 
      - mountPath: /var/jwt
        name: config-jwt
    
    slurmrestdConfigs:
      nodeSelector: {}
      tolerations: []
      affinity: {}
      resources: {}
      image: "registry-cn-hangzhou.ack.aliyuncs.com/acs/slurm:23.06-1.6-aliyun-49259f59"
      imagePullSecrets: []
      # jika .slurmConfigs.createConfigsByConfigMap adalah true, slurmConfPath dan volume dan volumeMounts akan diatur secara otomatis sebagai:
      #  volumeMounts:
      #    - name: config-{{ .Values.slurmConfigs.configMapName }}
      #      mountPath: {{ .Values.slurmConfigs.slurmConfigPathInPod }}
      # volumes:
      #   - name: config-{{ .Values.slurmConfigs.configMapName }}
      #     configMap:
      #       name: {{ .Values.slurmConfigs.configMapName }}
      # juga untuk mungeConfigs.createConfigsBySecret
      # Pasang kunci JWT yang dihasilkan ke Slurm. Jalur mount harus sama dengan jalur yang ditentukan di bagian sebelumnya.
      volumes: 
      - configMap:
          defaultMode: 444
          name: jwt
        name: config-jwt
      volumeMounts: 
      - mountPath: /var/jwt
        name: config-jwt
  4. Jalankan perintah berikut untuk menginstal chart ack-slurm-cluster. Jika chart ack-slurm-cluster sudah diinstal, Anda dapat menjalankan perintah helm upgrade untuk memperbarui chart yang telah diinstal. Setelah Anda memperbarui chart yang telah diinstal, Anda harus secara manual menghapus pod yang ada dan StatefulSet yang dibuat untuk slurmctld agar pembaruan berlaku.

    cd ..
    helm install my-slurm-cluster ack-slurm-cluster # Ganti my-slurm-cluster dengan nilai aktual.
  5. Setelah menginstal chart, jalankan perintah helm list untuk memeriksa apakah chart ack-slurm-cluster berhasil diinstal.

    helm list

    Keluaran yang diharapkan:

    NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
    ack-slurm-cluster       default         1               2024-07-19 14:47:58.126357 +0800 CST    deployed        ack-slurm-cluster-2.0.0 2.0.0      
  6. Periksa apakah slurmrestd dan slurmdbd berjalan sesuai harapan.

    1. Gunakan kubectl untuk terhubung ke cluster dan periksa apakah pod slurmdbd berjalan sesuai harapan.

      kubectl get pod

      Keluaran sampel berikut menunjukkan bahwa satu pod pekerja dan tiga pod kontrol plane berjalan di cluster.

      NAME                          READY   STATUS    RESTARTS   AGE
      slurm-test-slurmctld-dlncz    1/1     Running   0          3h49m
      slurm-test-slurmdbd-8f75r     1/1     Running   0          3h49m
      slurm-test-slurmrestd-mjdzt   1/1     Running   0          3h49m
      slurm-test-worker-cpu-0       1/1     Running   0          166m
    2. Jalankan perintah berikut untuk menanyakan log. Anda dapat melihat log untuk memeriksa apakah slurmdbd berjalan sesuai harapan.

      kubectl exec slurm-test-slurmdbd-8f75r cat /var/log/slurmdbd.log | head

      Keluaran yang diharapkan:

      kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
      [2024-07-22T19:52:55.727] accounting_storage/as_mysql: _check_mysql_concat_is_sane: Versi server MySQL adalah: 8.0.34
      [2024-07-22T19:52:55.737] error: Pengaturan database bukan nilai yang direkomendasikan: innodb_lock_wait_timeout
      [2024-07-22T19:52:56.089] slurmdbd versi 23.02.7 dimulai

Klik Tampilkan Langkah-langkah untuk Membangun Image Slurm untuk melihat cara menginstal dependensi di Slurm.

Tampilkan Langkah-langkah untuk Membangun Image Slurm

Siapkan image Slurm. Image (registry-cn-beijing.ack.aliyuncs.com/acs/slurm:23.06-1.6-aliyun-49259f59) telah diinstal sebelumnya dengan semua perangkat lunak yang digunakan dalam topik ini. Anda dapat menggunakan Dockerfile berikut untuk membangun image Slurm. Anda juga dapat menambahkan dependensi kustom. Periksa apakah plugin berikut diinstal di image. Anda dapat memperoleh paket plugin berikut dan kode sumber Dockerfile dari repository kode sumber terbuka milik Alibaba Cloud.

  • kubectl, node_features, dan k8s_resources diperlukan.

  • Anda harus menginstal job_submit atau k8s_resource_completion. job_submit atau k8s_resource_completion digunakan untuk mengaktifkan penyelesaian otomatis untuk GRE.

    Secara default, ketika slurmd mengirimkan permintaan _slurm_rpc_node_registration, slurmctld memeriksa penggunaan GRE pada node. Jika penggunaan GRE berubah, node dianggap tidak valid dan ditandai sebagai INVAL. Tidak ada pekerjaan yang dapat dijadwalkan ke node dalam status INVAL. Akibatnya, cluster mungkin tidak berjalan sesuai harapan. Untuk menyelesaikan masalah ini, Anda harus menghapus node dari cluster dan menambahkan node ke cluster lagi. Ketika atribut ActivateFeature dari node diperbarui, plugin k8s_resources mengatur atribut k8scpu dan k8smemory menjadi 0 dan menyetel flag node_feature dari k8scpu dan k8smemory menjadi true. Ini melewati pemeriksaan GRE pada node dan memastikan bahwa sumber daya di cluster dapat digunakan sesuai harapan.

Tampilkan Isi Contoh Dockerfile

FROM nvidia/cuda:11.4.3-cudnn8-devel-ubuntu20.04 as exporterBuilder
ENV TZ=Asia/Shanghai
ENV DEBIAN_FRONTEND=noninteractive
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && apt install -y golang git munge libhttp-parser-dev libjson-c-dev libyaml-dev libjwt-dev libgtk2.0-dev libreadline-dev libpmix-dev libmysqlclient-dev libhwloc-dev openmpi-bin openmpi-common libopenmpi-dev rpm libmunge-dev libmunge2 libpam-dev perl python3 systemd lua5.3 libnvidia-ml-dev libhdf5-dev
# Unduh kode sumber sebelum membangun image
COPY ./slurm-23.02.7.tar.bz2 ./slurm-23.02.7.tar.bz2
RUN tar -xaf slurm-23.02.7.tar.bz2
COPY ../node_features/k8s_resources ./slurm-23.02.7/src/plugins/node_features/k8s_resources
RUN sed -i '/"src\/plugins\/node_features\/Makefile") CONFIG_FILES="\$CONFIG_FILES src\/plugins\/node_features\/Makefile" ;;/ a "    src/plugins/node_features/k8s_resources/Makefile") CONFIG_FILES="\$CONFIG_FILES src/plugins/node_features/k8s_resources/Makefile" ;;' ./slurm-23.02.7/configure
RUN awk '/^ac_config_files="\$ac_config_files/ && !found { print; print "ac_config_files=\"$ac_config_files src/plugins/node_features/k8s_resources/Makefile\""; found=1; next } { print }' ./slurm-23.02.7/configure > ./slurm-23.02.7/configure.new && mv ./slurm-23.02.7/configure.new ./slurm-23.02.7/configure && chmod +x ./slurm-23.02.7/configure
RUN cat ./slurm-23.02.7/configure
RUN sed -i '/^SUBDIRS =/ s/$/ k8s_resources/' ./slurm-23.02.7/src/plugins/node_features/Makefile & \
sed -i '/^SUBDIRS =/ s/$/ k8s_resources/' ./slurm-23.02.7/src/plugins/node_features/Makefile.in & \
sed -i '/^SUBDIRS =/ s/$/ k8s_resources/' ./slurm-23.02.7/src/plugins/node_features/Makefile.am
RUN cd slurm-23.02.7 && ./configure --prefix=/usr/ --sysconfdir=/etc/slurm && make 

FROM nvidia/cuda:11.4.3-cudnn8-runtime-ubuntu20.04
ENV TZ=Asia/Shanghai
ENV DEBIAN_FRONTEND=noninteractive
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt update
RUN apt install -y munge libhttp-parser-dev libjson-c-dev libyaml-dev libjwt-dev libgtk2.0-dev libreadline-dev libpmix-dev libmysqlclient-dev libhwloc-dev openmpi-bin openmpi-common libopenmpi-dev rpm libmunge-dev libmunge2 libpam-dev perl python3 systemd lua5.3 inotify-tools openssh-server pip libnvidia-ml-dev libhdf5-dev
COPY --from=0 /slurm-23.02.7 /slurm-23.02.7
RUN cd slurm-23.02.7 && make install && cd ../ && rm -rf /slurm-23.02.7
RUN apt remove libnvidia-ml-dev libnvidia-compute-545 -y; apt autoremove -y ; ln -s /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so
COPY ./sh ./
RUN mkdir /etc/slurm
RUN chmod +x create-users.sh munge-inisitalization.sh slurm-initialization.sh slurm-suspend.sh slurm-resume.sh slurmd slurmctld slurmdbd slurmrestd
RUN touch /var/log/slurm-resume.log /var/log/slurm-suspend.log ; chmod 777 /var/log/slurm-resume.log /var/log/slurm-suspend.log
RUN mv slurmd /etc/init.d/slurmd && mv slurmdbd /etc/init.d/slurmdbd && mv slurmctld /etc/init.d/slurmctld
RUN ./create-users.sh && ./munge-inisitalization.sh && ./slurm-initialization.sh
RUN rm ./create-users.sh ./munge-inisitalization.sh ./slurm-initialization.sh
ENV NVIDIA_VISIBLE_DEVICES=
RUN apt-get update && apt-get upgrade -y && rm -rf /var/cache/apt/

2. Uji penjadwalan kolokasi

2.1 Uji penjadwalan kolokasi

  1. Periksa status GenericNodes untuk melihat beban kerja Slurm dan beban kerja Kubernetes.

    kubectl get genericnode

    Keluaran yang diharapkan:

    NAME                    CLUSTERNAME   ALIAS                     TYPE    ALLOCATEDRESOURCES
    cn-hongkong.10.1.0.19                 slurm-test-worker-cpu-0   Slurm   [{"allocated":{"cpu":"0","memory":"0"},"type":"Slurm"},{"allocated":{"cpu":"1735m","memory":"2393Mi"},"type":"Kubernetes"}]
  2. Jalankan perintah berikut untuk mengirim pekerjaan ke cluster Slurm dan menanyakan GenericNodes. GenericNode yang dikembalikan mencatat penggunaan sumber daya dari pekerjaan di cluster Slurm dan penggunaan sumber daya dari pekerjaan di cluster Kubernetes.

    root@iZj6c1wf3c25dbynbna3qgZ ~]# kubectl exec slurm-test-slurmctld-dlncz -- nohup srun --cpus-per-task=3 --mem=4000 --gres=k8scpu:3,k8smemory:4000 sleep inf &
    [1] 4132674
    
    [root@iZj6c1wf3c25dbynbna3qgZ ~]# kubectl scale deployment nginx-deployment-basic --replicas 2
    deployment.apps/nginx-deployment-basic scaled
    
    [root@iZj6c1wf3c25dbynbna3qgZ ~]# kubectl get genericnode
    NAME                    CLUSTERNAME   ALIAS                     TYPE    ALLOCATEDRESOURCES
    cn-hongkong.10.1.0.19                 slurm-test-worker-cpu-0   Slurm   [{"allocated":{"cpu":"3","memory":"4000Mi"},"type":"Slurm"},{"allocated":{"cpu":"2735m","memory":"3417Mi"},"type":"Kubernetes"}]
  3. Dalam kasus ini, jika Anda mengirim pekerjaan lain ke cluster Slurm, pekerjaan kedua akan memasuki status Pending.

    [root@iZj6c1wf3c25dbynbna3qgZ ~]# kubectl exec slurm-test-slurmctld-dlncz -- nohup srun --cpus-per-task=3 --mem=4000 sleep inf &
    [2] 4133454
    
    [root@iZj6c1wf3c25dbynbna3qgZ ~]# srun: job 2 queued and waiting for resources
    
    [root@iZj6c1wf3c25dbynbna3qgZ ~]# kubectl exec slurm-test-slurmctld-dlncz -- squeue
     JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
         2     debug    sleep     root PD       0:00      1 (Resources)
         1     debug    sleep     root  R       2:34      1 slurm-test-worker-cpu-0

Dalam contoh ini, tidak ada GRE yang ditentukan secara manual. Namun, GRE masih ditampilkan dalam perintah srun sebelumnya. Hal ini karena cluster Slurm telah diinstal sebelumnya dengan plugin job_resource_completion, yang secara otomatis menambahkan GRE berdasarkan permintaan CPU dan permintaan memori. Jika job_resource_completion tidak diinstal, Anda harus secara manual menentukan GRE. Dalam contoh ini, konfigurasi GRE berikut ditentukan: --gres=k8scpu:3,k8smemory:4000. Klik Tampilkan Deskripsi Skrip Pekerjaan Slurm untuk melihat cara menentukan parameter dalam skrip pekerjaan Slurm.

Tampilkan Deskripsi Skrip Pekerjaan Slurm

Saat Anda mengirim pekerjaan di cluster Slurm, Anda harus menghitung jumlah GRE. Bagian berikut menjelaskan parameter yang tersedia saat Anda menggunakan srun dan sbatch untuk mengirim pekerjaan dan memberikan contoh tentang cara menghitung jumlah GRE untuk sebuah pekerjaan.

Parameter

Deskripsi

--tres-per-task

Sumber daya yang dapat dilacak (TRE) yang diperlukan oleh setiap tugas dalam pekerjaan.

--gres

GRE yang diperlukan oleh pekerjaan.

Tampilkan Langkah-langkah untuk Menghitung Sumber Daya untuk Pekerjaan Slurm

Saat Anda menghitung jumlah GRE yang diperlukan oleh sebuah pekerjaan, Anda harus menghitung jumlah vCPU dan jumlah memori yang diperlukan oleh pekerjaan tersebut dari setiap node dengan menggunakan metode berikut:

  1. Hitung jumlah total vCPU yang diperlukan.

    Saat menggunakan Slurm untuk menjadwalkan pekerjaan, kunci untuk memastikan alokasi sumber daya yang efisien dan penjadwalan pekerjaan adalah dengan menghitung jumlah total vCPU yang diperlukan oleh setiap tugas dari setiap node.

    Perhitungan didasarkan pada parameter berikut:

    • Nodes: Jumlah node yang diperlukan oleh pekerjaan.

    • Tasks per Node: Jumlah tugas yang berjalan di setiap node.

    • CPUs per Task: Jumlah vCPU yang diperlukan oleh setiap tugas.

    Parameter sebelumnya dapat ditentukan dalam opsi skrip atau perintah Slurm.

    Rumus

    Jumlah total vCPU yang diperlukan dari sebuah node = Jumlah tugas per node × Jumlah vCPU yang diperlukan oleh setiap tugas

    Contoh

    Parameter berikut digunakan:

    • Nodes: 2

    • Tasks per Node: 4

    • CPUs per Task: 2

    Jumlah total vCPU yang diperlukan dari setiap node adalah 8 (4 × 2). Dalam kasus ini, dua node digunakan. Oleh karena itu, jumlah total vCPU yang diperlukan oleh pekerjaan adalah 16 (8 × 2).

  2. Hitung jumlah total memori yang diperlukan.

    Saat menggunakan Slurm untuk menjadwalkan pekerjaan, kunci untuk memastikan alokasi memori yang tepat dan mencegah pemborosan atau kekurangan memori adalah menghitung jumlah total memori yang diperlukan oleh setiap tugas dari setiap node. Jumlah total memori yang diperlukan tergantung pada jumlah tugas yang berjalan di setiap node dan jumlah memori yang diperlukan oleh setiap tugas.

    Jumlah total memori yang diperlukan dari sebuah node = Jumlah tugas per node × Jumlah vCPU yang diperlukan oleh setiap tugas × Jumlah memori per vCPU

  3. Aktifkan penyelesaian otomatis untuk GRE saat Anda mengirim pekerjaan.

    Jika Anda ingin menambahkan konfigurasi --gres secara manual saat Anda mengirim pekerjaan, Anda harus secara manual menghitung jumlah vCPU (CPU) dan jumlah memori (MEM) yang diperlukan oleh pekerjaan dari setiap node. Namun, Anda masih dapat mengirim pekerjaan tanpa konfigurasi --gres.

    Dalam kasus ini, Anda dapat menginstal plugin job_submit untuk mengaktifkan penyelesaian otomatis untuk konfigurasi --gres. A contoh kode telah disediakan. Saat menggunakan contoh kode untuk mengirim pekerjaan, Anda harus menambahkan konfigurasi -n atau --tasks untuk menentukan jumlah tugas. Jika tidak, pengiriman pekerjaan akan gagal. Jika Anda menggunakan konfigurasi --gpus atau --gpus-per-socket untuk menyatakan jumlah GPU yang dibutuhkan oleh pekerjaan, pengiriman pekerjaan akan gagal. Untuk menyatakan GPU, Anda harus menggunakan konfigurasi --gpus-per-task.

Contoh Skrip Pekerjaan Slurm

#!/bin/bash
#SBATCH --job-name=test_job                   # Nama pekerjaan.
#SBATCH --nodes=2                             # Jumlah node yang diperlukan oleh pekerjaan.
#SBATCH --ntasks-per-node=4                   # Jumlah tugas yang dijalankan di setiap node.
#SBATCH --cpus-per-task=2                     # Jumlah vCPU yang diperlukan oleh setiap tugas.
#SBATCH --time=01:00:00                       # Durasi maksimum pekerjaan.
#SBATCH --output=job_output_%j.txt            # Nama file stdout.
#SBATCH --error=job_error_%j.txt              # Nama file stderr.

# Perintah pekerjaan yang ditentukan pengguna.
srun my_program

Anda juga dapat menentukan parameter sebelumnya dalam perintah.

sbatch --nodes=2 --ntasks-per-node=4 --cpus-per-task=2 --time=01:00:00 --job-name=test_job my_job_script.sh

Deskripsi Parameter:

  • --nodes (-N): Jumlah node yang diperlukan oleh pekerjaan.

  • --ntasks-per-node (--tasks-per-node): Jumlah tugas yang dijalankan di setiap node.

  • --cpus-per-task: Jumlah vCPU yang diperlukan oleh setiap tugas.

  • --time (-t): Durasi maksimum pekerjaan.

  • --job-name (-J): Nama pekerjaan.

Opsional: 2.2 Implementasikan penjadwalan kolokasi di cluster Slurm non-kontainer

SlurmCopilot menggunakan API Slurm untuk berinteraksi dengan Slurm. Metode interaksi ini juga berlaku untuk skenario cluster Slurm non-kontainer.

Dalam skenario cluster Slurm non-kontainer, sumber daya Kubernetes tertentu hanya dapat dibuat secara manual, termasuk token yang disebutkan di bagian sebelumnya. Bagian berikut menjelaskan sumber daya Kubernetes yang harus dibuat secara manual.

  1. Buat Service untuk setiap cluster Slurm.

    SlurmCopilot menanyakan informasi tentang Service dari cluster dan mengirimkan permintaan API ke endpoint ${.metadata.name}.${.metadata.namespace}.svc.cluster.local:${.spec.ports[0].port}. Dalam skenario cluster Slurm non-kontainer, Anda harus membuat Service untuk setiap cluster Slurm. Blok kode berikut memberikan contoh konfigurasi Service. Perhatikan bahwa nama Service dari cluster Slurm harus dalam format ${slurmCluster}-slurmrestd. Nilai ${slurmCluster} harus sesuai dengan GenericNodes di cluster Slurm.

    apiVersion: v1
    kind: Service
    metadata:
      name: slurm-slurmrestd
      namespace: default
    spec:
      ports:
      - name: slurmrestd
        port: 8080
        protocol: TCP
        targetPort: 8080
  2. Konfigurasikan catatan DNS untuk setiap cluster Slurm.

    Untuk mengaktifkan akses ke proses slurmrestd, Anda harus mengonfigurasi catatan DNS dalam konfigurasi SlurmCopilot untuk menunjuk ${.metadata.name}.${.metadata.namespace}.svc.cluster.local:${.spec.ports[0].port} ke alamat IP proses slurmrestd.

  3. Buat GenericNodes untuk node di cluster Slurm.

    SlurmCopilot menggunakan GenericNodes sebagai alias node di cluster Slurm. Jika Anda tidak membuat GenericNode untuk node di cluster Slurm, SlurmCopolit tidak dapat memperoleh informasi tentang node tersebut. Nama GenericNode untuk sebuah node harus sama dengan nama node dalam sistem Kubernetes. Nilai parameter .spec.alias harus sama dengan nama node dalam sistem Slurm. Label kai.alibabacloud.com/cluster-name dan kai.alibabacloud.com/cluster-namespace harus sesuai dengan Service cluster Slurm.

    apiVersion: kai.alibabacloud.com/v1alpha1
    kind: GenericNode
    metadata:
      labels:
        kai.alibabacloud.com/cluster-name: slurm-test
        kai.alibabacloud.com/cluster-namespace: default
      name: cn-hongkong.10.1.0.19
    spec:
      alias: slurm-test-worker-cpu-0
      type: Slurm
    

Ringkasan

Dalam lingkungan beban kerja kolokasi, Anda dapat menggunakan Slurm untuk menjadwalkan pekerjaan HPC dan menggunakan Kubernetes untuk mengatur beban kerja berbasis kontainer. Solusi penjadwalan kolokasi ini memungkinkan Anda menggunakan ekosistem dan layanan Kubernetes, termasuk Helm chart, pipeline integrasi berkelanjutan/pengiriman berkelanjutan (CI/CD), dan alat pemantauan. Selain itu, Anda dapat menggunakan platform terpadu untuk menjadwalkan, mengirim, dan mengelola baik pekerjaan HPC maupun beban kerja berbasis kontainer. Dengan cara ini, pekerjaan HPC dan beban kerja berbasis kontainer Kubernetes dapat diterapkan di cluster yang sama untuk memanfaatkan sepenuhnya sumber daya perangkat keras.