Mekanisme alokasi sumber daya statis dari ResourceQuota Kubernetes asli dapat menyebabkan rendahnya pemanfaatan sumber daya dalam kluster. Untuk mengatasi masalah ini, Container Service for Kubernetes (ACK) menyediakan fitur penjadwalan kapasitas berdasarkan mekanisme ekstensi kerangka penjadwalan. Fitur ini menggunakan grup kuota elastis untuk mendukung berbagi sumber daya sambil memastikan kuota sumber daya bagi pengguna, yang secara efektif meningkatkan pemanfaatan sumber daya kluster.
Prasyarat
Sebuah kluster ACK managed Pro yang menjalankan Kubernetes 1.20 atau lebih baru telah dibuat. Untuk meningkatkan kluster, lihat Buat Kluster ACK Managed.
Fitur utama
Dalam lingkungan kluster multi-pengguna, administrator mengalokasikan sumber daya tetap untuk memastikan cukup sumber daya bagi pengguna yang berbeda. Mode tradisional menggunakan ResourceQuota Kubernetes asli untuk alokasi sumber daya statis. Namun, karena perbedaan waktu dan pola penggunaan sumber daya di antara pengguna, beberapa pengguna mungkin mengalami kendala sumber daya sementara yang lain memiliki kuota idle. Hal ini mengakibatkan rendahnya pemanfaatan sumber daya secara keseluruhan.
Untuk menyelesaikan masalah ini, ACK mendukung fitur penjadwalan kapasitas di sisi penjadwalan berdasarkan mekanisme ekstensi kerangka penjadwalan. Fitur ini meningkatkan pemanfaatan sumber daya secara keseluruhan melalui berbagi sumber daya dan memastikan alokasi sumber daya bagi pengguna. Berikut adalah fitur spesifik dari penjadwalan kapasitas:
Dukungan untuk mendefinisikan kuota sumber daya pada tingkat yang berbeda: Konfigurasikan beberapa tingkat kuota elastis sesuai kebutuhan bisnis, seperti bagan organisasi perusahaan. Node daun dari grup kuota elastis dapat sesuai dengan beberapa namespace, tetapi setiap namespace hanya dapat termasuk dalam satu node daun.

Dukungan untuk peminjaman dan pengembalian sumber daya antar kuota elastis yang berbeda.
Min: Menentukan sumber daya terjamin yang dapat digunakan. Jika sumber daya kluster menjadi tidak mencukupi, total jumlah sumber daya minimum untuk semua pengguna harus lebih rendah dari total jumlah sumber daya kluster.
Max: Menentukan jumlah maksimum sumber daya yang dapat digunakan.

Workload dapat meminjam kuota sumber daya idle dari pengguna lain, tetapi total jumlah sumber daya yang dapat digunakan setelah meminjam masih tidak melebihi nilai Max. Kuota sumber daya Min yang tidak digunakan dapat dipinjam, tetapi dapat dikembalikan ketika pengguna aslinya membutuhkan penggunaannya.
Dukungan untuk mengonfigurasi berbagai sumber daya: Selain sumber daya CPU dan memori, juga mendukung konfigurasi sumber daya tambahan seperti GPU dan sumber daya lain yang didukung oleh Kubernetes.
Dukungan untuk melampirkan kuota ke node: Gunakan ResourceFlavor untuk memilih node dan mengaitkan ResourceFlavor dengan kuota dalam ElasticQuotaTree. Setelah dikaitkan, pod dalam kuota elastis hanya dapat dijadwalkan ke node yang dipilih oleh ResourceFlavor.
Contoh konfigurasi penjadwalan kapasitas
Dalam contoh kluster ini, nodenya adalah mesin ecs.sn2.13xlarge dengan 56 vCPU dan 224 GiB memori.
Buat namespace berikut.
kubectl create ns namespace1 kubectl create ns namespace2 kubectl create ns namespace3 kubectl create ns namespace4Buat grup kuota elastis yang sesuai berdasarkan file YAML berikut:
Sesuai dengan file YAML di atas, konfigurasikan namespace yang sesuai di bidang
namespacesdan konfigurasikan kuota elastis anak yang sesuai di bidangchildren. Persyaratan berikut harus dipenuhi:Dalam kuota elastis yang sama, Min ≤ Max.
Jumlah total nilai Min dari kuota elastis anak harus kurang dari atau sama dengan nilai Min dari kuota induk.
Min dari node root sama dengan Max dan kurang dari atau sama dengan total sumber daya kluster.
Setiap namespace termasuk dalam satu daun. Sebuah daun dapat berisi beberapa namespace.
Periksa apakah grup kuota elastis berhasil dibuat.
kubectl get ElasticQuotaTree -n kube-systemKeluaran yang Diharapkan:
NAME AGE elasticquotatree 68s
Meminjam sumber daya idle
Deploy layanan di
namespace1sesuai dengan file YAML berikut. Jumlah replika untuk pod adalah 5, dan setiap pod meminta 5 vCPU.Periksa status deployment pod di kluster.
kubectl get pods -n namespace1Keluaran yang Diharapkan:
NAME READY STATUS RESTARTS AGE nginx1-744b889544-52dbg 1/1 Running 0 70s nginx1-744b889544-6l4s9 1/1 Running 0 70s nginx1-744b889544-cgzlr 1/1 Running 0 70s nginx1-744b889544-w2gr7 1/1 Running 0 70s nginx1-744b889544-zr5xz 0/1 Pending 0 70sKarena ada sumber daya idle dalam kluster saat ini (
root.max.cpu=40), ketika sumber daya CPU yang diminta oleh pod dinamespace1melebihi 10 (min.cpu=10), yang dikonfigurasikan olehroot.a.1, pod tersebut dapat terus meminjam sumber daya idle lainnya. Sumber daya CPU maksimum yang dapat mereka minta adalah 20 (max.cpu=20), yang dikonfigurasikan olehroot.a.1.Ketika jumlah sumber daya CPU yang diminta oleh pod melebihi 20 (
max.cpu=20), pod tambahan yang meminta sumber daya akan berada dalam status Pending. Oleh karena itu, dari 5 pod yang diminta, 4 berada dalam status Running dan 1 dalam status Pending.
Deploy layanan di
namespace2sesuai dengan file YAML berikut. Jumlah replika untuk pod adalah 5, dan setiap pod meminta 5 vCPU.Periksa status deployment pod di kluster.
kubectl get pods -n namespace1Keluaran yang Diharapkan:
NAME READY STATUS RESTARTS AGE nginx1-744b889544-52dbg 1/1 Running 0 111s nginx1-744b889544-6l4s9 1/1 Running 0 111s nginx1-744b889544-cgzlr 1/1 Running 0 111s nginx1-744b889544-w2gr7 1/1 Running 0 111s nginx1-744b889544-zr5xz 0/1 Pending 0 111skubectl get pods -n namespace2Keluaran yang Diharapkan:
NAME READY STATUS RESTARTS AGE nginx2-556f95449f-4gl8s 1/1 Running 0 111s nginx2-556f95449f-crwk4 1/1 Running 0 111s nginx2-556f95449f-gg6q2 0/1 Pending 0 111s nginx2-556f95449f-pnz5k 1/1 Running 0 111s nginx2-556f95449f-vjpmq 1/1 Running 0 111sMenyerupai
nginx1. Karena ada sumber daya idle dalam kluster saat ini (root.max.cpu=40), ketika sumber daya CPU yang diminta oleh pod dinamespace2melebihi 10 (min.cpu=10), yang dikonfigurasikan olehroot.a.2, pod tersebut dapat terus meminjam sumber daya idle lainnya. Sumber daya CPU maksimum yang dapat mereka minta adalah 20 (max.cpu=20), yang dikonfigurasikan olehroot.a.2.Ketika jumlah sumber daya CPU yang diminta oleh pod melebihi 20 (
max.cpu=20), pod tambahan yang meminta sumber daya akan berada dalam status Pending. Oleh karena itu, dari 5 pod yang diminta, 4 berada dalam status Running dan 1 dalam status Pending.Pada titik ini, sumber daya yang ditempati oleh pod di
namespace1dannamespace2dalam kluster telah mencapai 40 (root.max.cpu=40), yang dikonfigurasikan olehroot.
Mengembalikan sumber daya yang dipinjam
Deploy layanan di
namespace3sesuai dengan file YAML berikut. Jumlah replika untuk pod adalah 5, dan setiap pod meminta 5 vCPU.Jalankan perintah berikut untuk memeriksa status deployment pod di kluster:
kubectl get pods -n namespace1Keluaran yang Diharapkan:
NAME READY STATUS RESTARTS AGE nginx1-744b889544-52dbg 1/1 Running 0 6m17s nginx1-744b889544-cgzlr 1/1 Running 0 6m17s nginx1-744b889544-nknns 0/1 Pending 0 3m45s nginx1-744b889544-w2gr7 1/1 Running 0 6m17s nginx1-744b889544-zr5xz 0/1 Pending 0 6m17skubectl get pods -n namespace2Keluaran yang Diharapkan:
NAME READY STATUS RESTARTS AGE nginx2-556f95449f-crwk4 1/1 Running 0 4m22s nginx2-556f95449f-ft42z 1/1 Running 0 4m22s nginx2-556f95449f-gg6q2 0/1 Pending 0 4m22s nginx2-556f95449f-hfr2g 1/1 Running 0 3m29s nginx2-556f95449f-pvgrl 0/1 Pending 0 3m29skubectl get pods -n namespace3Keluaran yang Diharapkan:
NAME READY STATUS RESTARTS AGE nginx3-578877666-msd7f 1/1 Running 0 4m nginx3-578877666-nfdwv 0/1 Pending 0 4m10s nginx3-578877666-psszr 0/1 Pending 0 4m11s nginx3-578877666-xfsss 1/1 Running 0 4m22s nginx3-578877666-xpl2p 0/1 Pending 0 4m10sParameter
mindari kuota elastisroot.b.1untuknginx3disetel ke10. Untuk memastikan bahwa sumber dayaminyang dikonfigurasikan tersedia, penjadwal akan mengembalikan sumber daya pod yang sebelumnya dipinjam dariroot.bdi bawahroot.a. Ini memungkinkannginx3mendapatkan setidaknya 10 (min.cpu=10) core CPU untuk memastikan operasi.Penjadwal akan mempertimbangkan secara komprehensif faktor-faktor seperti prioritas, ketersediaan, dan waktu pembuatan pekerjaan di bawah
root.a, dan memilih pod yang sesuai untuk mengembalikan sumber daya yang sebelumnya ditempati (10 vCPU). Oleh karena itu, setelahnginx3mendapatkan 10 (min.cpu=10) core CPU, 2 pod berada dalam status Running, dan 3 lainnya tetap dalam status Pending.Deploy layanan
nginx4dinamespace4sesuai dengan file YAML berikut. Jumlah replika untuk pod adalah 5, dan setiap pod meminta 5 core CPU.Jalankan perintah berikut untuk memeriksa status deployment pod di kluster:
kubectl get pods -n namespace1Keluaran yang Diharapkan:
NAME READY STATUS RESTARTS AGE nginx1-744b889544-cgzlr 1/1 Running 0 8m20s nginx1-744b889544-cwx8l 0/1 Pending 0 55s nginx1-744b889544-gjkx2 0/1 Pending 0 55s nginx1-744b889544-nknns 0/1 Pending 0 5m48s nginx1-744b889544-zr5xz 1/1 Running 0 8m20skubectl get pods -n namespace2Keluaran yang Diharapkan:
NAME READY STATUS RESTARTS AGE nginx2-556f95449f-cglpv 0/1 Pending 0 3m45s nginx2-556f95449f-crwk4 1/1 Running 0 9m31s nginx2-556f95449f-gg6q2 1/1 Running 0 9m31s nginx2-556f95449f-pvgrl 0/1 Pending 0 8m38s nginx2-556f95449f-zv8wn 0/1 Pending 0 3m45skubectl get pods -n namespace3Keluaran yang Diharapkan:
NAME READY STATUS RESTARTS AGE nginx3-578877666-msd7f 1/1 Running 0 8m46s nginx3-578877666-nfdwv 0/1 Pending 0 8m56s nginx3-578877666-psszr 0/1 Pending 0 8m57s nginx3-578877666-xfsss 1/1 Running 0 9m8s nginx3-578877666-xpl2p 0/1 Pending 0 8m56skubectl get pods -n namespace4Keluaran yang Diharapkan:
nginx4-754b767f45-g9954 1/1 Running 0 4m32s nginx4-754b767f45-j4v7v 0/1 Pending 0 4m32s nginx4-754b767f45-jk2t7 0/1 Pending 0 4m32s nginx4-754b767f45-nhzpf 0/1 Pending 0 4m32s nginx4-754b767f45-tv5jj 1/1 Running 0 4m32sParameter
mindari kuota elastisroot.b.2untuknginx4disetel ke10. Untuk memastikan bahwa sumber dayaminyang dikonfigurasikan tersedia, penjadwal akan mengembalikan sumber daya pod yang sebelumnya dipinjam dariroot.bdi bawahroot.a. Ini memungkinkannginx4mendapatkan setidaknya 10 (min.cpu=10) core CPU untuk memastikan operasi.Penjadwal akan mempertimbangkan secara komprehensif faktor-faktor seperti prioritas, ketersediaan, dan waktu pembuatan pekerjaan di bawah
root.a, dan memilih pod yang sesuai untuk mengembalikan sumber daya yang sebelumnya ditempati (10 vCPU). Oleh karena itu, setelahnginx4mendapatkan 10 (min.cpu=10) core CPU, 2 pod berada dalam status Running, dan 3 lainnya tetap dalam status Pending.Pada titik ini, semua kuota elastis dalam kluster menggunakan sumber daya terjamin mereka yang ditetapkan oleh
min.
Contoh konfigurasi ResourceFlavor
Prasyarat
ResourceFlavor diinstal dengan merujuk pada ResourceFlavorCRD (ACK Scheduler tidak menginstalnya secara default).
Hanya bidang nodeLabels yang efektif dalam sumber daya ResourceFlavor.
Versi penjadwal lebih tinggi dari 6.9.0. Untuk informasi lebih lanjut tentang catatan rilis komponen, lihat kube-scheduler. Untuk informasi lebih lanjut tentang entri pembaruan komponen, lihat Komponen.
ResourceFlavor, sebagai Kubernetes CustomResourceDefinition (CRD), membentuk hubungan pengikatan antara kuota elastis dan node dengan mendefinisikan label node (NodeLabels). Ketika dikaitkan dengan kuota elastis tertentu, pod di bawah kuota tersebut tidak hanya dibatasi oleh jumlah total sumber daya kuota tetapi juga hanya dapat dijadwalkan ke node yang sesuai dengan NodeLabels.
Contoh ResourceFlavor
Sebuah contoh ResourceFlavor adalah sebagai berikut:
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
name: "spot"
spec:
nodeLabels:
instance-type: spotContoh mengaitkan kuota elastis
Untuk mengaitkan kuota elastis dengan ResourceFlavor, Anda harus mendeklarasikannya di ElasticQuotaTree menggunakan bidang attributes. Kode berikut menunjukkan sebuah contoh:
apiVersion: scheduling.sigs.k8s.io/v1beta1
kind: ElasticQuotaTree
metadata:
name: elasticquotatree
namespace: kube-system
spec:
root:
children:
- attributes:
resourceflavors: spot
max:
cpu: 99
memory: 40Gi
nvidia.com/gpu: 10
min:
cpu: 99
memory: 40Gi
nvidia.com/gpu: 10
name: child
namespaces:
- default
max:
cpu: 999900
memory: 400000Gi
nvidia.com/gpu: 100000
min:
cpu: 999900
memory: 400000Gi
nvidia.com/gpu: 100000
name: rootSetelah dikirimkan, pod yang termasuk dalam Quota child hanya akan dijadwalkan ke node dengan label instance-type: spot.
Referensi
Untuk informasi lebih lanjut tentang catatan rilis kube-scheduler, lihat kube-scheduler.
kube-scheduler mendukung penjadwalan gang, yang mengharuskan kelompok pod terkait harus berhasil dijadwalkan secara bersamaan. Jika tidak, tidak ada satupun dari mereka yang akan dijadwalkan. kube-scheduler cocok untuk skenario tugas pemrosesan data besar, seperti Spark dan Hadoop. Untuk informasi lebih lanjut, lihat Bekerja dengan Penjadwalan Gang.