Ç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:
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 |
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:
Bir ACK Pro kümesi. Daha fazla bilgi için bkz. ACK Pro kümesi oluşturma.
Sürümü 0.8.0 veya üzeri olan ack-koordinator bileşeni yüklü olmalıdır. Daha fazla bilgi için bkz. ack-koordinator.
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 örnektekicpuReclaimThresholdPercentvememoryReclaimThresholdPercentdeğ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 patchkomutunu 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.
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.metadataaltı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.
-
Düğümdeki mevcut Batch kaynaklarını kontrol edin:
kubectl get node $nodeName -o yamlBeklenen çıktı:
status: allocatable: kubernetes.io/batch-cpu: 50000 kubernetes.io/batch-memory: 53687091200 -
be-pod-demo.yamladlı 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 -
Pod'u dağıtın:
kubectl apply -f be-pod-demo.yaml -
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_usBeklenen çıktı (50 çekirdek):
5000000Bellek 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_bytesBeklenen çı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:
ACK console adresine gidin. Sol gezinme bölmesinde ACK consoleClusters seçeneğine tıklayın.
Clusters sayfasında hedef kümenin adına tıklayın. Sol bölmede Operations > Prometheus Monitoring seçeneğini belirleyin.
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/qosClasspod ek açıklamasıKaynak istekleri ve sınırları için
alibabacloud.com/reclaimedalanı
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: