All Products
Search
Document Center

Container Service for Kubernetes:Aktifkan overcommitment sumber daya dinamis

Last Updated:Mar 27, 2026

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:

image

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
image

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".
    }
Nilai cpuReclaimThresholdPercent dan memoryReclaimThresholdPercent dalam 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 patch untuk 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.

Penting
  • 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.

  1. Periksa sumber daya Batch yang tersedia di node:

    kubectl get node $nodeName -o yaml

    Output yang diharapkan:

    status:
      allocatable:
        kubernetes.io/batch-cpu: 50000
        kubernetes.io/batch-memory: 53687091200
  2. 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
  3. Deploy pod:

    kubectl apply -f be-pod-demo.yaml
  4. 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_us

    Output yang diharapkan (50 core):

    5000000

    Periksa 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_bytes

    Output yang diharapkan (10 GB):

    10737418240

Memantau penggunaan sumber daya Batch

Kluster ACK terintegrasi dengan Managed Service for Prometheus. Untuk melihat penggunaan sumber daya Batch:

  1. Masuk ke ACK console. Di panel navigasi kiri, klik ACK consoleClusters.

  2. Pada halaman Clusters, klik nama kluster target. Di panel kiri, pilih Operations > Prometheus Monitoring.

  3. 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/reclaimed untuk 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: