Düğüm taint'leri, yakınlık kuralları veya yük profilleri değiştiğinde pod'ların otomatik olarak tahliye edilmesini ve yeniden dengelenmesini sağlamak için Koordinator Descheduler'ı etkinleştirin.
Aşağıdaki yordamda örnek olarak RemovePodsViolatingNodeTaints eklentisi kullanılmıştır.
Önkoşullar
Aşağıdakileri yaptığınızdan emin olun:
Bir ACK yönetilen Pro kümesi oluşturun.
kubectl aracını kümeye bağlayın.
Sanal düğümlerde descheduling desteklenmez.
Kullanım notları
Koordinator Descheduler yalnızca pod'ları tahliye eder; yeniden oluşturmaz. Tahliye edilen pod'lar iş yükü denetleyicisi (Deployment veya StatefulSet gibi) tarafından yeniden oluşturulur ve standart zamanlayıcı bunları uygun düğümlere yerleştirir.
Yeni pod'lar oluşturulmadan önce eski pod'lar tahliye edilir. Tahliye sırasında kullanılabilirliği korumak için uygulamanızın yeterli sayıda
replicas(çoğaltma) içerdiğinden emin olun.ack-descheduler kullanımdan kaldırılmıştır. Hala kullanıyorsanız bkz. ack-descheduler'dan Koordinator Descheduler'a nasıl geçiş yapılır?
Bir descheduling eklentisi seçin
Senaryonuz için uygun bir eklenti seçin:
| Senaryo | Eklenti | İlke türü |
|---|---|---|
Pod'lar, zamanlamadan sonra NoSchedule taint'i edinmiş düğümlerde kalır |
RemovePodsViolatingNodeTaints |
Deschedule |
| Pod'lar podlar arası anti-yakınlık kurallarını ihlal eder | RemovePodsViolatingInterPodAntiAffinity |
Deschedule |
| Pod'lar artık düğüm yakınlığı kurallarını karşılamaz | RemovePodsViolatingNodeAffinity |
Deschedule |
| Pod'lar çok sık yeniden başlar | RemovePodsHavingTooManyRestarts |
Deschedule |
| Pod'lar yaşam süresi sınırını aşmıştır | PodLifeTime |
Deschedule |
| Pod'lar Başarısız (Failed) durumundadır | RemoveFailedPod |
Deschedule |
| Çoğaltılmış pod'lar düğümler arasında eşit dağılmamıştır | RemoveDuplicates |
Balance |
| Düğümler kaynak tahsisine göre eşit olmayan şekilde kullanılmaktadır | LowNodeUtilization |
Balance |
| Pod'lar topoloji yayılım kısıtlamalarını ihlal eder | RemovePodsViolatingTopologySpreadConstraint |
Balance |
| Düğümler gerçek kaynak kullanımına göre aşırı yüklenmiştir | LowNodeLoad |
Balance |
Aşağıdaki örneklerde RemovePodsViolatingNodeTaints kullanılır. Başlamadan önce descheduling kavramlarını ve Koordinator Descheduler ile Kubernetes Descheduler arasındaki farkları okuyun.
Nasıl çalışır?
RemovePodsViolatingNodeTaints eklentisi, yapılandırılan aralıklarla her düğümü NoSchedule taint'leri açısından denetler. Çalışan bir pod, düğümün NoSchedule taint'ine yönelik bir tolerans içermiyorsa eklenti bu pod'u tahliye eder. İş yükü denetleyicisi pod'u yeniden oluşturur ve zamanlayıcı onu toleranslı bir düğüme yerleştirir.
Belirli taint'leri muaf tutmak için excludedTaints parametresini kullanın. Bir taint'in anahtarı veya key=value çifti excludedTaints listesindeki bir girişle eşleşirse eklenti bu taint'i yoksayar.
Örnek senaryo:
Üç düğümlü bir kümede, her düğümde bir pod çalıştıran bir Deployment bulunur. Yönetici, dağıtımdan sonra iki düğüme NoSchedule taint'leri ekler:
A Düğümüne
deschedule=not-allow:NoScheduletaint'i eklenir.deschedule=not-allowdeğeriexcludedTaintslistesinde bulunduğundan bu taint yoksayılır ve pod çalışmaya devam eder.B Düğümüne
deschedule=allow:NoScheduletaint'i eklenir. Bu taint hariç tutulmadığından pod tahliye edilir veNoScheduletaint'i olmayan C Düğümüne yeniden zamanlanır.
1. Adım: ack-koordinator'ı yükleyin ve descheduling'i etkinleştirin
ack-koordinator zaten yüklüyse sürümün 1.2.0-ack.2 veya üzeri olduğundan emin olun.
ACK konsoluna oturum açın. Sol gezinme bölmesinde Clusters öğesini tıklayın.
Clusters sayfasında hedef kümenin adını tıklayın. Sol gezinme bölmesinde Add-ons öğesini tıklayın.
ack-koordinator bileşenini bulun ve Install seçeneğini tıklayın.
Kurulum iletişim kutusunda Enable Descheduler for ACK-Koordinator seçeneğini işaretleyin ve kurulumu tamamlayın.
Koordinator Descheduler, küme düğümlerinde bir Deployment olarak dağıtılır.
2. Adım: RemovePodsViolatingNodeTaints eklentisini etkinleştirin
Eklentiyi yapılandırın
koord-descheduler-config.yaml adlı bir dosya oluşturun. Bu ConfigMap, RemovePodsViolatingNodeTaints eklentisini etkinleştirir ve deschedule=not-allow taint'ini hariç tutar.
# koord-descheduler-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: koord-descheduler-config
namespace: kube-system
data:
koord-descheduler-config: |
# Do not modify the following system configuration of koord-desheduler.
apiVersion: descheduler/v1alpha2
kind: DeschedulerConfiguration
leaderElection:
resourceLock: leases
resourceName: koord-descheduler
resourceNamespace: kube-system
deschedulingInterval: 120s # The interval at which the descheduler runs. Set to 120 seconds here.
dryRun: false # The global read-only mode. After you enable this mode, koord-descheduler does not perform any operations.
# The preceding configuration is the system configuration.
profiles:
- name: koord-descheduler
plugins:
deschedule:
enabled:
- name: RemovePodsViolatingNodeTaints # Enable the node taint verification plug-in.
pluginConfig:
- name: RemovePodsViolatingNodeTaints # Configure the node taint verification plug-in.
args:
excludedTaints:
- deschedule=not-allow # Ignore nodes whose taint key is deschedule and taint value is not-allow.
# Required for RemovePodsViolatingNodeTaints to take effect. Do not remove.
- name: MigrationController # Configure the migration controller.
args:
apiVersion: descheduler/v1alpha2
kind: MigrationControllerArgs
defaultJobMode: EvictDirectly
RemovePodsViolatingNodeTaints parametreleri:
| Parametre | Tür | Varsayılan | Açıklama |
|---|---|---|---|
excludedTaints |
list(string) | — | Yoksayılacak taint anahtarları veya key=value çiftleri. Bu taint'lere sahip düğümlerdeki pod'lar tahliye edilmez. |
includePreferNoSchedule |
bool | false | true olduğunda yalnızca NoSchedule değil, PreferNoSchedule etkili taint'leri de denetler. |
namespaces.include |
list(string) | — | Descheduling işlemini belirli ad alanlarıyla sınırlar. namespaces.exclude ile birlikte kullanılamaz. |
namespaces.exclude |
list(string) | — | Belirli ad alanlarında descheduling işlemini atlar. namespaces.include ile birlikte kullanılamaz. |
labelSelector |
map | — | Descheduling işlemini belirtilen etiketlerle eşleşen pod'larla sınırlar. |
Yapılandırmayı uygulayın
-
ConfigMap'i kümeye uygulayın:
kubectl apply -f koord-descheduler-config.yaml -
Yeni yapılandırmayı yüklemek için Koordinator Descheduler'ı yeniden başlatın:
kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 0 # Expected output: # deployment.apps/ack-koord-descheduler scaled kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 1 # Expected output: # deployment.apps/ack-koord-descheduler scaled
Gelişmiş parametreleri yapılandırın
Genel davranışı ve şablon ayarlarını bir ConfigMap ile yapılandırın.
Gelişmiş yapılandırma örneği
Bu ConfigMap, genel ayarlar için DeschedulerConfiguration kullanır, descheduling ilkesi olarak RemovePodsViolatingNodeTaints eklentisini etkinleştirir ve tahliye edici olarak MigrationController kullanır.
# koord-descheduler-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: koord-descheduler-config
namespace: kube-system
data:
koord-descheduler-config: |
# Do not modify the following system configuration of koord-desheduler.
apiVersion: descheduler/v1alpha2
kind: DeschedulerConfiguration
leaderElection:
resourceLock: leases
resourceName: koord-descheduler
resourceNamespace: kube-system
dryRun: false # The global read-only mode. After you enable this mode, koord-descheduler does not perform any operations.
deschedulingInterval: 120s # The interval at which the descheduler runs. The interval is set to 120 seconds in this example.
nodeSelector: # The nodes that are involved in descheduling. By default, all nodes are descheduled.
matchLabels:
alibabacloud.com/nodepool-id: nodepool-1 # Configure it based on your requirements.
maxNoOfPodsToEvictPerNode: 10 # The maximum number of pods that can be evicted from a node. The limit takes effect on a global scale. By default, no limit is configured.
maxNoOfPodsToEvictPerNamespace: 10 # The maximum number of pods that can be evicted from a namespace. The limit takes effect on a global scale. By default, no limit is configured.
# The preceding configuration is the system configuration.
# The template list.
profiles:
- name: koord-descheduler # The name of the template.
# Scope: apply this template only to the specified nodes.
# Method 1: Select nodes in one node pool.
nodeSelector:
matchLabels:
alibabacloud.com/nodepool-id: nodepool-1 # Configure it based on your requirements
# Method 2: Select nodes in multiple node pools.
# nodeSelector:
# matchExpressions:
# - key: alibabacloud.com/nodepool-id
# operator: In
# values:
# - nodepool-1
# - nodepool-2
plugins:
deschedule: # All plug-ins are disabled by default. Specify the ones to enable.
enabled:
- name: RemovePodsViolatingNodeTaints # Enable the node taint verification plug-in.
balance: # All plug-ins are disabled by default.
disabled:
- name: "*" # Disable all Balance plug-ins.
evict:
enabled:
- name: MigrationController # MigrationController is enabled by default.
filter:
enabled:
- name: MigrationController # Use MigrationController's filtering policy by default.
pluginConfig:
- name: RemovePodsViolatingNodeTaints
args:
excludedTaints:
- deschedule=not-allow # Ignore nodes whose taint key is deschedule and taint value is not-allow.
- reserved # Ignore nodes whose taint key is reserved.
includePreferNoSchedule: false # When false, only checks NoSchedule taints.
namespaces:
include: # Restrict descheduling to these namespaces.
- "namespace1"
- "namespace2"
# exclude: # Alternatively, exclude these namespaces.
# - "namespace1"
# - "namespace2"
labelSelector: # Only deschedule pods matching these labels.
accelerator: nvidia-tesla-p100
- name: MigrationController
args:
apiVersion: descheduler/v1alpha2
kind: MigrationControllerArgs
defaultJobMode: EvictDirectly
evictLocalStoragePods: false # When false, pods using emptyDir or hostPath are not descheduled.
maxMigratingPerNode: 1 # Maximum pods migrated simultaneously on a node.
maxMigratingPerNamespace: 1 # Maximum pods migrated simultaneously in a namespace.
maxMigratingPerWorkload: 1 # Maximum pods migrated simultaneously in a workload.
maxUnavailablePerWorkload: 2 # Maximum unavailable replicated pods allowed in a workload.
objectLimiters:
workload: # Throttle workload-level migration. Default: only 1 pod per workload within 5 minutes.
duration: 5m
maxMigrating: 1
evictionPolicy: Eviction # Use the Eviction API by default.
Sistem yapılandırmaları
DeschedulerConfiguration içinde genel, sistem düzeyindeki davranışı yapılandırın.
| Parametre | Tür | Geçerli değer | Açıklama | Örnek |
|---|---|---|---|---|
dryRun |
boolean | true / false (varsayılan: false) | Salt okunur mod. Etkinleştirildiğinde hiçbir pod taşınmaz. | false |
deschedulingInterval |
time.Duration | >0s | Descheduler'ın ne sıklıkla çalıştığı. | 120s |
nodeSelector |
Structure | — | Descheduling için uygun olan düğümleri sınırlar. matchLabels (tek düğüm havuzu) veya matchExpressions (birden çok düğüm havuzu) kabul eder. Bkz. Kubernetes labelSelector. |
Yukarıdaki örnek YAML'ye bakın |
maxNoOfPodsToEvictPerNode |
int | ≥0 (varsayılan: 0) | Her descheduling döngüsünde tek bir düğümden tahliye edilebilecek maksimum pod sayısı. 0, sınır yok anlamına gelir. | 10 |
maxNoOfPodsToEvictPerNamespace |
int | ≥0 (varsayılan: 0) | Her descheduling döngüsünde tek bir ad alanından tahliye edilebilecek maksimum pod sayısı. 0, sınır yok anlamına gelir. | 10 |
Şablon yapılandırmaları
Her şablon (profiles), aşağıdaki alanlarla descheduling ilkelerini ve tahliye edicileri gruplar:
name: Şablon tanımlayıcısı.plugins: Descheduling ilkelerini (deschedule,balance), tahliye edicileri (evict) ve tahliye öncesi filtreleri (filter) etkinleştirir veya devre dışı bırakır.pluginConfig: Eklenti başına bağımsız değişkenler.namealanını eklenti adıyla eşleştirin veargsalanını yapılandırın. Bkz. İlke eklentilerini yapılandırma ve Tahliye edici eklentilerini yapılandırma.nodeSelector: Şablonu belirli düğümlerle sınırlar. Ayarlanmazsa tüm düğümlere uygulanır.
Şablon düzeyindeki nodeSelector için ack-koordinator v1.6.1-ack.1.16 veya sonraki bir sürüm gerekir.
plugins alanı referansı:
| Alan | Desteklenen eklentiler | Açıklama |
|---|---|---|
deschedule |
RemovePodsViolatingNodeTaints, RemovePodsViolatingInterPodAntiAffinity, RemovePodsViolatingNodeAffinity, RemovePodsHavingTooManyRestarts, PodLifeTime, RemoveFailedPod |
Tümü varsayılan olarak devre dışıdır. Etkinleştirmek istediğiniz eklentileri belirtin. |
balance |
RemoveDuplicates, LowNodeUtilization, HighNodeUtilization, RemovePodsViolatingTopologySpreadConstraint, LowNodeLoad |
Tümü varsayılan olarak devre dışıdır. Etkinleştirmek istediğiniz eklentileri belirtin. |
evict |
MigrationController, DefaultEvictor |
Pod tahliye edicisi. MigrationController varsayılan olarak etkindir. Birden fazla evict eklentisini aynı anda etkinleştirmeyin. |
filter |
MigrationController, DefaultEvictor |
Tahliye öncesi filtreleme ilkesi. MigrationController varsayılan olarak etkindir. Birden fazla filter eklentisini aynı anda etkinleştirmeyin. |
İlke eklentilerini yapılandırın
Koordinator Descheduler, Kubernetes Descheduler'dan altı Deschedule ve beş Balance eklentisini destekler. LowNodeLoad Koordinator tarafından sağlanır. Bkz. Yük bilinçli hotspot descheduling ile çalışma.
| İlke türü | Eklenti | Açıklama |
|---|---|---|
| Deschedule | RemovePodsViolatingInterPodAntiAffinity | Podlar arası anti-yakınlık kurallarını ihlal eden pod'ları tahliye eder. |
| Deschedule | RemovePodsViolatingNodeAffinity | Artık düğüm yakınlığı kurallarını karşılamayan pod'ları tahliye eder. |
| Deschedule | RemovePodsViolatingNodeTaints | Düğüm taint'lerine tolerans gösteremeyen pod'ları tahliye eder. |
| Deschedule | RemovePodsHavingTooManyRestarts | Çok sık yeniden başlayan pod'ları tahliye eder. |
| Deschedule | PodLifeTime | Yaşam süresi (TTL) dolan pod'ları tahliye eder. |
| Deschedule | RemoveFailedPod | Başarısız (Failed) durumdaki pod'ları tahliye eder. |
| Balance | RemoveDuplicates | Çoğaltılmış pod'ları düğümler arasında eşit şekilde yayar. |
| Balance | LowNodeUtilization | Pod'ları düğüm kaynak tahsisine göre yeniden dağıtır. |
| Balance | HighNodeUtilization | Az kullanılan düğümlerden pod'ları daha yoğun kullanılan düğümlere konsolide eder. |
| Balance | RemovePodsViolatingTopologySpreadConstraint | Topoloji yayılım kısıtlamalarını ihlal eden pod'ları tahliye eder. |
Tahliye edici eklentilerini yapılandırın
Koordinator Descheduler iki tahliye edici eklentiyi destekler: DefaultEvictor ve MigrationController.
MigrationController
MigrationController taşıma işleri aracılığıyla ayrıntılı tahliye kontrolü ve gözlemlenebilirlik sağlar.
| Parametre | Tür | Geçerli değer | Açıklama | Örnek |
|---|---|---|---|---|
evictLocalStoragePods |
boolean | true / false (varsayılan: false) | false olduğunda emptyDir veya hostPath kullanan pod'lar descheduling kapsamına alınmaz. |
false |
maxMigratingPerNode |
int64 | ≥0 (varsayılan: 2) | Bir düğümde aynı anda taşınabilecek maksimum pod sayısı. 0, sınır yok anlamına gelir. | 2 |
maxMigratingPerNamespace |
int64 | ≥0 (varsayılan: 0) | Bir ad alanında aynı anda taşınabilecek maksimum pod sayısı. 0, sınır yok anlamına gelir. | 1 |
maxMigratingPerWorkload |
intOrString | ≥0 (varsayılan: %10) | Bir iş yükünde aynı anda taşınabilecek maksimum pod sayısı veya yüzdesi. 0, sınır yok anlamına gelir. Bir iş yükünde yalnızca bir pod varsa descheduling dışında bırakılır. | 1 veya %10 |
maxUnavailablePerWorkload |
intOrString | ≥0 ve çoğaltma sayısından küçük (varsayılan: %10) | Bir iş yükünde izin verilen maksimum kullanılamayan çoğaltılmış pod sayısı. 0, sınır yok anlamına gelir. | 1 veya %10 |
objectLimiters.workload |
Structure | Duration >0 (varsayılan: 5m); MaxMigrating ≥0 (varsayılan: %10) |
Belirli bir zaman penceresi içinde iş yükü düzeyindeki taşımayı kısıtlar. Duration pencere uzunluğunu belirler. MaxMigrating bu pencere içinde taşınabilecek maksimum pod sayısını belirler. |
duration: 5mmaxMigrating: 1 |
evictionPolicy |
string | Eviction (varsayılan), Delete, Soft |
Pod'ların nasıl tahliye edileceğini kontrol eder. Eviction: Zarif tahliye için Eviction API'sini çağırır. Delete: Delete API'sini çağırır. Soft: Özel downstream işleme için scheduling.koordinator.sh/soft-eviction açıklamasını ekler. |
Eviction |
DefaultEvictor
DefaultEvictor standart Kubernetes Descheduler tahliye edicisidir. Yapılandırma için bkz. DefaultEvictor.
MigrationController ile DefaultEvictor karşılaştırması
| Yetenek | DefaultEvictor | MigrationController |
|---|---|---|
| Tahliye yöntemleri | Yalnızca Eviction API | Eviction API, Delete API veya Soft açıklaması |
| Düğüm başına tahliye limiti | Desteklenir | Desteklenir |
| Ad alanı başına tahliye limiti | Desteklenir | Desteklenir |
| İş yükü başına tahliye limiti | Desteklenmez | Desteklenir |
| İş yükü başına kullanılamazlık limiti | Desteklenmez | Desteklenir |
| Tahliye kısıtlaması | Desteklenmez | İş yükü başına zaman penceresi tabanlı kısıtlama |
| Tahliye gözlemlenebilirliği | Yalnızca bileşen günlükleri | Bileşen günlükleri ve pod başına taşıma durumu içeren Kubernetes olayları |
Sonraki adımlar
Descheduling — kavramlar, özellikler ve iş akışı.
Topluluk Kubernetes Descheduler'ı mı kullanıyorsunuz? Farklar ve geçiş için bkz. Koordinator Descheduler ve Kubernetes Descheduler.
LowNodeLoadile yük bilinçli descheduling'i yapılandırın: Yük bilinçli hotspot descheduling ile çalışma.Küme kaynak kullanımını analiz edin ve maliyet tasarrufu önerileri alın: Cost Insight.
Sorun giderme: Zamanlama SSS.
Sürüm notları ve bileşen genel bakışı: ack-koordinator (ack-slo-manager).