All Products
Search
Document Center

Container Service for Kubernetes:Ubah parameter resource pod secara dinamis

Last Updated:Jun 24, 2026

Pada Kubernetes 1.27 dan versi sebelumnya, pembaruan parameter kontainer selama waktu proses pod memerlukan pengiriman ulang PodSpec, yang memicu penghapusan dan pembuatan ulang pod. ACK memungkinkan Anda mengubah sementara parameter isolasi CPU, memori, dan I/O disk pod yang sedang berjalan melalui file cgroup—tanpa perlu restart.

Penting

Fitur ini hanya untuk penyesuaian darurat sementara. Untuk manajemen resource reguler, gunakan CPU Burst, penjadwalan sadar topologi CPU, atau profil resource.

Cara kerja

ACK menggunakan custom resource definition (CRD) kind: Cgroups untuk meneruskan perubahan resource ke ack-koordinator. Saat Anda menerapkan resource Cgroups, koordlet pada node menulis nilai baru langsung ke file cgroup—melewati loop rekonsiliasi scheduler dan kubelet Kubernetes. PodSpec pod tetap tidak berubah; hanya nilai cgroup pada node yang diperbarui.

Gunakan spec.pod untuk menargetkan pod tertentu, atau spec.deployment untuk menargetkan semua pod dalam suatu Deployment.

Prasyarat

Pastikan bahwa:

Penagihan

ack-koordinator gratis untuk diinstal dan digunakan. Biaya tambahan mungkin berlaku dalam situasi berikut:

  • Resource node pekerja: ack-koordinator adalah add-on tidak terkelola yang mengonsumsi resource pada node pekerja setelah instalasi. Tentukan permintaan resource untuk setiap modul saat menginstal add-on tersebut.

  • Metrik pemantauan Prometheus: Jika Anda mengaktifkan opsi Enable Prometheus monitoring metrics for ACK-Koordinator dan menggunakan Managed Service for Prometheus, metrik tersebut ditagih sebagai metrik kustom. Biaya tergantung pada ukuran kluster dan jumlah aplikasi. Tinjau dokumentasi penagihan instans Prometheus dan gunakan kueri penggunaan untuk memantau konsumsi sebelum mengaktifkan fitur ini.

Batasan

Kendala Detail
Cakupan Hanya untuk penyesuaian sementara. Tidak memperbarui PodSpec pod atau dipertahankan setelah restart pod.
Versi kluster (memori) Kluster versi 1.22 atau lebih baru memerlukan ack-koordinator v1.5.0-ack1.14 atau lebih baru. Versi add-on sebelumnya hanya mendukung kluster yang menjalankan versi 1.22 atau lebih lama.
Disk I/O Node pekerja harus menjalankan Alibaba Cloud Linux (Alinux).
I/O buffered cgroup v1 Pada cgroup v1, batasan blkio hanya berlaku untuk I/O langsung. Untuk membatasi I/O buffered, aktifkan fitur writeback cgroup di Alinux.
cgroup v2 Pembatasan kecepatan I/O disk melalui blkio tidak didukung di lingkungan cgroup v2.
Batas CPU Untuk penyesuaian batas CPU sementara, lihat Migrasi dari resource-controller ke ack-koordinator.

Ubah batas memori

Tingkatkan batas memori pod untuk mencegah OOM kill tanpa me-restart-nya. Contoh ini menaikkan batas dari 1 GiB menjadi 5 GiB.

  1. Buat file pod-demo.yaml dengan konten berikut.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo
    spec:
      containers:
      - name: pod-demo
        image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4
        resources:
          requests:
            cpu: 1
            memory: "50Mi"
          limits:
            cpu: 1
            memory: "1Gi" # Batas memori awal: 1 GiB
        command: ["stress"]
        args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"]
  2. Terapkan pod tersebut.

    kubectl apply -f pod-demo.yaml
  3. Verifikasi batas memori awal. Jalur cgroup dibuat dari UID pod dan ID kontainer.

    cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytes

    Output yang diharapkan:

    1073741824

    1073741824 = 1 GiB, sesuai dengan spec.containers.resources.limits.memory dalam definisi pod.

  4. Buat file cgroups-sample.yaml untuk mengatur batas memori baru.

    apiVersion: resources.alibabacloud.com/v1alpha1
    kind: Cgroups
    metadata:
      name: cgroups-sample
    spec:
      pod:
        name: pod-demo
        namespace: default
        containers:
        - name: pod-demo
          memory: 5Gi  # Batas memori baru: 5 GiB
  5. Terapkan resource Cgroups.

    kubectl apply -f cgroups-sample.yaml
  6. Verifikasi batas memori yang diperbarui.

    cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytes

    Output yang diharapkan:

    5368709120

    5368709120 = 5 GiB, sesuai dengan spec.pod.containers.memory dalam resource Cgroups.

  7. Konfirmasi bahwa pod tidak di-restart.

    kubectl describe pod pod-demo

    Pastikan tidak ada event restart di bagian Events—hanya event penjadwalan dan startup awal:

    Events:
      Type    Reason          Age   From               Message
      ----    ------          ----  ----               -------
      Normal  Scheduled       36m   default-scheduler  Successfully assigned default/pod-demo to cn-hangzhou.192.168.0.50
      Normal  AllocIPSucceed  36m   terway-daemon      Alloc IP 192.XX.XX.51/24 took 4.490542543s
      Normal  Pulling         36m   kubelet            Pulling image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4"
      Normal  Pulled          36m   kubelet            Successfully pulled image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4" in 2.204s (2.204s including waiting). Image size: 7755078 bytes.
      Normal  Created         36m   kubelet            Created container pod-demo
      Normal  Started         36m   kubelet            Started container pod-demo

    Tidak adanya event restart mengonfirmasi bahwa batas memori diperbarui secara langsung.

Ubah cakupan binding core CPU

Bind pod ke core CPU tertentu untuk isolasi resource yang lebih ketat. Contoh ini membatasi pod dari semua 32 core (0–31) menjadi hanya core 2–3.

Catatan

Untuk binding core CPU persisten di lingkungan produksi, gunakan penjadwalan sadar topologi CPU sebagai gantinya.

  1. Buat file pod-cpuset-demo.yaml dengan konten berikut.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-cpuset-demo
    spec:
      containers:
      - name: pod-cpuset-demo
        image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4
        resources:
          requests:
            memory: "50Mi"
          limits:
            memory: "1000Mi"
            cpu: 0.5
        command: ["stress"]
        args: ["--vm", "1", "--vm-bytes", "556M", "-c", "2", "--vm-hang", "1"]
  2. Terapkan pod tersebut.

    kubectl apply -f pod-cpuset-demo.yaml
  3. Periksa binding core CPU saat ini. Jalurnya dibuat dari UID pod dan ID kontainer.

    cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpus

    Output yang diharapkan:

    0-31

    0-31 berarti kontainer dapat menggunakan semua 32 core CPU.

  4. Buat file cgroups-sample-cpusetpod.yaml untuk mengatur binding CPU.

    apiVersion: resources.alibabacloud.com/v1alpha1
    kind: Cgroups
    metadata:
      name: cgroups-sample-cpusetpod
    spec:
      pod:
        name: pod-cpuset-demo
        namespace: default
        containers:
        - name: pod-cpuset-demo
          cpuset-cpus: 2-3  # Batasi pod ke core CPU 2 dan 3
  5. Terapkan resource Cgroups.

    kubectl apply -f cgroups-sample-cpusetpod.yaml
  6. Verifikasi binding CPU yang diperbarui.

    cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpus

    Output yang diharapkan:

    2-3

    Kontainer terikat ke core 2–3, sesuai dengan spec.pod.containers.cpuset-cpus dalam resource Cgroups.

  7. Konfirmasi bahwa pod tidak di-restart.

    kubectl describe pod pod-cpuset-demo

    Bagian Events mencakup event CPUSetBind dari koordlet tetapi tidak ada event restart:

    Events:
      Type    Reason          Age   From               Message
      ----    ------          ----  ----               -------
      Normal  Scheduled       7m7s  default-scheduler  Successfully assigned default/pod-cpuset-demo to cn-hangzhou.192.XX.XX.50
      Normal  AllocIPSucceed  7m5s  terway-daemon      Alloc IP 192.XX.XX.56/24 took 2.060752512s
      Normal  Pulled          7m5s  kubelet            Container image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4" already present on machine
      Normal  Created         7m5s  kubelet            Created container pod-cpuset-demo
      Normal  Started         7m5s  kubelet            Started container pod-cpuset-demo
      Normal  CPUSetBind      84s   koordlet           set cpuset 2-3 to container pod-cpuset-demo success

Ubah parameter I/O disk

Catatan

Node pekerja harus menjalankan Alinux. Pada cgroup v1, batasan blkio hanya berlaku untuk I/O langsung. Untuk membatasi I/O buffered, aktifkan fitur writeback cgroup di Alinux. Tidak didukung di cgroup v2.

Contoh ini menerapkan workload fio dan membatasi throughput tulisnya melalui file cgroup.

  1. Buat file fio-demo.yaml dengan konten berikut. Direktori host /mnt dimount di /data dalam pod, yang dipetakan ke /dev/vda1.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: fio-demo
      labels:
        app: fio-demo
    spec:
      selector:
        matchLabels:
          app: fio-demo
      template:
        metadata:
          labels:
            app: fio-demo
        spec:
          containers:
          - name: fio-demo
            image: registry.cn-zhangjiakou.aliyuncs.com/acs/fio-for-slo-test:v0.1
            command: ["sh", "-c"]
            # Jalankan uji tulis sekuensial pada I/O disk menggunakan fio
            args: ["fio -filename=/data/test -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=12000 -group_reporting -name=mytest"]
            volumeMounts:
              - name: pvc
                mountPath: /data
          volumes:
            - name: pvc
              hostPath:
                path: /mnt
  2. Terapkan aplikasi tersebut.

    kubectl apply -f fio-demo.yaml
  3. Batasi throughput tulis menggunakan file cgroup.

    1. Buat file cgroups-sample-fio.yaml untuk mengatur batas byte per detik (BPS) tulis pada /dev/vda1.

      apiVersion: resources.alibabacloud.com/v1alpha1
      kind: Cgroups
      metadata:
        name: cgroups-sample-fio
      spec:
        deployment:
          name: fio-demo
          namespace: default
          containers:
          - name: fio-demo
            blkio:
              # Batas BPS dalam byte per detik (misalnya, 1048576 = 1 MiB/s)
              device_write_bps: [{device: "/dev/vda1", value: "1048576"}]
    2. Terapkan resource Cgroups.

      kubectl apply -f cgroups-sample-fio.yaml
    3. Verifikasi batas I/O disk yang diperbarui. Jalurnya dibuat dari UID pod dan ID kontainer.

      cat /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod0840adda_bc26_4870_adba_f193cd00****.slice/cri-containerd-9ea6cc97a6de902d941199db2fcda872ddd543485f5f987498e40cd706dc****.scope/blkio.throttle.write_bps_device

      Output yang diharapkan:

      253:0 1048576

      Batas BPS tulis adalah 1048576 (1 MiB/s) untuk perangkat 253:0 (/dev/vda1). Pod tidak di-restart.

  4. Untuk melihat data pemantauan disk di Prometheus, buka Konsol dan pilih Operations > Prometheus Monitoring. Di tab Application Monitoring, filter aplikasi contoh tersebut. Lihat Hubungkan dan konfigurasikan Alibaba Cloud Prometheus Monitoring.

Terapkan perubahan di tingkat Deployment

Semua prosedur di atas juga berlaku di tingkat Deployment—gunakan spec.deployment sebagai ganti spec.pod. Contoh ini menerapkan binding core CPU ke suatu Deployment.

  1. Buat file go-demo.yaml dengan konten berikut. Deployment ini menjalankan dua replika dengan masing-masing 0,5 CPU.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: go-demo
      labels:
        app: go-demo
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: go-demo
      template:
        metadata:
          labels:
            app: go-demo
        spec:
          containers:
          - name: go-demo
            image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4
            command: ["stress"]
            args: ["--vm", "1", "--vm-bytes", "556M", "-c", "1", "--vm-hang", "1"]
            imagePullPolicy: Always
            resources:
              requests:
                cpu: 0.5
              limits:
                cpu: 0.5
  2. Terapkan aplikasi tersebut.

    kubectl apply -f go-demo.yaml
  3. Buat file cgroups-cpuset-sample.yaml untuk mengikat pod Deployment ke core CPU tertentu.

    apiVersion: resources.alibabacloud.com/v1alpha1
    kind: Cgroups
    metadata:
      name: cgroups-cpuset-sample
    spec:
      deployment: # Menargetkan Deployment, bukan pod tunggal
        name: go-demo
        namespace: default
        containers:
        - name: go-demo
          cpuset-cpus: 2,3 # Ikatan ke core CPU 2 dan 3
  4. Terapkan resource Cgroups.

    kubectl apply -f cgroups-cpuset-sample.yaml
  5. Verifikasi binding CPU untuk salah satu pod. Jalurnya dibuat dari UID pod dan ID kontainer.

    cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod06de7408_346a_4d00_ba25_02833b6c****.slice/cri-containerd-733a0dc93480eb47ac6c5abfade5c22ed41639958e3d304ca1f85959edc3****.scope/cpuset.cpus

    Output yang diharapkan:

    2-3

    Kontainer terikat ke core 2–3, sesuai dengan spec.deployment.containers.cpuset-cpus dalam resource Cgroups.

Langkah selanjutnya

  • CPU Burst: Kontainer mengumpulkan time slice CPU yang tidak terpakai dan menggunakannya selama lonjakan traffic, sehingga mengurangi latensi dan meningkatkan kualitas layanan. Lihat Aktifkan kebijakan CPU Burst.

  • Penjadwalan sadar topologi CPU: Pin pod ke core CPU tertentu saat penjadwalan untuk menghilangkan overhead context-switching CPU dan akses memori lintas-NUMA. Lihat Aktifkan penjadwalan sadar topologi CPU.

  • Overselling resource dinamis: Reklaim resource yang dialokasikan namun tidak digunakan dan jadikan tersedia untuk workload prioritas lebih rendah. Gabungkan dengan kebijakan QoS single-node untuk menghindari gangguan performa antar aplikasi. Lihat Aktifkan overselling resource dinamis.

  • Profil resource: Analisis data penggunaan historis untuk mendapatkan rekomendasi right-sizing terhadap request dan limit kontainer. Lihat Profil resource.