Tüm Ürünler
Search
Belge Merkezi

Container Service for Kubernetes:Dynamically modify pod resource parameters

Son Güncelleme:Oct 06, 2026

Kubernetes 1.27 ve önceki sürümlerde, pod çalışma zamanı sırasında konteyner parametrelerini güncellemek için PodSpec'in yeniden gönderilmesi gerekir; bu işlem pod'un silinip yeniden oluşturulmasını tetikler. ACK, çalışan bir pod'un CPU, bellek ve disk G/Ç yalıtım parametrelerini cgroup dosyaları aracılığıyla geçici olarak değiştirmenize olanak tanır — yeniden başlatma gerekmez.

Önemli

Bu özellik yalnızca geçici acil durum ayarlamaları içindir. Düzenli kaynak yönetimi için CPU Burst, CPU topolojiye duyarlı zamanlama veya kaynak profil oluşturma kullanın.

Çalışma biçimi

ACK, kaynak değişikliklerini ack-koordinator'a iletmek için kind: Cgroups türünde özel bir kaynak tanımı (CRD) kullanır. Bir Cgroups kaynağı uyguladığınızda, düğümdeki koordlet yeni değerleri doğrudan cgroup dosyalarına yazar; bu işlem Kubernetes zamanlayıcısını ve kubelet uzlaştırma döngüsünü atlar. Pod'un PodSpec'i değişmez; yalnızca düğümdeki cgroup değerleri güncellenir.

Belirli bir pod'u hedeflemek için spec.pod alanını veya bir Deployment'taki tüm pod'ları hedeflemek için spec.deployment alanını kullanın.

Ön koşullar

Aşağıdakileri sağlayın:

Faturalandırma

ack-koordinator'u yüklemek ve kullanmak ücretsizdir. Aşağıdaki durumlarda ek ücretler uygulanabilir:

  • Çalışan düğüm kaynakları: ack-koordinator, yüklendikten sonra çalışan düğümlerde kaynak tüketen yönetilmeyen bir eklentidir. Eklentiyi yüklerken her modül için kaynak isteklerini belirtin.

  • Prometheus izleme ölçümleri: Enable Prometheus monitoring metrics for ACK-Koordinator seçeneğini etkinleştirir ve Managed Service for Prometheus kullanırsanız, ölçümler özel ölçümler olarak faturalandırılır. Ücretler küme boyutuna ve uygulama sayısına bağlıdır. Bu özelliği etkinleştirmeden önce Prometheus örneği faturalandırması belgesini inceleyin ve tüketimi izlemek için kullanım sorgusu aracını kullanın.

Sınırlamalar

Kısıtlama Ayrıntı
Kapsam Yalnızca geçici ayarlamalar. Pod'un PodSpec'ini güncellemez ve pod yeniden başlatıldığında kalıcı olmaz.
Küme sürümü (bellek) Küme sürümü 1.22 veya üzeri için ack-koordinator v1.5.0-ack1.14 veya sonraki bir sürüm gerekir. Önceki eklenti sürümleri yalnızca 1.22 veya önceki sürümleri çalıştıran kümeleri destekler.
Disk G/Ç Çalışan düğümler Alibaba Cloud Linux (Alinux) çalıştırmalıdır.
cgroup v1 arabellekli G/Ç cgroup v1'de blkio sınırları yalnızca doğrudan G/Ç için geçerlidir. Arabellekli G/Ç'yi sınırlamak için Alinux'ta cgroup writeback özelliğini etkinleştirin.
cgroup v2 cgroup v2 ortamlarında blkio üzerinden disk G/Ç kısıtlaması desteklenmez.
CPU sınırı Geçici CPU sınırı ayarlamaları için bkz. resource-controller'dan ack-koordinator'a geçiş.

Bellek sınırını değiştirin

Pod'u yeniden başlatmadan OOM (Out Of Memory) sonlandırmalarını önlemek için bir pod'un bellek sınırını artırın. Bu örnekte sınır 1 GiB'den 5 GiB'ye yükseltilmektedir.

  1. Aşağıdaki içeriğe sahip pod-demo.yaml dosyasını oluşturun.

    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" # Initial memory limit: 1 GiB
        command: ["stress"]
        args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"]
  2. Pod'u dağıtın.

    kubectl apply -f pod-demo.yaml
  3. İlk bellek sınırını doğrulayın. cgroup yolu, pod UID'sinden ve konteyner kimliğinden oluşturulur.

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

    Beklenen çıktı:

    1073741824

    1073741824 = 1 GiB, pod tanımındaki spec.containers.resources.limits.memory değeriyle eşleşir.

  4. Yeni bellek sınırını ayarlamak için cgroups-sample.yaml dosyasını oluşturun.

    apiVersion: resources.alibabacloud.com/v1alpha1
    kind: Cgroups
    metadata:
      name: cgroups-sample
    spec:
      pod:
        name: pod-demo
        namespace: default
        containers:
        - name: pod-demo
          memory: 5Gi  # New memory limit: 5 GiB
  5. Cgroups kaynağını uygulayın.

    kubectl apply -f cgroups-sample.yaml
  6. Güncellenmiş bellek sınırını doğrulayın.

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

    Beklenen çıktı:

    5368709120

    5368709120 = 5 GiB, Cgroups kaynağındaki spec.pod.containers.memory değeriyle eşleşir.

  7. Pod'un yeniden başlatılmadığını onaylayın.

    kubectl describe pod pod-demo

    Events bölümünde yeniden başlatma olayı olmadığını, yalnızca orijinal zamanlama ve başlatma olaylarının bulunduğunu onaylayın:

    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

    Yeniden başlatma olayının olmaması, bellek sınırının yerinde güncellendiğini doğrular.

CPU çekirdek bağlama kapsamını değiştirin

Daha sıkı kaynak yalıtımı için bir pod'u belirli CPU çekirdeklerine bağlayın. Bu örnekte, bir pod'un tüm 32 çekirdekten (0–31) sadece 2–3 numaralı çekirdeklere erişimi kısıtlanmaktadır.

Not

Üretim ortamında kalıcı CPU çekirdek bağlama için bunun yerine CPU topolojiye duyarlı zamanlama kullanın.

  1. Aşağıdaki içeriğe sahip pod-cpuset-demo.yaml dosyasını oluşturun.

    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. Pod'u dağıtın.

    kubectl apply -f pod-cpuset-demo.yaml
  3. Geçerli CPU çekirdek bağlamasını kontrol edin. Yol, pod UID'sinden ve konteyner kimliğinden oluşturulur.

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

    Beklenen çıktı:

    0-31

    0-31 ifadesi, konteynerin tüm 32 CPU çekirdeğini kullanabileceği anlamına gelir.

  4. CPU bağlamasını ayarlamak için cgroups-sample-cpusetpod.yaml dosyasını oluşturun.

    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  # Restrict the pod to CPU cores 2 and 3
  5. Cgroups kaynağını uygulayın.

    kubectl apply -f cgroups-sample-cpusetpod.yaml
  6. Güncellenmiş CPU bağlamasını doğrulayın.

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

    Beklenen çıktı:

    2-3

    Konteyner, Cgroups kaynağındaki spec.pod.containers.cpuset-cpus değeriyle eşleşen şekilde 2–3 numaralı çekirdeklere bağlanmıştır.

  7. Pod'un yeniden başlatılmadığını onaylayın.

    kubectl describe pod pod-cpuset-demo

    Events bölümü, koordlet'ten gelen bir CPUSetBind olayı içerir ancak yeniden başlatma olayı içermez:

    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

Disk G/Ç parametrelerini değiştirin

Not

Çalışan düğümler Alinux çalıştırmalıdır. cgroup v1'de blkio sınırları yalnızca doğrudan G/Ç için geçerlidir. Arabellekli G/Ç'yi sınırlamak için Alinux'ta cgroup writeback özelliğini etkinleştirin. cgroup v2'de desteklenmez.

Bu örnek, bir fio iş yükü dağıtır ve yazma aktarım hızını bir cgroup dosyası aracılığıyla sınırlar.

  1. Aşağıdaki içeriğe sahip fio-demo.yaml dosyasını oluşturun. Ana bilgisayar dizini /mnt pod içinde /data konumuna monte edilir ve /dev/vda1 cihazına eşlenir.

    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"]
            # Run a sequential write test on disk I/O using 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. Uygulamayı dağıtın.

    kubectl apply -f fio-demo.yaml
  3. Bir cgroup dosyası kullanarak yazma aktarım hızını sınırlayın.

    1. /dev/vda1 cihazında saniye başına bayt (BPS) yazma sınırı ayarlamak için cgroups-sample-fio.yaml dosyasını oluşturun.

      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 in bytes per second (e.g., 1048576 = 1 MiB/s)
              device_write_bps: [{device: "/dev/vda1", value: "1048576"}]
    2. Cgroups kaynağını uygulayın.

      kubectl apply -f cgroups-sample-fio.yaml
    3. Güncellenmiş disk G/Ç sınırını doğrulayın. Yol, pod UID'sinden ve konteyner kimliğinden oluşturulur.

      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

      Beklenen çıktı:

      253:0 1048576

      /dev/vda1 (253:0 cihazı) için yazma BPS sınırı 1048576 (1 MiB/s) olarak ayarlanmıştır. Pod yeniden başlatılmamıştır.

  4. Disk izleme verilerini Prometheus'ta görüntülemek için konsola gidin ve Operations > Prometheus Monitoring seçeneğini belirleyin. Application Monitoring sekmesinde örnek uygulamayı filtreleyin. Bkz. Alibaba Cloud Prometheus İzlemeye Bağlanma ve Yapılandırma.

Değişiklikleri Deployment düzeyinde uygulayın

Yukarıdaki tüm yordamlar Deployment düzeyinde de çalışır; spec.pod yerine spec.deployment kullanın. Bu örnek, bir Deployment'a CPU çekirdek bağlaması uygular.

  1. Aşağıdaki içeriğe sahip go-demo.yaml dosyasını oluşturun. Bu Deployment, her biri 0.5 CPU kullanan iki çoğaltma çalıştırır.

    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. Uygulamayı dağıtın.

    kubectl apply -f go-demo.yaml
  3. Deployment'ın pod'larını belirli CPU çekirdeklerine bağlamak için cgroups-cpuset-sample.yaml dosyasını oluşturun.

    apiVersion: resources.alibabacloud.com/v1alpha1
    kind: Cgroups
    metadata:
      name: cgroups-cpuset-sample
    spec:
      deployment: # Targets a Deployment, not a single pod
        name: go-demo
        namespace: default
        containers:
        - name: go-demo
          cpuset-cpus: 2,3 # Bind to CPU cores 2 and 3
  4. Cgroups kaynağını uygulayın.

    kubectl apply -f cgroups-cpuset-sample.yaml
  5. Pod'lardan birinin CPU bağlamasını doğrulayın. Yol, pod UID'sinden ve konteyner kimliğinden oluşturulur.

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

    Beklenen çıktı:

    2-3

    Konteyner, Cgroups kaynağındaki spec.deployment.containers.cpuset-cpus değeriyle eşleşen şekilde 2–3 numaralı çekirdeklere bağlanmıştır.

Sonraki adımlar

  • CPU Burst: Konteynerler kullanılmayan CPU zaman dilimlerini biriktirir ve trafik artışları sırasında harcayarak gecikme süresini azaltır ve hizmet kalitesini iyileştirir. Bkz. CPU Burst ilkesini etkinleştirme.

  • CPU topolojiye duyarlı zamanlama: CPU bağlam değiştirme ek yükünü ve NUMA arası bellek erişimini ortadan kaldırmak için pod'ları zamanlama aşamasında belirli CPU çekirdeklerine sabitleyin. Bkz. CPU topolojiye duyarlı zamanlamayı etkinleştirme.

  • Dinamik kaynak aşırı satışı: Tahsis edilmiş ancak kullanılmayan kaynakları geri kazanın ve bunları daha düşük öncelikli iş yüklerinin kullanımına sunun. Uygulamalar arasında performans etkileşimini önlemek için tek düğümlü QoS ilkeleriyle birleştirin. Bkz. Dinamik kaynak aşırı satışını etkinleştirme.

  • Kaynak profil oluşturma: Konteyner istekleri ve sınırları için doğru boyutlandırma önerileri almak amacıyla geçmiş kullanım verilerini analiz edin. Bkz. Kaynak profil oluşturma.