Varsayılan olarak pod'lar düğümün gerçek yüküne göre değil, talep edilen kaynaklara göre zamanlanır. ACK yönetilen Pro kümesinde yük farkında zamanlamayı etkinleştirerek pod'ları daha düşük gerçek yüke sahip düğümlere yerleştirebilir, kullanım dengesini sağlayabilir ve tek bir aşırı yüklü düğüm nedeniyle oluşan düğüm arızası riskini azaltabilirsiniz.
Yük farkında zamanlama nasıl çalışır?
Yük farkında zamanlama, Container Service for Kubernetes (ACK) zamanlayıcısının Kubernetes Zamanlama Çerçevesi tabanlı olarak uyguladığı bir eklentidir. Yerel Kubernetes zamanlama ilkesi pod'ları öncelikli olarak kaynak tahsisine göre yerleştirir. Buna karşılık ACK zamanlayıcısı her düğümün gerçek kaynak yükünü tespit eder; geçmiş düğüm yük istatistiklerine başvurur, zamanlanacak pod'un yükünü tahmin eder ve ardından pod'u daha düşük yüke sahip bir düğüme yerleştirir. Bu sayede düğümler arasındaki yük dengelenir ve tek bir aşırı yüklü düğüm kaynaklı uygulama veya düğüm arızalarının önlenmesine yardımcı olunur.
Yük farkında zamanlama için hem kube-scheduler bileşeni hem de ack-koordinator eklentisi gereklidir. ack-koordinator eklentisi düğüm kaynak kullanımını toplar ve bildirir; ACK zamanlayıcısı ise bu veriyi kullanarak düğümleri puanlar ve sıralar, böylece daha düşük yüklü düğümler öncelikli olarak seçilir. Eklenti tasarımı hakkında ayrıntılı bilgi için bkz. ack-koordinator mimarisi.
Aşağıdaki şekilde Requested talep edilen kaynak miktarını; Usage ise gerçekten kullanılan kaynak miktarını gösterir. Yalnızca gerçekten kullanılan kaynaklar gerçek yük olarak kabul edilir. Düğüm koşulları aynı olduğunda ACK zamanlayıcısı yeni pod'u daha düşük yüke sahip olan B Düğümüne atar.

Düğüm kullanımı küme ortamı, iş yükü trafiği ve talep hacmi ile birlikte zaman içinde dinamik olarak değişir. Pod'lar zamanlandıktan sonra kümenin tekrar dengesiz hale gelme olasılığını azaltmak için ack-koordinator eklentisi yeniden zamanlama özelliği de sunar. Düğüm yüklerinin zaman içinde dengeli kalmasını sağlamak amacıyla yük farkında zamanlamayı düğüm yüklerini dengelemek için sıcak nokta odaklı yeniden zamanlamayı kullanma ile birlikte kullanın.
Düğüm yükü nasıl ölçülür?
Yük istatistiği ortalama ve yüzdelik değerler dahil olmak üzere çeşitli şekillerde toplanabilir. Varsayılan olarak ACK zamanlayıcısı son 5 dakikanın ortalamasını kullanır. Toplama türünü değiştirmek için loadAwareAggregatedUsageAggragationType parametresini ayarlayın. Ayrıntılar için bkz. Özel kube-scheduler parametreleri.
Bellek için kullanım verileri sayfa önbelleğini dışarıda bırakır çünkü işletim sistemi sayfa önbelleğini geri alabilir. kubectl top node komutu tarafından döndürülen kullanıma sayfa önbelleği dahildir. Bir düğümün gerçek bellek kullanımını görüntülemek için bkz. Managed Service for Prometheus'i yapılandırma.
Zamanlama ilkeleri
Yük farkında zamanlama aşağıdaki ilkeleri sağlar. Her iki ilke de önceki bölümde açıklanan toplanmış düğüm yük istatistiğini kullanır.
|
|
|
|
|
|
|
|
|
Ön koşullar
Küme türü — Yalnızca ACK yönetilen Pro kümesi desteklenir. Prosedür için bkz. ACK Pro kümesi oluşturma.
ack-koordinator eklentisi — ack-koordinator eklentisinin 1.1.1-ack.1 veya sonraki bir sürümünü yükleyin. Yükleme prosedürü için bkz. ack-koordinator (eski adıyla ack-slo-manager).
ACK zamanlayıcı sürümü — ACK zamanlayıcısı kümenizin Kubernetes sürümü için aşağıdaki tabloda listelenen sürüm gereksinimini karşılamalıdır.
|
|
|
|
|
|
|
|
|
|
|
|
Bu sürümler kube-scheduler parametreleri aracılığıyla yük farkında zamanlamayı yapılandırmak için gereklidir. Bazı önceki zamanlayıcı sürümleri yalnızca pod ek açıklamaları protokolünü destekler. Tam uyumluluk matrisi için SSS bölümüne bakın.
Faturalama
ack-koordinator eklentisini yüklemek veya kullanmak ücretsizdir. Ancak aşağıdaki senaryolarda maliyet oluşabilir:
Çalışan düğüm kaynakları — ack-koordinator yüklendikten sonra çalışan düğüm kaynaklarını tüketen yönetilmeyen bir eklentidir. Kaynak talepleri kurulum sırasında her modül için yapılandırılabilir.
Özel ölçümler — Varsayılan olarak ack-koordinator kaynak profilleme ve ince ayarlı zamanlama gibi özellikler için izleme ölçümlerini Prometheus biçiminde sunar. Enable Prometheus monitoring metrics for ack-koordinator seçeneğini belirler ve Managed Service for Prometheus kullanırsanız bu ölçümler özel ölçümler olarak faturalandırılır. Ücretler küme boyutu ve uygulama sayısı gibi faktörlere göre değişir. Bu özelliği etkinleştirmeden önce özel ölçümler için ücretsiz katmanı ve fiyatlandırmayı anlamak adına Prometheus örneklerinin faturalandırılması konusuna bakın. Kaynak kullanımınızı izlemek ve yönetmek için kullanım sorgulama hizmetini kullanın.
Adım 1: Yük farkında zamanlamayı etkinleştirme
ack-koordinator eklentisi ve ACK zamanlayıcısı Ön koşullar bölümünde açıklanan sürüm gereksinimlerini karşılamadığı sürece yük farkında zamanlama etkili olmaz.
ACK konsolu üzerinde oturum açın. Sol gezinme bölmesinde Clusters öğesine tıklayın.
Clusters sayfasında kümenizin adına tıklayın. Sol gezinme bölmesinde Components and Add-ons öğesine tıklayın.
kube-scheduler öğesini bulun ve Configuration öğesine tıklayın.
-
kube-scheduler parametreleri iletişim kutusunda aşağıdaki tabloda açıklanan parametreleri yapılandırın ve OK öğesine tıklayın.
Aşağıdaki tabloda yük farkında zamanlama için ana parametreler açıklanmaktadır. Eksiksiz parametre ayarları referansı ve her parametrenin gerektirdiği eklenti sürümleri için bkz. kube-scheduler ve .
Parametre
Tür
Açıklama
Geçerli değerler
Varsayılan değer
ÖrnekloadAwareThreshold
Kaynak adıresourceNameve eşikthresholdiçeren bir liste.
Düğüm filtreleme ilkesi tarafından kullanılan ilgili kaynak türünün eşiği.resourceName:cpuvememorydesteklenir.threshold: [0,100].
Boş, bu düğüm filtrelemenin devre dışı olduğu anlamına gelir.resourceName: cpuvethreshold: 80loadAwareResourceWeight
Kaynak adıresourceNameve ağırlıkresourceWeightiçeren bir liste.
Düğüm puanlama ilkesi tarafından kullanılan ilgili kaynak türünün puanlama ağırlığı. Specifies whether to enable load-aware node scoring during pod scheduling seçeneğini belirlemeniz gerekir.resourceName: yalnızcacpuvememorydesteklenir.resourceWeight: [1,100] aralığında bir tamsayı.cpu: 1vememory: 1resourceName: cpuveresourceWeight: 1loadAwareAggregatedUsageAggragationType
enum
Yük istatistiğinin toplama türü.avg: ortalama değer.p50: medyan olan 50. yüzdelik dilim.p90,p95vep99: 90., 95. ve 99. yüzdelik dilimler.avg,p50,p90,p95vep99avgp90ÖnemliKümedeki düğümler için otomatik düğüm ölçeklendirme zaten etkinse yük farkında filtreleme eşiği beklenmeyen ölçek genişletme veya daraltmaya neden olabilir. Bunun nedeni otomatik düğüm ölçeklendirmenin pod'ların beklemede olup olmamasına göre ölçek genişletmesi ve kümenin tahsis seviyesine göre ölçek daraltması yapmasıdır. Otomatik düğüm ölçeklendirmeyi yük farkında düğüm filtreleme ile birlikte kullanmak için Otomatik düğüm ölçeklendirmeyi etkinleştirme bölümünde açıklandığı gibi yapılandırmayı kümenizin kapasitesi ve kullanımına uygun şekilde ayarlayın.
Sol gezinme bölmesinde Cluster Information öğesine tıklayın. Görüntülenen sayfada Basic Information sekmesine tıklayın ve küme Running durumuna geçene kadar bekleyin; bu durum yük farkında zamanlamanın etkin olduğunu gösterir.
Adım 2: Yük farkında zamanlamayı doğrulama
Aşağıdaki örnekte her biri 4 çekirdek ve 16 GiB belleğe sahip üç düğümden oluşan bir küme kullanılmaktadır. Örnek önce düğümler arasındaki yükleri dengesiz hale getirir ve ardından yeni pod'ların nereye zamanlandığını kontrol eder.
-
Aşağıdaki içeriğe sahip stress-demo.yaml adlı bir dosya oluşturun.
apiVersion: apps/v1 kind: Deployment metadata: name: stress-demo namespace: default labels: app: stress-demo spec: replicas: 1 selector: matchLabels: app: stress-demo template: metadata: name: stress-demo labels: app: stress-demo spec: containers: - args: - '--vm' - '2' - '--vm-bytes' - '1600M' - '-c' - '2' - '--vm-hang' - '2' command: - stress image: polinux/stress imagePullPolicy: Always name: stress resources: limits: cpu: '2' memory: 4Gi requests: cpu: '2' memory: 4Gi restartPolicy: Always -
Pod'u oluşturmak için aşağıdaki kubectl komutunu çalıştırın. Pod barındırıldığı düğümün yükünü artırır.
kubectl create -f stress-demo.yamldeployment.apps/stress-demo created -
Pod çalışana kadar pod durumunu kontrol etmek için aşağıdaki kubectl komutunu çalıştırın.
kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES stress-demo-7fdd89cc6b-g**** 1/1 Running 0 82s 10.XX.XX.112 cn-beijing.10.XX.XX.112 <none> <none>stress-demo-7fdd89cc6b-g****pod'ucn-beijing.10.XX.XX.112düğümüne zamanlanır. Pod'un başlatmayı tamamlaması ve düğüm yükünün artması için yaklaşık 3 dakika bekleyin. -
Her düğümün yükünü kontrol etmek için aşağıdaki kubectl komutunu çalıştırın.
kubectl top nodeNAME CPU(cores) CPU% MEMORY(bytes) MEMORY% cn-beijing.10.XX.XX.110 92m 2% 1158Mi 9% cn-beijing.10.XX.XX.111 77m 1% 1162Mi 9% cn-beijing.10.XX.XX.112 2105m 53% 3594Mi 28%cn-beijing.10.XX.XX.111en düşük yüke sahiptir vecn-beijing.10.XX.XX.112düğümü en yüksek yüke sahiptir. Kümedeki düğümler arasındaki yükler artık dengesizdir. -
Aşağıdaki içeriğe sahip nginx-with-loadaware.yaml adlı bir dosya oluşturun.
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-with-loadaware namespace: default labels: app: nginx spec: replicas: 6 selector: matchLabels: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx resources: limits: cpu: 500m requests: cpu: 500m -
Pod'ları oluşturmak için aşağıdaki kubectl komutunu çalıştırın.
kubectl create -f nginx-with-loadaware.yamldeployment/nginx-with-loadawre created -
Pod zamanlama ayrıntılarını görüntülemek için aşağıdaki kubectl komutunu çalıştırın.
kubectl get pods | grep nginxnginx-with-loadaware-5646666d56-2**** 1/1 Running 0 18s 10.XX.XX.118 cn-beijing.10.XX.XX.110 <none> <none> nginx-with-loadaware-5646666d56-7**** 1/1 Running 0 18s 10.XX.XX.115 cn-beijing.10.XX.XX.110 <none> <none> nginx-with-loadaware-5646666d56-k**** 1/1 Running 0 18s 10.XX.XX.119 cn-beijing.10.XX.XX.110 <none> <none> nginx-with-loadaware-5646666d56-q**** 1/1 Running 0 18s 10.XX.XX.113 cn-beijing.10.XX.XX.111 <none> <none> nginx-with-loadaware-5646666d56-s**** 1/1 Running 0 18s 10.XX.XX.120 cn-beijing.10.XX.XX.111 <none> <none> nginx-with-loadaware-5646666d56-z**** 1/1 Running 0 18s 10.XX.XX.116 cn-beijing.10.XX.XX.111 <none> <none>Beklenen çıktı yük farkında zamanlama etkinleştirildikten sonra zamanlayıcının düğüm yüklerini algıladığını ve pod'ları öncelikli olarak cn-beijing.10.XX.XX.112 dışındaki düğümlere zamanlamak için zamanlama stratejisini kullandığını gösterir.
SSS
Yeni oluşturulan bir pod yığınındaki tüm pod'lar neden en düşük yüklü düğüme zamanlanmaz?
Yeni pod'lar başladıktan sonra düğümün yükünü artırır. Zamanlayıcı yeni pod yığınının tamamını şu anda en düşük yüke sahip olan düğüme yerleştirirse bu düğüm hızla bir yük sıcak noktası haline gelebilir.
Bu nedenle yük farkında zamanlama eklentisi düğümleri puanlarken kullanımı henüz bildirilmemiş yeni pod'lara ev sahipliği yapan bir düğümün puanını ayarlar. Bu aşırı zamanlamanın yeni bir sıcak nokta oluşturmasını engeller.
Düğüm yüküne ek olarak zamanlama sonucunu etkileyen başka faktörler var mı?
Kubernetes zamanlayıcısı birden çok eklentiden oluşur ve bunların çoğu zamanlama sırasında düğüm puanlamasına katkıda bulunur; örneğin yakınlık eklentisi ve topoloji yayılımı eklentisi. Nihai düğüm sıralaması tüm bu eklentileri yansıtır ve her eklentinin puanlama ağırlığını gerektiği gibi ayarlayabilirsiniz.
Zamanlayıcı yeni bir sürüme yükseltildikten sonra yük farkında zamanlama önceki protokol üzerinden çalışmaya devam eder mi?
Cevap kümenin Kubernetes sürümüne bağlıdır. 1.22 sürümünde ACK zamanlayıcısı önceki protokolle uyumlu kalır. 1.24 sürümü için uyumluluk dönemi 30 Ağustos 2023'te sona ermiştir. 1.26 ve sonraki sürümlerde pod ek açıklamaları protokolü desteklenmez.
Önceki protokolü hala destekleyen bir sürümde pod'a alibabacloud.com/loadAwareScheduleEnabled: "true" ek açıklamasını ekleyin. ACK zamanlayıcısı önceki protokolle uyumlu olduğundan zamanlayıcıyı yeni sürüme sorunsuz bir şekilde yükseltebilirsiniz. Yükseltmeden sonra pod yapılandırmalarında gereken değişiklikleri azaltmak için kümeye genel yük dengeleme zamanlama ilkesini etkinleştirmek üzere Özel kube-scheduler parametreleri bölümündeki adımları izleyin.
Kümeyi daha yeni bir sürüme yükseltin ve yük farkında zamanlama için yeni yapılandırma yöntemini kullanın. Daha fazla bilgi için bkz. kümeyi manuel olarak yükseltme.
Aşağıdaki tablolar her sürüm için protokol desteğini ve eklenti sürümü gereksinimlerini açıklamaktadır:
1.26 ve sonrası
|
|
|
|
|
|
|
|
|
|
1.24
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|