Workload online biasanya mencadangkan CPU dan memori berdasarkan perkiraan puncak, tetapi penggunaan aktualnya sering jauh lebih rendah. Hal ini menyisakan sejumlah besar sumber daya yang dialokasikan namun menganggur, yang dapat dibagi oleh Pod BestEffort standar—namun tanpa jaminan penjadwalan atau kontrol keadilan. Overcommitment sumber daya dinamis mengatasi kedua masalah tersebut: komponen ack-koordinator memantau beban node secara real time, menghitung kapasitas yang dapat direklaim, lalu mengeksposnya sebagai sumber daya extended Batch (kubernetes.io/batch-cpu dan kubernetes.io/batch-memory) yang dapat diminta secara eksplisit oleh Pod BestEffort.
Untuk memaksimalkan fitur ini, baca Pod Quality of Service Classes dan Assign Memory Resources to Containers and Pods dalam dokumentasi Kubernetes.
Cara kerja
ack-koordinator melacak beban per-node secara berkelanjutan dan memublikasikan kapasitas yang dapat direklaim sebagai sumber daya extended pada setiap node. Pod BestEffort mendeklarasikan permintaan dan batas eksplisit terhadap sumber daya Batch ini, sehingga penjadwal ACK dapat membuat keputusan penempatan yang terinformasi dan menerapkan batas sumber daya melalui hierarki cgroup node.
Diagram berikut menggambarkan mengapa overcommitment sumber daya standar tidak memadai:
Tanpa overcommitment dinamis, penjadwal tidak memiliki visibilitas terhadap beban node nyata, sehingga mungkin menempatkan Pod BestEffort pada node yang sudah kelebihan beban. Selain itu, tidak ada cara untuk menentukan jumlah sumber daya yang berbeda per pod, sehingga sumber daya tidak dapat didistribusikan secara adil di antara Pod BestEffort.
ack-koordinator memperkenalkan tiga istilah untuk menggambarkan kapasitas sumber daya yang direklaim:
| Term | Description |
|---|---|
| Reclaimed | Sumber daya yang dapat di-overcommit secara dinamis saat ini |
| Buffered | Sumber daya yang dicadangkan dan tidak direklaim |
| Usage | Konsumsi sumber daya aktual |
Kelas QoS dan sumber daya Batch
Kubernetes menetapkan kelas quality of service (QoS) untuk setiap pod berdasarkan konfigurasi sumber dayanya. Sumber daya Batch dirancang khusus untuk kelas BestEffort:
| QoS class | Resource configuration | Use case |
|---|---|---|
| Guaranteed | requests == limits untuk semua kontainer |
Layanan produksi sensitif latensi |
| Burstable | requests < limits untuk minimal satu kontainer |
Workload online umum |
| BestEffort | Tidak ada requests atau limits — gunakan sumber daya Batch sebagai gantinya |
Pekerjaan Batch dan tugas offline |
Untuk menggunakan overcommitment sumber daya dinamis, atur koordinator.sh/qosClass: "BE" pada pod dan ganti bidang sumber daya standar dengan kubernetes.io/batch-cpu dan kubernetes.io/batch-memory.
Tagihan
Tidak dikenakan biaya untuk menginstal atau menggunakan komponen ack-koordinator. Perhatikan hal berikut:
-
ack-koordinator adalah komponen non-managed. Setelah instalasi, komponen ini menggunakan sumber daya node pekerja. Tentukan permintaan sumber daya per modul saat instalasi.
-
ack-koordinator dapat mengekspos metrik Prometheus untuk fitur seperti profiling sumber daya dan penjadwalan detail halus. Jika Anda mengaktifkan metrik Prometheus untuk ack-koordinator dan menggunakan Managed Service for Prometheus, metrik tersebut dihitung sebagai custom metrics dan ditagih sesuai ketentuan. Sebelum mengaktifkan, tinjau topik Billing untuk Managed Service for Prometheus dan baca Query the amount of observable data and bills untuk memahami cara perhitungan biaya.
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
Kluster ACK Pro. Untuk informasi selengkapnya, lihat Buat kluster ACK Pro.
-
Menginstal komponen ack-koordinator versi 0.8.0 atau lebih baru. Untuk informasi selengkapnya, lihat ack-koordinator.
Aktifkan overcommitment sumber daya dinamis
Aktifkan dan konfigurasikan fitur ini dengan membuat atau memperbarui ConfigMap di namespace kube-system.
Langkah 1: Buat ConfigMap
Buat file bernama configmap.yaml dengan konten berikut:
apiVersion: v1
kind: ConfigMap
metadata:
name: ack-slo-config
namespace: kube-system
data:
# colocation-config mengontrol perhitungan dan pembaruan sumber daya Batch dinamis.
# Fitur terkait: Dynamic resource overcommitment, load-aware scheduling.
colocation-config: |
{
"enable": true, # Wajib: mengaktifkan pembaruan sumber daya Batch. Mengatur ke false akan mereset sumber daya reclaimed ke 0.
"metricAggregateDurationSeconds": 60, # Frekuensi agregasi metrik node (dalam detik). Gunakan nilai default.
"cpuReclaimThresholdPercent": 60, # Ambang batas reklaim untuk batch-cpu, dalam % dari CPU yang dapat dialokasikan. Default: 65.
"memoryReclaimThresholdPercent": 70, # Ambang batas reklaim untuk batch-memory, dalam % dari memori yang dapat dialokasikan. Default: 65.
"memoryCalculatePolicy": "usage" # Cara kapasitas batch-memory dihitung: "usage" (default) atau "request".
}
NilaicpuReclaimThresholdPercentdanmemoryReclaimThresholdPercentdalam contoh ini (60 dan 70) hanya sebagai sampel. Nilai default aktualnya adalah 65 untuk kedua parameter tersebut.
Tabel berikut menjelaskan setiap parameter secara detail:
| Parameter | Type | Default | Description |
|---|---|---|---|
enable |
Boolean | false |
Mengaktifkan pembaruan sumber daya Batch dinamis. Mengatur nilai ini ke false akan mereset sumber daya yang dapat direklaim ke 0. |
metricAggregateDurationSeconds |
Int | 60 |
Frekuensi agregasi metrik node (dalam detik) untuk menghitung ulang kapasitas sumber daya Batch. Gunakan nilai default. |
cpuReclaimThresholdPercent |
Int | 65 |
Ambang batas reklaim untuk sumber daya batch-cpu, dalam persentase dari CPU yang dapat dialokasikan. Lihat Calculate Batch resource capacity. |
memoryReclaimThresholdPercent |
Int | 65 |
Ambang batas reklaim untuk sumber daya batch-memory, dalam persentase dari memori yang dapat dialokasikan. Lihat Calculate Batch resource capacity. |
memoryCalculatePolicy |
String | "usage" |
Cara kapasitas batch-memory dihitung. "usage": mencakup sumber daya yang tidak dialokasikan dan sumber daya yang dialokasikan namun menganggur (berdasarkan penggunaan aktual Pod Guaranteed dan Burstable). "request": hanya mencakup sumber daya yang tidak dialokasikan (berdasarkan permintaan memori Pod Guaranteed dan Burstable). |
Hitung kapasitas sumber daya Batch
ack-koordinator menerapkan rumus berikut untuk menghitung jumlah sumber daya Batch yang tersedia di setiap node.
Perhitungan berbasis penggunaan (default, memoryCalculatePolicy: "usage"):
nodeBatchAllocatable = nodeAllocatable × thresholdPercent − podUsage(non-BE) − systemUsage
Perhitungan berbasis permintaan (memoryCalculatePolicy: "request", hanya berlaku untuk batch-memory):
nodeBatchAllocatable = nodeAllocatable × thresholdPercent − podRequest(non-BE) − systemUsage
Di mana:
| Variable | Description |
|---|---|
nodeAllocatable |
Total CPU atau memori yang dapat dialokasikan di node |
thresholdPercent |
Persentase ambang batas reklaim yang dikonfigurasi |
podUsage(non-BE) |
Penggunaan sumber daya aktual dari Pod Guaranteed dan Burstable |
podRequest(non-BE) |
Jumlah permintaan sumber daya untuk Pod Guaranteed dan Burstable |
systemUsage |
Konsumsi sumber daya tingkat sistem di node |
Langkah 2: Terapkan ConfigMap
Periksa apakah ConfigMap ack-slo-config sudah ada di namespace kube-system:
-
Jika sudah ada, gunakan
kubectl patchuntuk menggabungkan perubahan Anda tanpa menimpa pengaturan lain:kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)" -
Jika tidak ada, buatlah:
kubectl apply -f configmap.yaml
Mengajukan permintaan sumber daya Batch
Setelah mengaktifkan overcommitment sumber daya dinamis, konfigurasikan pod untuk meminta sumber daya Batch.
-
Pod tidak dapat meminta sumber daya Batch dan sumber daya standar secara bersamaan.
-
Untuk Deployment atau workload lain, atur label pada
template.metadata, bukan pada objek workload itu sendiri. -
ack-koordinator menyesuaikan kapasitas Batch yang tersedia secara dinamis berdasarkan beban node real-time. Dalam kasus langka, kubelet mungkin tertinggal dalam melaporkan status node, menyebabkan pod gagal dijadwalkan karena sumber daya tidak mencukupi. Jika hal ini terjadi, hapus dan buat ulang pod yang terpengaruh.
-
Jumlah sumber daya Batch harus berupa bilangan bulat. batch-cpu menggunakan satuan millicore (1 core = 1.000 millicore).
Langkah 1: Periksa sumber daya Batch yang tersedia di node
# Ganti $nodeName dengan nama node sebenarnya.
kubectl get node $nodeName -o yaml
Cari bagian status.allocatable dalam output:
status:
allocatable:
# Satuan: millicore. Contoh berikut menunjukkan 50 core tersedia.
kubernetes.io/batch-cpu: 50000
# Satuan: byte. Contoh berikut menunjukkan 50 GB tersedia.
kubernetes.io/batch-memory: 53687091200
Langkah 2: Konfigurasikan pod untuk menggunakan sumber daya Batch
Tambahkan label koordinator.sh/qosClass: "BE" ke metadata pod dan atur kubernetes.io/batch-cpu dan kubernetes.io/batch-memory di bidang resources kontainer:
metadata:
labels:
# Wajib: mengatur kelas QoS pod menjadi BestEffort.
koordinator.sh/qosClass: "BE"
spec:
containers:
- resources:
requests:
# Satuan: millicore. "1k" = 1000 millicore = 1 core.
kubernetes.io/batch-cpu: "1k"
# Satuan: byte.
kubernetes.io/batch-memory: "1Gi"
limits:
kubernetes.io/batch-cpu: "1k"
kubernetes.io/batch-memory: "1Gi"
Contoh
Contoh ini men-deploy pod uji BestEffort yang menggunakan sumber daya Batch dan memverifikasi bahwa batas sumber daya diterapkan di cgroup node.
-
Periksa sumber daya Batch yang tersedia di node:
kubectl get node $nodeName -o yamlOutput yang diharapkan:
status: allocatable: kubernetes.io/batch-cpu: 50000 kubernetes.io/batch-memory: 53687091200 -
Buat file bernama
be-pod-demo.yaml:apiVersion: v1 kind: Pod metadata: labels: koordinator.sh/qosClass: "BE" name: be-demo spec: containers: - command: - "sleep" - "100h" image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 imagePullPolicy: Always name: be-demo resources: limits: kubernetes.io/batch-cpu: "50k" kubernetes.io/batch-memory: "10Gi" requests: kubernetes.io/batch-cpu: "50k" kubernetes.io/batch-memory: "10Gi" schedulerName: default-scheduler -
Deploy pod:
kubectl apply -f be-pod-demo.yaml -
Verifikasi bahwa batas sumber daya tercermin di cgroup node. Periksa batas CPU:
cat /sys/fs/cgroup/cpu,cpuacct/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8_042d_471c_b6ef_b7e0686a****.slice/cri-containerd-11111c202adfefdd63d7d002ccde8907d08291e706671438c4ccedfecba5****.scope/cpu.cfs_quota_usOutput yang diharapkan (50 core):
5000000Periksa batas memori:
cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8_042d_471c_b6ef_b7e0686a****.slice/cri-containerd-11111c202adfefdd63d7d002ccde8907d08291e706671438c4ccedfecba5****.scope/memory.limit_in_bytesOutput yang diharapkan (10 GB):
10737418240
Memantau penggunaan sumber daya Batch
Kluster ACK terintegrasi dengan Managed Service for Prometheus. Untuk melihat penggunaan sumber daya Batch:
-
Masuk ke ACK console. Di panel navigasi kiri, klik ACK consoleClusters.
-
Pada halaman Clusters, klik nama kluster target. Di panel kiri, pilih Operations > Prometheus Monitoring.
-
Klik tab Others, lalu klik tab k8s-reclaimed-resource. Dasbor ini menampilkan pendapatan campuran kluster serta kapasitas sumber daya di tingkat kluster, node, dan pod. Untuk informasi selengkapnya, lihat Enable the colocation monitoring feature.
Jika Anda telah membuat dasbor Prometheus kustom, gunakan metrik berikut untuk mengkueri data sumber daya Batch:
# batch-cpu yang dapat dialokasikan di node
koordlet_node_resource_allocatable{resource="kubernetes.io/batch-cpu",node="$node"}
# batch-cpu yang sudah dialokasikan di node
koordlet_container_resource_requests{resource="kubernetes.io/batch-cpu",node="$node"}
# batch-memory yang dapat dialokasikan di node
kube_node_status_allocatable{resource="kubernetes.io/batch-memory",node="$node"}
# batch-memory yang sudah dialokasikan di node
koordlet_container_resource_requests{resource="kubernetes.io/batch-memory",node="$node"}
FAQ
Setelah upgrade dari ack-slo-manager ke ack-koordinator, apakah konfigurasi overcommitment lama masih berfungsi?
Ya. ack-koordinator kompatibel mundur dengan protokol ack-slo-manager sebelumnya. Penjadwal kluster ACK Pro dapat menghitung sumber daya yang diminta dan tersedia menggunakan format protokol lama dan baru secara simultan, sehingga Anda dapat melakukan upgrade tanpa mengonfigurasi ulang workload yang ada.
Protokol sebelumnya menggunakan:
-
Anotasi pod
alibabacloud.com/qosClass -
Bidang
alibabacloud.com/reclaimeduntuk permintaan dan batas sumber daya
ack-koordinator mendukung protokol ini hingga versi bertanggal tidak lebih baru dari 30 Juli 2023. Migrasikan workload yang ada ke protokol koordinator.sh kapan pun memungkinkan.
Tabel berikut menunjukkan kompatibilitas lintas versi komponen:
| Versi Scheduler | ack-koordinator | protokol alibabacloud.com | protokol koordinator.sh |
|---|---|---|---|
| ≥1.18 dan <1.22.15-ack-2.0 | ≥0.3.0 | Didukung | Tidak didukung |
| ≥1.22.15-ack-2.0 | ≥0.8.0 | Didukung | Didukung |
Mengapa penggunaan memori melonjak tepat setelah pod dimulai?
Gejala: Penggunaan memori melonjak segera setelah kontainer dimulai, melebihi batas kubernetes.io/batch-memory yang diharapkan.
Penyebab: Saat kontainer dibuat, ack-koordinator mengatur batas memori cgroup berdasarkan kubernetes.io/batch-memory. Beberapa aplikasi membaca batas cgroup saat startup untuk menentukan berapa banyak memori yang akan dialokasikan secara internal. Jika aplikasi membaca cgroup sebelum ack-koordinator menulis batas tersebut, aplikasi mungkin mengalokasikan lebih banyak memori daripada yang dimaksudkan. Sistem operasi tidak segera mereklaim memori tersebut, sehingga penggunaan tetap tinggi hingga akhirnya turun di bawah batas yang dikonfigurasi.
Periksa: Jalankan perintah berikut di dalam kontainer untuk memastikan batas memori telah diatur dengan benar:
# Satuan: byte
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# Contoh output yang diharapkan
1048576000
Perbaikan: Konfigurasikan batas memori aplikasi dalam skrip startup sebelum proses utama dimulai. Hal ini memastikan batas sudah diterapkan sebelum aplikasi membaca cgroup.
Mengapa pod BestEffort tetap dalam status Pending?
Gejala: Pod yang dikonfigurasi dengan sumber daya Batch tetap dalam status Pending dan tidak dapat dijadwalkan.
Periksa: Jalankan kubectl describe pod <pod-name> dan cari event kegagalan penjadwalan.
Penyebab umum dan solusi:
| Penyebab | Perbaikan |
|---|---|
| Sumber daya Batch tidak mencukupi di semua node | Jalankan kubectl get node <node> -o yaml dan periksa status.allocatable untuk batch-cpu dan batch-memory. Kurangi permintaan pod atau tunggu hingga sumber daya direklaim. |
| kubelet belum menyinkronkan status node | Hapus dan buat ulang pod. ack-koordinator menyesuaikan kapasitas Batch secara dinamis, dan kubelet mungkin tertinggal dalam melaporkan sumber daya allocatable yang diperbarui. |
| Pod meminta sumber daya Batch dan sumber daya standar sekaligus | Pod tidak dapat meminta sumber daya Batch dan sumber daya standar secara bersamaan. Hapus salah satu set bidang sumber daya tersebut. |
Langkah berikutnya
ack-koordinator menyediakan kontrol tambahan untuk melindungi workload online dari gangguan yang disebabkan oleh Pod BestEffort. Lihat topik berikut: