All Products
Search
Document Center

Container Service for Kubernetes:Ubah secara dinamis parameter resource pod

Last Updated:Mar 07, 2026

Pada Kubernetes 1.27 dan versi sebelumnya, Anda hanya dapat mengubah parameter kontainer untuk pod yang sedang berjalan dengan memperbarui PodSpec dan mengirim ulang, yang akan menghapus lalu membuat ulang pod tersebut. ACK menyediakan fitur yang memungkinkan Anda mengubah secara dinamis parameter resource pod menggunakan file Cgroups. Fitur ini memungkinkan Anda mengubah sementara parameter isolasi CPU, memori, dan I/O disk pod pada satu mesin tanpa me-restart pod.

Fitur ini hanya ditujukan untuk penyesuaian sementara. Misalnya, jika penggunaan memori pod meningkat secara bertahap, Anda dapat menaikkan batas memori pod tanpa me-restart-nya untuk menghindari pemicuan out of memory (OOM) killer. Untuk operasi O&M rutin dan formal, kami merekomendasikan penggunaan fitur-fitur berikut: Aktifkan kebijakan optimasi performa CPU Burst, Aktifkan penjadwalan sadar topologi CPU, dan Profilisasi resource.

Prasyarat

Ubah batas memori

Jika penggunaan memori pod meningkat, Anda dapat mengubah sementara dan dinamis batas memori kontainer menggunakan file Cgroups untuk mencegah pemicuan OOM killer. Contoh ini membuat kontainer dengan batas memori awal 1 GB. Kemudian memverifikasi bahwa Anda berhasil mengubah batas memori kontainer menggunakan Cgroups tanpa me-restart pod.

Jika Anda menggunakan fitur ini di kluster versi 1.22 atau lebih baru, pastikan versi komponen ack-koordinator adalah v1.5.0-ack1.14 atau lebih baru. Versi komponen lain hanya mendukung kluster versi 1.22 atau lebih lama.

Catatan

Untuk penyesuaian rutin batas CPU, Anda dapat menggunakan kebijakan CPU Burst untuk menyesuaikan elastisitas resource CPU pod secara otomatis. Untuk informasi selengkapnya, lihat Aktifkan kebijakan CPU Burst. Jika Anda tetap perlu menyesuaikan sementara batas CPU, lihat prosedur di Migrasi dari resource-controller ke ack-koordinator.

  1. Buat file bernama 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" # The memory limit of the container is 1 GB.
        command: ["stress"]
        args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"]
  2. Jalankan perintah berikut untuk menerapkan pod-demo ke kluster.

    kubectl apply -f pod-demo.yaml
  3. Jalankan perintah berikut untuk melihat batas memori awal kontainer.

    # The specific path can be constructed from the pod UID and container ID.
    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:

    # This corresponds to 1 GB, which is 1 × 1024 × 1024 × 1024 = 1073741824.
    1073741824

    Output menunjukkan bahwa batas memori awal kontainer adalah 1 GB. Ini sesuai dengan pengaturan spec.containers.resources.limits.memory pada Langkah 1.

  4. Buat file bernama cgroups-sample.yaml dengan konten berikut untuk menentukan batas memori baru bagi kontainer.

    apiVersion: resources.alibabacloud.com/v1alpha1
    kind: Cgroups
    metadata:
      name: cgroups-sample
    spec:
      pod:
        name: pod-demo
        namespace: default
        containers:
        - name: pod-demo
          memory: 5Gi  # Specify a memory limit of 5 GB for the pod.
  5. Jalankan perintah berikut untuk menerapkan cgroups-sample.yaml ke kluster.

    kubectl apply -f cgroups-sample.yaml
  6. Jalankan perintah berikut untuk melihat batas memori terbaru kontainer.

    # The specific path can be constructed from the pod UID.
    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:

    # This corresponds to 5 GB, which is 5 × 1024 × 1024 × 1024 = 5368709120
    5368709120

    Output yang diharapkan menunjukkan batas memori kontainer adalah 5 GB, yang sesuai dengan nilai yang ditentukan pada Langkah 4 untuk spec.pod.containers.memory. Hal ini mengonfirmasi bahwa modifikasi berhasil.

  7. Jalankan perintah berikut untuk memeriksa status pod.

    kubectl describe pod pod-demo

    Output yang diharapkan:

    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

    Output menunjukkan bahwa daftar Events tidak berisi informasi tentang restart pod dan pod berjalan secara normal.

Ubah cakupan binding core CPU

Jika aplikasi Anda bersifat CPU-intensive dan memerlukan isolasi resource yang lebih baik, Anda dapat mengubah cakupan binding core CPU untuk menentukan core CPU mana yang dapat digunakan oleh pod.

Contoh ini membuat pod yang tidak terikat pada core CPU tertentu. Kemudian memverifikasi bahwa Anda berhasil mengubah cakupan binding core CPU pod menggunakan file Cgroups tanpa me-restart pod.

Catatan

Untuk binding core CPU rutin, kami merekomendasikan penggunaan fitur penjadwalan sadar topologi CPU untuk memberikan performa lebih baik bagi beban kerja yang sensitif terhadap CPU. Untuk informasi selengkapnya, lihat Aktifkan penjadwalan sadar topologi CPU.

  1. Buat file bernama 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. Jalankan perintah berikut untuk menerapkan pod-cpuset-demo.yaml ke kluster.

    kubectl apply -f pod-cpuset-demo.yaml
  3. Jalankan perintah berikut untuk melihat binding core CPU saat ini dari kontainer.

    # The actual path can be constructed from the pod UID and container ID.
    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

    Output menunjukkan bahwa sebelum binding CPU, rentang core CPU yang tersedia adalah 0 hingga 31, artinya tidak ada batasan CPU.

  4. Buat file bernama cgroups-sample-cpusetpod.yaml dengan konten berikut untuk menentukan informasi binding core 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  # Bind the pod to CPU cores 2 and 3.
  5. Jalankan perintah berikut untuk menerapkan cgroups-sample-cpusetpod.yaml ke kluster.

    kubectl apply -f cgroups-sample-cpusetpod.yaml
  6. Jalankan perintah berikut untuk melihat binding core CPU terbaru dari kontainer.

    # The actual path can be constructed from the pod UID and container ID.
    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

    Output yang diharapkan menunjukkan bahwa kontainer berhasil disambungkan ke CPU 2 dan CPU 3. Hal ini konsisten dengan pengaturan spec.pod.containers.cpuset-cpus pada Langkah 4, yang mengonfirmasi bahwa modifikasi berhasil.

  7. Jalankan perintah berikut untuk memeriksa status pod.

    kubectl describe pod pod-cpuset-demo

    Output yang diharapkan:

    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

    Output menunjukkan bahwa daftar Events tidak berisi informasi tentang restart pod. Pod berjalan secara normal.

Ubah parameter IOPS disk

Untuk mengontrol IOPS disk, Anda harus menggunakan node pekerja yang menjalankan sistem operasi Alibaba Cloud Linux.

Contoh ini membuat aplikasi uji intensif I/O. Kemudian memverifikasi bahwa Anda dapat membatasi throughput pod dan mengubah batas I/O disk kontainer menggunakan file Cgroups tanpa me-restart pod.

Catatan

Saat Anda menggunakan batasan blkio di lingkungan cgroup v1, kernel sistem operasi hanya membatasi I/O langsung dari kontainer. I/O buffered tidak dapat dibatasi. Untuk membatasi I/O buffered, Anda harus mengaktifkan fitur cgroup writeback untuk cgroup v1 di Alibaba Cloud Linux. Untuk informasi selengkapnya, lihat Aktifkan fitur cgroup writeback. Fitur ini tidak didukung di lingkungan cgroup v2.

  1. Buat aplikasi uji intensif I/O menggunakan konten YAML berikut.

    Direktori host /mnt dipasang untuk digunakan di dalam pod dan sesuai dengan nama perangkat disk /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"]
            # Use the Fio tool to perform a write test on disk IOPS.
            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    # Mount to the /data path.
          volumes:
            - name: pvc
              hostPath:
                path: /mnt
  2. Jalankan perintah berikut untuk menerapkan fio-demo ke kluster.

    kubectl apply -f fio-demo.yaml
  3. Terapkan file Cgroups yang mengontrol IOPS disk untuk membatasi throughput pod.

    1. Buat file bernama cgroups-sample-fio.yaml dengan konten YAML berikut untuk menentukan batas byte per detik (BPS) untuk perangkat /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:
              # BPS limit, such as 1048576, 2097152, or 3145728.
              device_write_bps: [{device: "/dev/vda1", value: "1048576"}]
    2. Jalankan perintah berikut untuk melihat batas I/O disk terbaru dari kontainer.

      # The actual path can be constructed from the pod UID and container ID.
      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

      Output menunjukkan bahwa batas kecepatan disk saat ini diatur ke 1048576.

  4. Lihat data pemantauan disk untuk node yang sesuai.

    84

    85

    Seperti yang ditunjukkan pada gambar di atas, throughput BPS (File System Write) kontainer sesuai dengan batas device_write_bps yang ditetapkan pada Langkah 3. Pod tidak direstart selama modifikasi.

    Catatan

    Anda juga dapat mengaktifkan Dasbor Prometheus Alibaba Cloud. Untuk informasi selengkapnya, lihat Menyambungkan ke dan mengonfigurasi Pemantauan Prometheus Alibaba Cloud. Di halaman Pemantauan Prometheus, pilih Operations > Prometheus Monitoring. Pada tab Application Monitoring, Anda dapat memfilter aplikasi sampel untuk melihat data disk-nya.

Ubah secara dinamis parameter resource pod di tingkat deployment

Modifikasi dinamis parameter resource di tingkat pod, seperti yang dijelaskan pada bagian sebelumnya, juga berlaku di tingkat deployment. Modifikasi di tingkat pod berlaku melalui bidang spec.pod dalam file Cgroups, sedangkan modifikasi di tingkat deployment berlaku melalui bidang spec.deployment. Contoh berikut menunjukkan cara mengubah cakupan binding core CPU untuk deployment. Operasi untuk skenario lain serupa.

  1. Buat file bernama go-demo.yaml dengan konten berikut.

    Deployment berisi dua instans program uji stres. Setiap instans menggunakan 0,5 core 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. Jalankan perintah berikut untuk menerapkan go-demo ke kluster.

    kubectl apply -f go-demo.yaml
  3. Buat file bernama cgroups-cpuset-sample.yaml dengan konten berikut untuk menentukan informasi binding CPU.

    apiVersion: resources.alibabacloud.com/v1alpha1
    kind: Cgroups
    metadata:
      name: cgroups-cpuset-sample
    spec:
      deployment: # This is for a Deployment.
        name: go-demo
        namespace: default
        containers:
        - name: go-demo
          cpuset-cpus: 2,3 # Bind the pod to CPU cores 2 and 3.
  4. Jalankan perintah berikut untuk menerapkan cgroups-cpuset-sample ke kluster.

    kubectl apply -f cgroups-cpuset-sample.yaml
  5. Jalankan perintah berikut untuk melihat binding core CPU terbaru dari kontainer.

    # The actual path can be constructed from the pod UID and container ID.
    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

    Output menunjukkan bahwa kontainer terikat ke core CPU 2 dan 3. Hal ini sesuai dengan pengaturan spec.deployment.containers.cpuset-cpus dalam file Cgroups.