Tüm Ürünler
Search
Belge Merkezi

Container Service for Kubernetes:Enable dynamic resource overcommitment

Son Güncelleme:Oct 06, 2026

Çevrimiçi iş yükleri genellikle CPU ve belleği en yüksek kullanım tahminlerine göre ayırır; ancak gerçek kullanım çoğu zaman çok daha düşüktür. Bu durum, ayrılmış ama kullanılmayan geniş bir kaynak havuzu bırakır. Standart BestEffort pod'ları bu kaynakları paylaşabilir fakat zamanlama garantisi veya adil kullanım denetimi bulunmaz. Dinamik kaynak aşırı tahsisi her iki sorunu da çözer: ack-koordinator bileşeni düğüm yükünü gerçek zamanlı olarak izler, geri kazanılabilir kapasiteyi hesaplar ve bunu BestEffort pod'larının açıkça talep edebileceği Batch genişletilmiş kaynakları (kubernetes.io/batch-cpu ve kubernetes.io/batch-memory) olarak sunar.

Bu özellikten en iyi şekilde yararlanmak için Kubernetes belgelerindeki Pod Quality of Service Classes ve Assign Memory Resources to Containers and Pods konularını okuyun.

Nasıl çalışır?

ack-koordinator, düğüm başına yükü sürekli olarak izler ve geri kazanılabilir kapasiteyi her düğümde genişletilmiş kaynaklar olarak yayımlar. BestEffort pod'ları bu Batch kaynaklarına karşı açık istekler ve sınırlar belirtir; böylece ACK zamanlayıcısı bilinçli yerleştirme kararları alabilir ve düğümün cgroup hiyerarşisi üzerinden kaynak sınırlarını uygulayabilir.

Aşağıdaki diyagram, standart kaynak aşırı tahsisinin neden yetersiz kaldığını gösterir:

image

Dinamik aşırı tahsis olmadan zamanlayıcı gerçek düğüm yükünü göremez; bu nedenle BestEffort pod'larını zaten aşırı yüklenmiş düğümlere yerleştirebilir. Ayrıca pod başına farklı kaynak miktarlarını ifade etmenin bir yolu yoktur, dolayısıyla kaynaklar BestEffort pod'ları arasında adil dağıtılamaz.

ack-koordinator, geri kazanılan kaynak kapasitesini tanımlamak için üç terim kullanır:

Terim Açıklama
Reclaimed Şu anda dinamik olarak aşırı tahsis edilebilen kaynaklar
Buffered Geri kazanımdan tutulan, ayrılmış kaynaklar
Usage Gerçek kaynak tüketimi

image

QoS sınıfları ve Batch kaynakları

Kubernetes, her pod'a kaynak yapılandırmasına dayalı bir hizmet kalitesi (QoS) sınıfı atar. Batch kaynakları özellikle BestEffort sınıfı için tasarlanmıştır:

QoS sınıfı Kaynak yapılandırması Kullanım durumu
Guaranteed Tüm konteynerler için requests == limits Gecikmeye duyarlı üretim hizmetleri
Burstable En az bir konteyner için requests < limits Genel çevrimiçi iş yükleri
BestEffort requests veya limits yok — bunun yerine Batch kaynaklarını kullanın Toplu işler ve çevrimdışı görevler

Dinamik kaynak aşırı tahsisini kullanmak için pod üzerinde koordinator.sh/qosClass: "BE" etiketini ayarlayın ve standart kaynak alanlarının yerine kubernetes.io/batch-cpu ile kubernetes.io/batch-memory kullanın.

Faturalama

ack-koordinator bileşenini yüklemek veya kullanmak için ücret alınmaz. Aşağıdaki hususlara dikkat edin:

  • ack-koordinator yönetilmeyen bir bileşendir. Yüklemeden sonra çalışan düğüm kaynaklarını tüketir. Yükleme sırasında modül başına kaynak isteklerini belirtin.

  • ack-koordinator, kaynak profilleme ve ince ayarlı zamanlama gibi özellikler için Prometheus ölçümlerini sunabilir. ack-koordinator için Prometheus ölçümlerini etkinleştirir ve Managed Service for Prometheus kullanırsanız bu ölçümler custom metrics olarak sayılır ve buna göre faturalandırılır. Etkinleştirmeden önce Managed Service for Prometheus için Billing konusunu inceleyin ve maliyetlerin nasıl hesaplandığını anlamak üzere Query the amount of observable data and bills bölümünü okuyun.

Ön koşullar

Başlamadan önce aşağıdakileri sağladığınızdan emin olun:

Dinamik kaynak aşırı tahsisini etkinleştirin

kube-system ad alanında bir ConfigMap oluşturarak veya güncelleyerek özelliği etkinleştirin ve yapılandırın.

Adım 1: ConfigMap'i oluşturun

Aşağıdaki içeriğe sahip configmap.yaml adlı bir dosya oluşturun:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ack-slo-config
  namespace: kube-system
data:
  # colocation-config controls dynamic Batch resource calculation and updates.
  # Related features: Dynamic resource overcommitment, load-aware scheduling.
  colocation-config: |
    {
      "enable": true,                        # Required: enables Batch resource updates. Setting to false resets reclaimed resources to 0.
      "metricAggregateDurationSeconds": 60,  # How often (seconds) node metrics are aggregated. Use the default value.
      "cpuReclaimThresholdPercent": 60,      # Reclaim threshold for batch-cpu, as a % of allocatable CPU. Default: 65.
      "memoryReclaimThresholdPercent": 70,   # Reclaim threshold for batch-memory, as a % of allocatable memory. Default: 65.
      "memoryCalculatePolicy": "usage"       # How batch-memory capacity is calculated: "usage" (default) or "request".
    }
Bu örnekteki cpuReclaimThresholdPercent ve memoryReclaimThresholdPercent değerleri (60 ve 70) örnek değerlerdir. Her iki parametre için varsayılan değerler 65'tir.

Aşağıdaki tabloda her parametre ayrıntılı olarak açıklanmaktadır:

Parametre Tür Varsayılan Açıklama
enable Boolean false Dinamik Batch kaynak güncellemelerini etkinleştirir. Bu değeri false olarak ayarlamak geri kazanılabilir kaynakları 0 değerine sıfırlar.
metricAggregateDurationSeconds Int 60 Sistemin Batch kaynak kapasitesini yeniden hesaplamak amacıyla düğüm ölçümlerini ne sıklıkla (saniye cinsinden) topladığını belirler. Varsayılan değeri kullanın.
cpuReclaimThresholdPercent Int 65 batch-cpu kaynakları için geri kazanım eşiği; ayrılabilir CPU'nun yüzdesi olarak ifade edilir. Bkz. Batch kaynak kapasitesini hesaplama.
memoryReclaimThresholdPercent Int 65 batch-memory kaynakları için geri kazanım eşiği; ayrılabilir belleğin yüzdesi olarak ifade edilir. Bkz. Batch kaynak kapasitesini hesaplama.
memoryCalculatePolicy String "usage" batch-memory kapasitesinin nasıl hesaplandığını belirler. "usage": ayrılmamış kaynakları ve ayrılmış ancak boşta kalan kaynakları (Guaranteed ve Burstable pod'larının gerçek kullanımına dayanarak) içerir. "request": yalnızca ayrılmamış kaynakları (Guaranteed ve Burstable pod'larının bellek isteklerine dayanarak) içerir.

Batch kaynak kapasitesini hesaplama

ack-koordinator, her düğümde mevcut Batch kaynak miktarını hesaplamak için aşağıdaki formülü uygular.

Kullanım tabanlı hesaplama (varsayılan, memoryCalculatePolicy: "usage"):

nodeBatchAllocatable = nodeAllocatable × thresholdPercent − podUsage(non-BE) − systemUsage

İstek tabanlı hesaplama (memoryCalculatePolicy: "request", yalnızca batch-memory için geçerlidir):

nodeBatchAllocatable = nodeAllocatable × thresholdPercent − podRequest(non-BE) − systemUsage

Burada:

Değişken Açıklama
nodeAllocatable Düğümdeki toplam ayrılabilir CPU veya bellek
thresholdPercent Yapılandırılan geri kazanım eşik yüzdesi
podUsage(non-BE) Guaranteed ve Burstable pod'larının gerçek kaynak kullanımı
podRequest(non-BE) Guaranteed ve Burstable pod'larının kaynak isteklerinin toplamı
systemUsage Düğümdeki sistem düzeyindeki kaynak tüketimi

Adım 2: ConfigMap'i uygulayın

ack-slo-config ConfigMap'inin kube-system ad alanında zaten var olup olmadığını kontrol edin:

  • Varsa, diğer ayarların üzerine yazmadan değişikliklerinizi birleştirmek için kubectl patch komutunu kullanın:

    kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"
  • Yoksa, oluşturun:

    kubectl apply -f configmap.yaml

Batch kaynakları için başvuru yapın

Dinamik kaynak aşırı tahsisini etkinleştirdikten sonra pod'ları Batch kaynakları isteyecek şekilde yapılandırın.

Önemli
  • Bir pod aynı anda hem Batch kaynaklarını hem de standart kaynakları isteyemez.

  • Deployment'lar veya diğer iş yükleri için etiketi iş yükü nesnesinin kendisine değil, template.metadata altına ekleyin.

  • ack-koordinator, gerçek zamanlı düğüm yüküne göre kullanılabilir Batch kapasitesini dinamik olarak ayarlar. Nadir durumlarda kubelet düğüm durumunu bildirmekte gecikebilir ve bu da pod'ların yetersiz kaynak nedeniyle zamanlanamamasına neden olabilir. Böyle bir durumda etkilenen pod'ları silin ve yeniden oluşturun.

  • Batch kaynak miktarları tamsayı olmalıdır. batch-cpu millicore birimini kullanır (1 çekirdek = 1000 millicore).

Adım 1: Düğümdeki mevcut Batch kaynaklarını kontrol edin

# Replace $nodeName with the actual node name.
kubectl get node $nodeName -o yaml

Çıktıda status.allocatable bölümünü arayın:

status:
  allocatable:
    # Unit: millicore. The following example shows 50 cores available.
    kubernetes.io/batch-cpu: 50000
    # Unit: bytes. The following example shows 50 GB available.
    kubernetes.io/batch-memory: 53687091200

Adım 2: Pod'u Batch kaynaklarını kullanacak şekilde yapılandırın

Pod meta verilerine koordinator.sh/qosClass: "BE" etiketini ekleyin ve konteynerin resources alanında kubernetes.io/batch-cpu ile kubernetes.io/batch-memory değerlerini ayarlayın:

metadata:
  labels:
    # Required: sets the pod's QoS class to BestEffort.
    koordinator.sh/qosClass: "BE"
spec:
  containers:
  - resources:
      requests:
        # Unit: millicore. "1k" = 1000 millicores = 1 core.
        kubernetes.io/batch-cpu: "1k"
        # Unit: bytes.
        kubernetes.io/batch-memory: "1Gi"
      limits:
        kubernetes.io/batch-cpu: "1k"
        kubernetes.io/batch-memory: "1Gi"

Örnek

Bu örnekte Batch kaynaklarını kullanan bir BestEffort test pod'u dağıtılır ve kaynak sınırlarının düğümün cgroup'unda uygulandığı doğrulanır.

  1. Düğümdeki mevcut Batch kaynaklarını kontrol edin:

    kubectl get node $nodeName -o yaml

    Beklenen çıktı:

    status:
      allocatable:
        kubernetes.io/batch-cpu: 50000
        kubernetes.io/batch-memory: 53687091200
  2. be-pod-demo.yaml adlı bir dosya oluşturun:

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

    kubectl apply -f be-pod-demo.yaml
  4. Kaynak sınırlarının düğümün cgroup'unda yansıtıldığını doğrulayın. CPU sınırını kontrol edin:

    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

    Beklenen çıktı (50 çekirdek):

    5000000

    Bellek sınırını kontrol edin:

    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

    Beklenen çıktı (10 GB):

    10737418240

Batch kaynak kullanımını izleyin

ACK kümeleri Managed Service for Prometheus ile entegredir. Batch kaynak kullanımını görüntülemek için:

  1. ACK console adresine gidin. Sol gezinme bölmesinde ACK consoleClusters seçeneğine tıklayın.

  2. Clusters sayfasında hedef kümenin adına tıklayın. Sol bölmede Operations > Prometheus Monitoring seçeneğini belirleyin.

  3. Others sekmesine tıklayın, ardından k8s-reclaimed-resource sekmesine tıklayın. Bu pano, küme karma gelirini ve küme, düğüm ve pod düzeylerinde kaynak kapasitesini gösterir. Daha fazla bilgi için bkz. Birlikte barındırma izleme özelliğini etkinleştirme.

Özel bir Prometheus panosu oluşturduysanız Batch kaynak verilerini sorgulamak için aşağıdaki ölçümleri kullanın:

# Allocatable batch-cpu on the node
koordlet_node_resource_allocatable{resource="kubernetes.io/batch-cpu",node="$node"}
# batch-cpu already allocated on the node
koordlet_container_resource_requests{resource="kubernetes.io/batch-cpu",node="$node"}
# Allocatable batch-memory on the node
kube_node_status_allocatable{resource="kubernetes.io/batch-memory",node="$node"}
# batch-memory already allocated on the node
koordlet_container_resource_requests{resource="kubernetes.io/batch-memory",node="$node"}

SSS

ack-slo-manager'dan ack-koordinator'a yükseltme yaptıktan sonra eski aşırı tahsis yapılandırması çalışmaya devam eder mi?

Evet. ack-koordinator, önceki ack-slo-manager protokolüyle geriye dönük uyumludur. ACK Pro küme zamanlayıcısı, hem eski hem de yeni protokol formatlarını kullanarak istenen ve mevcut kaynakları aynı anda hesaplayabilir; bu sayede mevcut iş yüklerini yeniden yapılandırmadan yükseltme yapabilirsiniz.

Önceki protokol şunları kullanır:

  • alibabacloud.com/qosClass pod ek açıklaması

  • Kaynak istekleri ve sınırları için alibabacloud.com/reclaimed alanı

ack-koordinator, bunları 30 Temmuz 2023 veya öncesi tarihli protokol sürümleri aracılığıyla destekler. Mevcut iş yüklerinizi uygun olduğunda koordinator.sh protokolüne geçirin.

Aşağıdaki tabloda bileşen sürümleri arasındaki uyumluluk gösterilmektedir:

Zamanlayıcı sürümü ack-koordinator alibabacloud.com protokolü koordinator.sh protokolü
≥1.18 ve <1.22.15-ack-2.0 ≥0.3.0 Desteklenir Desteklenmez
≥1.22.15-ack-2.0 ≥0.8.0 Desteklenir Desteklenir

Pod başladıktan hemen sonra bellek kullanımı neden ani artış gösterir?

Belirti: Bir konteyner başladıktan hemen sonra bellek kullanımı artar ve beklenen kubernetes.io/batch-memory sınırını aşar.

Neden: Bir konteyner oluşturulduğunda ack-koordinator, cgroup bellek sınırını kubernetes.io/batch-memory değerine göre ayarlar. Bazı uygulamalar, dahili olarak ne kadar bellek ayıracağını belirlemek için başlangıçta cgroup sınırını okur. Uygulama, ack-koordinator sınırı yazmadan önce cgroup'u okursa, olması gerekenden daha fazla bellek ayırabilir. İşletim sistemi bu belleği hemen geri kazanmaz; bu nedenle kullanım, yapılandırılan sınırın doğal olarak altına düşene kadar yüksek kalır.

Kontrol: Bellek sınırının doğru şekilde ayarlandığını doğrulamak için konteyner içinde aşağıdaki komutu çalıştırın:

# Unit: bytes
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# Expected output example
1048576000

Çözüm: Ana işlem başlamadan önce uygulamanın bellek sınırını başlangıç betiğinde yapılandırın. Bu, uygulama cgroup'u okumadan önce sınırın yerinde olmasını sağlar.

BestEffort pod'u neden Pending durumunda kalır?

Belirti: Batch kaynaklarıyla yapılandırılmış bir pod Pending durumunda kalır ve zamanlanamaz.

Kontrol: kubectl describe pod <pod-name> komutunu çalıştırın ve zamanlama başarısızlığı olaylarını arayın.

Yaygın nedenler ve çözümler:

Neden Çözüm
Tüm düğümlerde yetersiz Batch kaynağı kubectl get node <node> -o yaml komutunu çalıştırın ve status.allocatable altında batch-cpu ile batch-memory değerlerini kontrol edin. Pod isteklerini azaltın veya kaynakların geri kazanılmasını bekleyin.
kubelet henüz düğüm durumunu senkronize etmedi Pod'u silin ve yeniden oluşturun. ack-koordinator Batch kapasitesini dinamik olarak ayarlar ve kubelet güncellenmiş ayrılabilir kaynakları bildirmekte gecikebilir.
Pod hem Batch hem de standart kaynakları istiyor Bir pod aynı anda Batch kaynaklarını ve standart kaynakları isteyemez. Kaynak alanlarından bir seti kaldırın.

Sonraki adımlar

ack-koordinator, BestEffort pod'larının neden olduğu parazitlerden çevrimiçi iş yüklerini korumak için ek denetimler sağlar. Aşağıdaki konulara bakın: