全部产品
Search
文档中心

Container Service for Kubernetes:Mengubah parameter sumber daya pod secara dinamis

更新时间:Jul 02, 2025

Untuk sementara mengubah parameter kontainer pada pod yang sedang berjalan di kluster Kubernetes versi 1.27 atau lebih lama, Anda perlu memperbarui parameter PodSpec dan menerapkan perubahan tersebut. Pod akan dihapus dan dibuat ulang. Fitur dari Container Service for Kubernetes (ACK) memungkinkan Anda menggunakan file konfigurasi cgroup untuk menyesuaikan parameter CPU, memori, dan batas IOPS disk tanpa me-restart pod.

Fitur ini cocok untuk skenario penyesuaian sementara. Misalnya, jika penggunaan memori pod meningkat, Anda dapat meningkatkan batas memori untuk menghindari pemicu out of memory (OOM) killer. Untuk operasi O&M umum, kami merekomendasikan penggunaan fitur terkait yang disediakan oleh ACK. Informasi lebih lanjut dapat ditemukan di Aktifkan CPU Burst, Aktifkan penjadwalan CPU dengan kesadaran topologi, dan Profil sumber daya.

Prasyarat

Penagihan

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

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

  • 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. Biaya bergantung pada ukuran kluster dan jumlah aplikasi. Sebelum mengaktifkan metrik Prometheus, lihat Penagihan dari Managed Service for Prometheus untuk mempelajari kuota gratis dan aturan penagihan metrik kustom. Untuk informasi lebih lanjut tentang cara memantau penggunaan sumber daya, lihat Kueri jumlah data observabel dan tagihan.

Memodifikasi Batas Memori

Jika penggunaan memori pod meningkat, Anda dapat menggunakan file konfigurasi cgroup untuk secara dinamis mengubah batas memori pod guna menghindari pemicu OOM killer. Contoh ini mencakup pembuatan kontainer dengan batas memori awal 1 GB untuk memverifikasi bahwa batas memori dapat diubah tanpa me-restart pod.

Untuk kluster yang menjalankan Kubernetes 1.22 atau lebih baru, pastikan versi komponen ack-koordinator adalah v1.5.0-ack1.14 atau lebih baru. Versi lain hanya mendukung kluster Kubernetes 1.22 atau lebih lama.

Catatan

Untuk mengubah batas CPU secara umum, kami merekomendasikan penggunaan fitur CPU Burst, yang secara otomatis menyesuaikan batas CPU pod. Lihat Aktifkan CPU Burst. Untuk penyesuaian sementara, ikuti langkah-langkah di Tingkatkan dari resource-controller ke ack-koordinator.

  1. Buat file pod-demo.yaml dengan template YAML 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" # Setel batas memori kontainer menjadi 1 GB.
        command: ["stress"]
        args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"]
  2. Jalankan perintah berikut untuk menerapkan aplikasi pod-demo di kluster:

    kubectl apply -f pod-demo.yaml
  3. Jalankan perintah berikut untuk menanyakan batas memori asli kontainer:

    # Jalur aktual terdiri 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:

    # Dalam contoh ini, 1073741824 dikembalikan, yang merupakan hasil dari 1 × 1024 × 1024 × 1024. Ini menunjukkan bahwa batas memori asli kontainer adalah 1 GB.
    1073741824

    Output menunjukkan bahwa batas memori asli kontainer adalah 1 GB, sesuai dengan nilai parameter spec.containers.resources.limits.memory di file YAML yang dibuat di Langkah 1.

  4. Gunakan template YAML berikut untuk menentukan batas memori kontainer dan buat file cgroups-sample.yaml:

    apiVersion: resources.alibabacloud.com/v1alpha1
    kind: Cgroups
    metadata:
      name: cgroups-sample
    spec:
      pod:
        name: pod-demo
        namespace: default
        containers:
        - name: pod-demo
          memory: 5Gi  # Ubah batas memori pod menjadi 5 GB.

  5. Jalankan perintah berikut untuk menerapkan file cgroups-sample.yaml di kluster:

    kubectl apply -f cgroups-sample.yaml
  6. Jalankan perintah berikut untuk menanyakan batas memori baru kontainer setelah perubahan diterapkan:

    # Jalur spesifik dapat diperoleh berdasarkan UID pod.
    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:

    # Dalam contoh ini, 5368709120 dikembalikan, yang merupakan hasil dari 5 × 1024 × 1024 × 1024. Ini menunjukkan bahwa batas memori baru kontainer adalah 5 GB.
    5368709120

    Output menunjukkan bahwa batas memori kontainer adalah 5 GB, sesuai dengan nilai parameter spec.pod.containers.memory di file YAML yang dibuat di Langkah 4. Modifikasi berhasil.

  7. Jalankan perintah berikut untuk menanyakan 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 pod berjalan normal tanpa acara restart.

Mengubah vCore yang Terikat pada Pod

Untuk aplikasi yang memerlukan performa CPU tinggi dan isolasi sumber daya yang lebih baik, Anda dapat mengubah vCore yang terikat ke pod serta menentukan nomor seri vCore yang dapat digunakan oleh pod.

Contoh ini mencakup pembuatan pod tanpa vCore terikat untuk memverifikasi bahwa vCore dapat diubah menggunakan file konfigurasi cgroup tanpa me-restart pod.

Catatan

Dalam kasus umum, kami merekomendasikan Anda menggunakan penjadwalan CPU dengan kesadaran topologi untuk mengelola sumber daya CPU untuk beban kerja sensitif CPU. Untuk informasi lebih lanjut, lihat Aktifkan penjadwalan CPU dengan kesadaran topologi.

  1. Buat file pod-cpuset-demo.yaml dengan template YAML 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 file pod-cpuset-demo.yaml di kluster:

    kubectl apply -f pod-cpuset-demo.yaml
  3. Jalankan perintah berikut untuk menanyakan vCore yang terikat ke kontainer:

    # Jalur aktual terdiri 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

    Output menunjukkan bahwa nomor seri vCore yang dapat digunakan oleh kontainer berkisar antara 0 hingga 31 sebelum Anda mengikat vCore ke kontainer.

  4. Gunakan template YAML berikut untuk menentukan vCore dan buat file cgroups-sample-cpusetpod.yaml:

    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  # Ikat vCore 2 dan vCore 3 ke pod.

  5. Jalankan perintah berikut untuk menerapkan file cgroups-sample-cpusetpod.yaml di kluster:

    kubectl apply -f cgroups-sample-cpusetpod.yaml
  6. Jalankan perintah berikut untuk menanyakan vCore yang terikat ke kontainer setelah perubahan diterapkan:

    # Jalur aktual terdiri 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:

    2-3

    Output menunjukkan bahwa vCore 2 dan vCore 3 terikat ke kontainer, sesuai dengan nilai parameter spec.pod.containers.cpuset-cpus di file YAML yang dibuat di Langkah 4. Modifikasi berhasil.

  7. Jalankan perintah berikut untuk menanyakan 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 pod berjalan normal tanpa acara restart.

Memodifikasi Disk IOPS

Untuk mengubah disk IOPS pod, gunakan Alibaba Cloud Linux sebagai sistem operasi node pekerja yang ingin Anda kelola.

Contoh ini mencakup pembuatan aplikasi intensif-I/O untuk memverifikasi bahwa disk IOPS pod dapat diubah menggunakan file konfigurasi cgroup tanpa me-restart pod.

Catatan

Jika Anda menentukan batas blkio di cgroup v1, kernel OS hanya membatasi I/O langsung pod. Kernel OS tidak membatasi I/O buffer pod. Untuk membatasi I/O buffer pod, gunakan cgroup v2 atau aktifkan fitur cgroup writeback untuk Alibaba Cloud Linux. Lihat Aktifkan fitur cgroup writeback untuk informasi lebih lanjut.

  1. Buat aplikasi intensif-I/O dengan template YAML berikut:

    Mount direktori host /mnt ke pod. Nama perangkat disk yang sesuai adalah /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"]
            # Gunakan Fio untuk melakukan uji stres tulis pada disk.
            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    # Volume disk dimount ke path /data.
          volumes:
            - name: pvc
              hostPath:
                path: /mnt
  2. Jalankan perintah berikut untuk menerapkan Deployment fio-demo di kluster:

    kubectl apply -f fio-demo.yaml
  3. Buat file konfigurasi cgroup yang digunakan untuk mengontrol disk IOPS guna membatasi throughput pod.

    1. Gunakan file YAML berikut untuk menentukan batas byte per detik (BPS) perangkat /dev/vda1 dan buat file bernama cgroups-sample-fio.yaml:

      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 I/O dalam bit/detik. Contoh: 1048576, 2097152, atau 3145728.
              device_write_bps: [{device: "/dev/vda1", value: "1048576"}]
    2. Jalankan perintah berikut untuk menanyakan batas disk IOPS setelah perubahan diterapkan:

      # Jalur aktual terdiri 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

      Output menunjukkan bahwa batas IOPS disk adalah 1048576 bit/detik.

  4. Lihat data pemantauan node.

    84

    85

    Gambar-gambar menunjukkan bahwa BPS kontainer sama dengan nilai yang ditentukan dalam parameter device_write_bps file YAML yang dibuat di Langkah 3. Pod tidak direstart setelah perubahan diterapkan.

    Catatan

    Untuk informasi lebih lanjut tentang cara mengaktifkan Managed Service for Prometheus, lihat Gunakan Managed Service for Prometheus. Di panel navigasi kiri, pilih Operations > Prometheus Monitoring. Klik tab Application Monitoring untuk melihat data disk.

Ubah parameter sumber daya level Deployment pod secara dinamis

Pengubahan parameter sumber daya level pod yang dinamis juga berlaku untuk parameter level Deployment. Parameter sumber daya level pod diubah menggunakan bidang spec.pod di file konfigurasi cgroup, sedangkan parameter level Deployment diubah menggunakan bidang spec.deployment. Contoh berikut menjelaskan cara mengubah vCore dalam Deployment. Operasi di skenario lain serupa.

  1. Buat file go-demo.yaml dengan template YAML berikut:

    Deployment membuat dua pod yang menjalankan program uji stres. Setiap pod meminta 0.5 vCore.

    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: polinux/stress
            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 Deployment go-demo di kluster:

    kubectl apply -f go-demo.yaml
  3. Gunakan template YAML berikut untuk menentukan informasi pengikatan CPU dan buat file bernama cgroups-cpuset-sample.yaml:

    apiVersion: resources.alibabacloud.com/v1alpha1
    kind: Cgroups
    metadata:
      name: cgroups-cpuset-sample
    spec:
      deployment: # Ini adalah Deployment.
        name: go-demo
        namespace: default
        containers:
        - name: go-demo
          cpuset-cpus: 2,3 # Ikat vCore 2 dan vCore 3 ke pod.

  4. Jalankan perintah berikut untuk menerapkan Deployment cgroups-cpuset-sample di kluster:

    kubectl apply -f cgroups-cpuset-sample.yaml
  5. Jalankan perintah berikut untuk menanyakan vCore yang terikat ke kontainer setelah perubahan diterapkan:

    # Jalur aktual terdiri 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

    Output menunjukkan bahwa vCore 2 dan vCore 3 terikat ke kontainer, sesuai dengan nilai parameter spec.deployment.containers.cpuset-cpus di file konfigurasi cgroup.