Tingkatkan pemanfaatan resource dengan ElasticQuotaTree dan antrian task
Ketika beberapa tim berbagi kluster untuk beban kerja AI, machine learning (ML), dan batch, konflik sumber daya serta pemanfaatan di bawah kapasitas menjadi masalah umum. Gunakan ElasticQuotaTree, ack-kube-queue, dan ack-scheduler secara bersamaan untuk menetapkan kuota sumber daya hierarkis ke unit organisasi, mengantrekan pekerjaan secara otomatis, dan mereklaim sumber daya ketika jaminan minimum tidak dapat dipenuhi.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Menginstal komponen ack-koordinator. Lihat Install ack-koordinator.
Cara kerja
Tiga komponen ini bekerja sama untuk mengelola alokasi sumber daya dan penjadwalan pekerjaan:
ElasticQuotaTree: Menentukan kuota sumber daya hierarkis yang dipetakan ke unit organisasi (misalnya, tim atau departemen). Setiap node daun dalam pohon tersebut berkorespondensi dengan satu atau lebih namespace, dan pekerjaan yang diajukan ke namespace tersebut dibatasi oleh kuota node tersebut.
ack-kube-queue: Memantau kluster untuk pekerjaan baru, membuat QueueUnit untuk setiap pekerjaan, dan mengarahkannya ke antrian yang sesuai berdasarkan namespace pekerjaan tersebut. Pekerjaan menunggu dalam antrian hingga permintaan sumber dayanya sesuai dengan kuota yang tersedia, lalu dilepaskan ke penjadwal.
ack-scheduler: Memilih node untuk menjalankan pekerjaan yang telah dilepaskan dari antrian.
Ketika kebutuhan sumber daya minimum suatu pekerjaan tidak dapat dipenuhi, sistem penjadwalan secara otomatis mereklaim sumber daya dari node kuota yang saat ini menggunakan lebih dari alokasi min-nya.
Siapkan kuota sumber daya dengan ElasticQuotaTree
ElasticQuotaTree menggunakan struktur pohon untuk menetapkan kuota CPU, memori, dan GPU kepada tim. Contoh berikut menunjukkan perusahaan dengan tiga departemen—devops, algorithm (dengan sub-tim text dan video), dan infrastructure (dengan sub-tim test)—masing-masing dipetakan ke namespace khusus.
Aturan kuota
Sebelum membuat ElasticQuotaTree, pastikan konfigurasi Anda memenuhi batasan berikut:
| Aturan | Persyaratan |
|---|---|
| Penempatan namespace | Pasang namespace hanya pada node daun. Node induk tidak boleh memiliki namespace. |
| Node min/max | Pada setiap node, nilai min harus kurang dari atau sama dengan max. |
| Aturan induk minimal | Nilai min node induk harus kurang dari atau sama dengan jumlah nilai min anak-anaknya. |
| Parent max rule | Nilai max node induk harus kurang dari atau sama dengan nilai max salah satu anaknya. |
Semantik parameter:
| Parameter | Default | Perilaku |
|---|---|---|
min | 0 | Lantai sumber daya terjamin. Pekerjaan tetap dapat diajukan meskipun min bernilai 0, tetapi sistem tidak menjamin sumber daya tersebut. Jika kuota min tidak dapat dipenuhi, penjadwal mereklaim sumber daya dari node yang menggunakan lebih dari alokasi min-nya. |
max | NA (tidak terbatas) | Batas atas sumber daya. Pekerjaan tidak dapat menggunakan sumber daya melebihi nilai ini. |
Buat namespace dan ElasticQuotaTree
Terapkan manifes berikut untuk membuat namespace dan mendefinisikan pohon kuota. Komentar dalam YAML menunjukkan bagaimana setiap node dipetakan ke diagram di atas.
---
apiVersion: v1
kind: Namespace
metadata:
name: devops
---
apiVersion: v1
kind: Namespace
metadata:
name: text1
---
apiVersion: v1
kind: Namespace
metadata:
name: text2
---
apiVersion: v1
kind: Namespace
metadata:
name: video
---
apiVersion: v1
kind: Namespace
metadata:
name: test1
---
apiVersion: v1
kind: Namespace
metadata:
name: test2
---
apiVersion: scheduling.sigs.k8s.io/v1beta1
kind: ElasticQuotaTree
metadata:
name: elasticquotatree # Hanya satu ElasticQuotaTree yang didukung.
namespace: kube-system # Harus dibuat di namespace kube-system agar berlaku.
spec:
root:
name: root # Node root: kuota total kluster
min:
cpu: 100
memory: 50Gi
nvidia.com/gpu: 16
max:
cpu: 100
memory: 50Gi
nvidia.com/gpu: 16
children:
- name: devops # Anak dari root
min:
cpu: 20
memory: 10Gi
nvidia.com/gpu: 4
max:
cpu: 40
memory: 20Gi
nvidia.com/gpu: 8
namespaces:
- devops
- name: algorithm # Anak dari root; induk dari text dan video
min:
cpu: 50
memory: 25Gi
nvidia.com/gpu: 10
max:
cpu: 80
memory: 50Gi
nvidia.com/gpu: 14
children:
- name: text # Anak dari algorithm
min:
cpu: 40
memory: 15Gi
nvidia.com/gpu: 8
max:
cpu: 40
memory: 30Gi
nvidia.com/gpu: 10
namespaces:
- text1
- text2
- name: video # Anak dari algorithm
min:
cpu: 12
memory: 12Gi
nvidia.com/gpu: 2
max:
cpu: 14
memory: 14Gi
nvidia.com/gpu: 4
namespaces:
- video
- name: infrastructure # Anak dari root; induk dari test
min:
cpu: 30
memory: 15Gi
nvidia.com/gpu: 2
max:
cpu: 50
memory: 30Gi
nvidia.com/gpu: 4
children:
- name: test # Anak dari infrastructure
min:
cpu: 30
memory: 15Gi
nvidia.com/gpu: 2
max:
cpu: 50
memory: 30Gi
nvidia.com/gpu: 4
namespaces:
- test1
- test2Kelola antrian pekerjaan dengan ack-kube-queue
Setelah Anda menerapkan ElasticQuotaTree, ack-kube-queue secara otomatis membuat antrian untuk setiap node daun dalam kluster. Kuota setiap node daun dipetakan ke satu antrian. Pekerjaan yang diajukan ke suatu namespace akan ditugaskan ke antrian yang sesuai dengan node kuota namespace tersebut.
Asosiasi antrian
Sebuah controller di ack-kube-queue secara otomatis mengelola sumber daya antrian dalam kluster. Controller ini dikelola berdasarkan ElasticQuotaTree dan memetakan asosiasi antara kuota dan namespace yang didefinisikan dalam ElasticQuotaTree ke antrian yang sesuai.
Sebagai contoh, namespace video adalah node daun di bawah node algorithm, yang merupakan anak dari root. ack-kube-queue membuat antrian bernama root-algorithm-video untuk node ini. Ketika Anda mengajukan RayJob di namespace video, ack-kube-queue membuat QueueUnit dan mengarahkannya ke antrian root-algorithm-video.
Jika total sumber daya yang diminta oleh RayJob sesuai dengan kuota yang tersedia di root-algorithm-video, pekerjaan tersebut dikeluarkan dari antrian dan diteruskan ke ack-scheduler untuk penugasan node.
Operasi antrian dan handoff suspend
ack-kube-queue mengontrol eksekusi pekerjaan melalui bidang spec.suspend pada RayJob:
Ajukan RayJob dengan
spec.suspend: true. Hal ini mencegah operator KubeRay membuat pod segera.ack-kube-queue mendeteksi pekerjaan tersebut, membuat QueueUnit, dan menempatkannya di antrian yang sesuai.
Ketika kebijakan pengantrean mengizinkan pekerjaan untuk dilanjutkan, ack-kube-queue mengatur
spec.suspendmenjadifalse.Operator KubeRay menangkap perubahan tersebut dan membuat pod. ack-scheduler kemudian menugaskan pod ke node.
Jika suatu pekerjaan tampak macet di antrian, periksa apakahspec.suspendtelah diatur kefalse. Jika belum, pastikan permintaan sumber daya pekerjaan tersebut sesuai dengan kuota yang tersedia di antrian yang ditugaskan.