全部产品
Search
文档中心

Container Service for Kubernetes:Aktifkan Overkomitmen Sumber Daya Dinamis

更新时间:Jul 06, 2025

Dalam kluster Container Service for Kubernetes (ACK), Anda dapat mengaktifkan fitur overkomitmen sumber daya dinamis untuk menjadwalkan sumber daya yang dialokasikan ke pod tetapi tidak digunakan untuk aplikasi prioritas rendah. Fitur ini memantau beban node secara real-time, menghitung sumber daya CPU dan memori yang dialokasikan namun tidak digunakan dalam kluster, serta menjadwalkan sumber daya tersebut ke pod BestEffort. Hal ini memastikan bahwa sumber daya dijadwalkan secara adil di antara pod BestEffort.

Catatan

Untuk membantu Anda lebih memahami dan menggunakan fitur ini, kami sarankan Anda terlebih dahulu membaca topik-topik berikut dalam dokumentasi resmi Kubernetes: Kelas Kualitas Layanan Pod dan Tetapkan Sumber Daya Memori ke Kontainer dan Pod.

Mengapa saya perlu mengaktifkan overkomitmen sumber daya dinamis

Kubernetes mengelola sumber daya yang digunakan oleh pod pada suatu node berdasarkan kelas kualitas layanan (QoS) dari pod tersebut. Sebagai contoh, Kubernetes mengontrol prioritas out of memory (OOM). Kelas QoS dari sebuah pod bisa berupa Guaranteed, Burstable, atau BestEffort.

Untuk meningkatkan stabilitas aplikasi, administrator aplikasi memesan sumber daya untuk pod saat aplikasi diterapkan. Sumber daya yang dipesan digunakan untuk menangani beban kerja fluktuatif di layanan hulu dan hilir. Dalam banyak kasus, permintaan sumber daya pod jauh lebih tinggi daripada penggunaan sumber daya aktual. Untuk meningkatkan penggunaan sumber daya dalam kluster, administrator kluster mungkin menyediakan pod BestEffort. Pod BestEffort dapat berbagi sumber daya yang dialokasikan ke pod lain tetapi tidak digunakan. Mekanisme ini dikenal sebagai overkomitmen sumber daya. Namun, overkomitmen sumber daya memiliki kekurangan berikut:

  • Sistem tidak dapat menentukan apakah akan memberikan lebih banyak sumber daya untuk pod BestEffort berdasarkan beban aktual node. Akibatnya, meskipun node kelebihan beban, sistem masih menjadwalkan pod BestEffort ke node karena pod BestEffort tidak memiliki batasan sumber daya.

  • Sumber daya tidak dapat dijadwalkan secara adil di antara pod BestEffort. Setiap pod memerlukan jumlah sumber daya yang berbeda. Namun, Anda tidak dapat menentukan jumlah sumber daya yang berbeda dalam file konfigurasi pod.

Untuk menyelesaikan masalah-masalah di atas, ACK menyediakan kemampuan untuk menghitung sumber daya yang dapat dioverkomit secara dinamis. Komponen ack-koordinator memantau beban node dan menyinkronkan statistik sumber daya ke metadata node sebagai sumber daya ekstensi secara real-time. Untuk memungkinkan pod BestEffort menggunakan sumber daya yang direklaim, Anda dapat mengonfigurasi permintaan dan batas sumber daya yang direklaim untuk pod BestEffort. Penjadwal ACK dapat menjadwalkan pod BestEffort ke node berdasarkan permintaan sumber daya dan mengonfigurasi batas sumber daya dalam cgroup node untuk memastikan bahwa pod dapat menggunakan sumber daya dengan benar.

Untuk membedakan sumber daya yang direklaim dari sumber daya reguler, ack-koordinator memperkenalkan konsep Batch untuk mendeskripsikan sumber daya yang direklaim. batch-cpu menunjukkan sumber daya CPU dan batch-memory menunjukkan sumber daya memori. Seperti yang ditunjukkan pada gambar berikut, Reclaimed mengacu pada jumlah sumber daya yang dapat dioverkomit secara dinamis. Buffered mengacu pada sumber daya yang dicadangkan. Usage mengacu pada penggunaan sumber daya aktual.

Tagihan

Tidak ada biaya yang dikenakan saat Anda menginstal atau menggunakan komponen ack-koordinator. Namun, biaya mungkin dikenakan dalam skenario berikut:

  • ack-koordinator adalah komponen non-managed yang menggunakan sumber daya node pekerja setelah diinstal. Anda dapat menentukan jumlah sumber daya yang diminta oleh setiap modul saat menginstal komponen.

  • Secara default, ack-koordinator mengekspos metrik pemantauan fitur seperti profil sumber daya dan penjadwalan granular sebagai metrik Prometheus. Jika Anda mengaktifkan metrik Prometheus untuk ack-koordinator dan menggunakan Managed Service for Prometheus, metrik ini dianggap sebagai metrik kustom dan biaya akan dikenakan untuk metrik ini. Biaya tergantung pada faktor-faktor seperti ukuran kluster Anda dan jumlah aplikasi. Sebelum Anda mengaktifkan metrik Prometheus, kami sarankan Anda membaca topik Tagihan dari Managed Service for Prometheus untuk mempelajari tentang kuota gratis dan aturan tagihan metrik kustom. Untuk informasi lebih lanjut tentang cara memantau dan mengelola penggunaan sumber daya, lihat Kueri jumlah data observabel dan tagihan.

Prasyarat

  • Sebuah kluster ACK Pro telah dibuat. Untuk informasi lebih lanjut, lihat Buat Kluster ACK Pro.

  • Komponen ack-koordinator telah diinstal dan versi komponen tersebut adalah 0.8.0 atau lebih baru. Untuk informasi lebih lanjut, lihat ack-koordinator.

Prosedur

Anda dapat menggunakan ConfigMap untuk mengaktifkan fitur overkomitmen sumber daya dinamis untuk pod. Kemudian, Anda dapat menggunakan label koordinator.sh/qosClass untuk menentukan kelas QoS pod dalam file YAML pod, dan mengonfigurasi permintaan dan batas sumber daya Batch untuk pod. Dengan cara ini, pod dapat menggunakan fitur overkomitmen sumber daya dinamis.

1. Aktifkan overkomitmen sumber daya dinamis

Anda dapat menggunakan ConfigMap untuk mengaktifkan fitur overkomitmen sumber daya dinamis. Anda juga dapat mengonfigurasi parameter terkait dalam ConfigMap untuk mengelola sumber daya yang direklaim secara fleksibel, seperti ambang batas reklamasi sumber daya dan kebijakan untuk menghitung kapasitas sumber daya node.

  1. Buat file bernama configmap.yaml berdasarkan konten ConfigMap berikut:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
    data:
      colocation-config: |
        {
          "enable": true,
          "metricAggregateDurationSeconds": 60,
          "cpuReclaimThresholdPercent": 60,
          "memoryReclaimThresholdPercent": 70,
          "memoryCalculatePolicy": "usage"
        }

    Anda dapat mengelola sumber daya batch-cpu dan batch-memory secara fleksibel dengan memodifikasi parameter dalam ConfigMap.

    Parameter

    Parameter

    Format

    Deskripsi

    enable

    Boolean

    Menentukan apakah akan memperbarui statistik tentang sumber daya Batch secara dinamis. Jika Anda menonaktifkan fitur ini, jumlah sumber daya yang direklaim diatur ulang menjadi 0. Nilai default: false.

    metricAggregateDurationSeconds

    Int

    Frekuensi sistem mengumpulkan data metrik untuk menentukan apakah akan memperbarui atau menyesuaikan sumber daya Batch. Satuan: detik. Kami sarankan Anda menggunakan nilai default, yaitu 60 detik.

    cpuReclaimThresholdPercent

    Int

    Ambang batas reklamasi sumber daya batch-cpu. Nilai default: 65. Satuan: persentase (%). Untuk informasi lebih lanjut tentang cara menghitung sumber daya CPU yang dapat dioverkomit secara dinamis, lihat Hitung jumlah sumber daya Batch.

    memoryReclaimThresholdPercent

    Int

    Ambang batas reklamasi sumber daya batch-memory. Nilai default: 65. Satuan: persentase (%). Untuk informasi lebih lanjut tentang cara menghitung sumber daya memori yang dapat dioverkomit secara dinamis, lihat Hitung jumlah sumber daya Batch.

    memoryCalculatePolicy

    String

    Kebijakan untuk menghitung jumlah sumber daya batch-memory. Nilai valid:

    • "usage": Jumlah sumber daya batch-memory dihitung berdasarkan penggunaan memori aktual pod yang kelas QoS-nya adalah Burstable atau Guaranteed. Sumber daya batch-memory mencakup sumber daya yang tidak dialokasikan dan sumber daya yang dialokasikan tetapi tidak digunakan. Ini adalah nilai default.

    • "request": Jumlah sumber daya batch-memory dihitung berdasarkan permintaan memori pod yang kelas QoS-nya adalah Burstable atau Guaranteed. Sumber daya batch-memory hanya mencakup sumber daya yang tidak dialokasikan.

    Hitung jumlah sumber daya Batch

    Hitung Jumlah Sumber Daya Batch Berdasarkan Penggunaan Sumber Daya Aktual

    Jumlah sumber daya Batch pada node dihitung berdasarkan penggunaan sumber daya aktual, yang mencakup sumber daya yang tidak dialokasikan dan sumber daya yang dialokasikan tetapi tidak digunakan. Anda dapat menggunakan rumus berikut untuk menghitung jumlah sumber daya batch-cpu dan jumlah sumber daya batch-memory:

    nodeBatchAllocatable = nodeAllocatable * thresholdPercent - podUsage(non-BE) - systemUsage

    • nodeAllocatable: jumlah sumber daya CPU atau memori yang dapat dialokasikan pada node.

    • thresholdPercent: ambang batas sumber daya dalam persentase. Anda dapat memodifikasi parameter ini sesuai dengan tabel sebelumnya.

    • podUsage(non-BE): penggunaan sumber daya pod yang kelas QoS-nya adalah Burstable atau Guaranteed.

    • systemUsage: penggunaan sumber daya sistem pada node.

    Hitung jumlah sumber daya Batch berdasarkan permintaan sumber daya pod

    Sumber daya batch-memory dapat dihitung berdasarkan permintaan sumber daya pod. Sumber daya batch-memory hanya mencakup sumber daya yang tidak dialokasikan. Untuk informasi lebih lanjut, lihat parameter memoryCalculatePolicy dalam Parameter.

    Anda dapat menghitung jumlah sumber daya batch-memory berdasarkan rumus berikut:

    nodeBatchAllocatable = nodeAllocatable * thresholdPercent - podRequest(non-BE) - systemUsage

    podRequest(non-BE) mengacu pada jumlah total permintaan sumber daya pod yang kelas QoS-nya adalah Burstable dan Guaranteed.

  2. Periksa apakah ConfigMap bernama ack-slo-config ada di namespace kube-system.

    • Jika ConfigMap ack-slo-config ada, kami sarankan Anda menjalankan perintah kubectl patch untuk memperbarui ConfigMap. Ini menghindari perubahan pengaturan lain dalam ConfigMap.

      kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"
    • Jika ConfigMap ack-slo-config tidak ada, jalankan perintah berikut untuk membuat ConfigMap:

      kubectl apply -f configmap.yaml

2. Ajukan sumber daya Batch untuk pod

Setelah konfigurasi selesai, Anda dapat menentukan kelas QoS pod dengan menggunakan label koordinator.sh/qosClass dalam bidang metadata file YAML pod berdasarkan total sumber daya Batch node, dan tentukan permintaan sumber daya Batch dan batas sumber daya Batch.

  1. Jalankan perintah berikut untuk menanyakan jumlah total sumber daya Batch yang tersedia pada node:

    # Ganti $nodeName dengan nama node yang ingin Anda tanyakan. 
    kubectl get node $nodeName -o yaml

    Output yang diharapkan:

    # Informasi pod. 
    status:
      allocatable:
        # Satuan: millicore (1 core = 1000 millicores). Dalam contoh berikut, 50 core dapat dialokasikan. 
        kubernetes.io/batch-cpu: 50000
        # Satuan: byte. Dalam contoh berikut, 50 GB memori dapat dialokasikan. 
        kubernetes.io/batch-memory: 53687091200
  2. Buat pod dan ajukan sumber daya Batch.

    Penting
    • Jika Anda menyediakan pod menggunakan Deployment atau jenis workload lainnya, konfigurasikan bidang template.metadata. Pod tidak dapat mengajukan sumber daya Batch dan sumber daya reguler secara bersamaan.

    • ack-koordinator menyesuaikan sumber daya Batch yang dapat dialokasikan ke pod berdasarkan beban aktual node. Dalam kasus langka, kubelet mungkin memiliki penundaan tertentu dalam menyinkronkan informasi status node. Akibatnya, pod gagal dijadwalkan karena sumber daya tidak mencukupi. Dalam hal ini, hapus dan buat ulang pod.

    • Anda harus menetapkan jumlah sumber daya ekstensi sebagai bilangan bulat dalam kluster Kubernetes. Satuan sumber daya batch-cpu adalah millicore.

    metadata:
      labels:
        # Wajib. Tetapkan kelas QoS pod ke BestEffort. 
        koordinator.sh/qosClass: "BE"
    spec:
      containers:
      - resources:
          requests:
            # Satuan: millicore (1 core = 1000 millicores). Dalam contoh berikut, permintaan CPU diatur ke satu core. 
            kubernetes.io/batch-cpu: "1k"
            # Satuan: byte. Dalam contoh berikut, permintaan memori diatur ke 1 GB. 
            kubernetes.io/batch-memory: "1Gi"
          limits:
            kubernetes.io/batch-cpu: "1k"
            kubernetes.io/batch-memory: "1Gi"

Contoh

Contoh ini menunjukkan cara menerapkan pod BestEffort yang mengajukan sumber daya Batch setelah fitur overkomitmen sumber daya dinamis diaktifkan. Setelah penyebaran selesai, verifikasi hasilnya dengan memeriksa apakah batas sumber daya pod BestEffort berlaku dalam cgroup node.

  1. Jalankan perintah berikut untuk menanyakan jumlah total sumber daya Batch yang tersedia pada node:

    kubectl get node $nodeName -o yaml

    Output yang diharapkan:

    # Informasi pod. 
    status:
      allocatable:
        # Satuan: millicore (1 core = 1000 millicores). Dalam contoh berikut, 50 core dapat dialokasikan. 
        kubernetes.io/batch-cpu: 50000
        # Satuan: byte. Dalam contoh berikut, 50 GB memori dapat dialokasikan. 
        kubernetes.io/batch-memory: 53687091200
  2. Buat file bernama be-pod-demo.yaml dan salin konten berikut ke file tersebut:

    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. Jalankan perintah berikut untuk menerapkan be-pod-demo sebagai aplikasi uji:

    kubectl apply -f be-pod-demo.yaml
  4. Periksa apakah batas sumber daya pod BestEffort berlaku dalam cgroup node.

    1. Jalankan perintah berikut untuk menanyakan 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:

      # Batas CPU dalam cgroup diatur ke 50 core. 
      5000000
    2. Jalankan perintah berikut untuk menanyakan 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:

      # Batas memori dalam cgroup diatur ke 10 GB. 
      10737418240

Apa yang Harus Dilakukan Selanjutnya

Lihat Penggunaan Sumber Daya Batch dalam Managed Service for Prometheus

Kluster ACK terintegrasi dengan Managed Service for Prometheus, yang menyediakan dasbor Prometheus. Anda dapat melihat penggunaan sumber daya Batch di konsol ACK.

  1. Masuk ke konsol ACK. Di panel navigasi di sebelah kiri, klik Clusters.

  2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel di sebelah kiri, pilih Operations > Prometheus Monitoring.

  3. Klik tab Others, lalu klik tab k8s-reclaimed-resource.

    Di tab k8s-reclaimed-resource, Anda dapat melihat detail seperti pendapatan campuran kluster, dan kapasitas sumber daya di tingkat kluster, node, dan pod. Untuk informasi lebih lanjut, lihat Aktifkan Fitur Pemantauan Kolokasi.

    Jika Anda membuat dasbor Prometheus, Anda dapat melihat data sumber daya kolokasi berdasarkan metrik berikut:

    # Jumlah sumber daya batch-cpu yang dapat dialokasikan pada node. 
    koordlet_node_resource_allocatable{resource="kubernetes.io/batch-cpu",node="$node"}
    # Jumlah sumber daya batch-cpu yang dialokasikan pada node. 
    koordlet_container_resource_requests{resource="kubernetes.io/batch-cpu",node="$node"}
    # Jumlah sumber daya batch-memory yang dapat dialokasikan pada node. 
    kube_node_status_allocatable{resource="kubernetes.io/batch-memory",node="$node"}
    # Jumlah sumber daya batch-memory yang dialokasikan pada node. 
    koordlet_container_resource_requests{resource="kubernetes.io/batch-memory",node="$node"}

FAQ

Apakah fitur overkomitmen sumber daya yang diaktifkan berdasarkan versi protokol ack-slo-manager sebelumnya didukung setelah saya meningkatkan dari ack-slo-manager ke ack-koordinator?

Versi sebelumnya dari protokol ack-slo-manager mencakup komponen-komponen berikut:

  • Anotasi pod alibabacloud.com/qosClass.

  • Bidang alibabacloud.com/reclaimed yang digunakan untuk menentukan permintaan dan batas sumber daya pod.

ack-koordinator kompatibel dengan versi sebelumnya dari protokol ack-slo-manager. Penjadwal kluster ACK Pro dapat menghitung jumlah sumber daya yang diminta dan jumlah sumber daya yang tersedia berdasarkan versi protokol sebelumnya dan versi baru. Anda dapat meningkatkan secara mulus dari ack-slo-manager ke ack-koordinator.

Catatan

ack-koordinator kompatibel dengan versi protokol hingga 30 Juli 2023. Kami sarankan Anda mengganti parameter sumber daya yang digunakan dalam versi protokol sebelumnya dengan yang digunakan dalam versi terbaru.

Tabel berikut menjelaskan kompatibilitas antara penjadwal kluster ACK Pro, ack-koordinator, dan protokol yang berbeda.

Versi penjadwal

ack-koordinator (ack-slo-manager)

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 tiba-tiba meningkat setelah aplikasi menggunakan sumber daya Batch?

Untuk aplikasi yang dikonfigurasikan dengan kubernetes.io/batch-memory (Batas memori Batch), ack-koordinator menentukan batas memori dalam cgroup node berdasarkan batas memori Batch setelah kontainer dibuat. Beberapa aplikasi secara otomatis meminta memori berdasarkan cgroup kontainer saat aplikasi dimulai. Jika aplikasi dimulai sebelum batas memori cgroup dikonfigurasikan, penggunaan memori aktual mungkin melebihi batas memori Batch. Namun, sistem operasi tidak segera mengurangi penggunaan memori proses. Akibatnya, batas memori dalam cgroup kontainer tidak dapat ditentukan sampai penggunaan aktual turun di bawah batas memori Batch.

Dalam hal ini, kami sarankan Anda memodifikasi konfigurasi aplikasi untuk memastikan bahwa penggunaan memori aktual tetap di bawah batas memori Batch. Anda juga dapat memeriksa parameter batas memori dalam skrip boot aplikasi untuk memastikan bahwa parameter tersebut dikonfigurasikan sebelum aplikasi dimulai. Ini memastikan bahwa penggunaan memori aplikasi dibatasi dengan benar dan menghindari kesalahan OOM.

Jalankan perintah berikut dalam kontainer untuk menanyakan batas memori:

# Satuan: byte. 
cat /sys/fs/cgroup/memory/memory.limit_in_bytes 
# Output yang diharapkan. 
1048576000