Activez Koordinator Descheduler pour expulser et rééquilibrer automatiquement les pods lorsque les taints de nœud, les règles d'affinité ou les profils de charge évoluent.
La procédure suivante utilise le plug-in RemovePodsViolatingNodeTaints à titre d'exemple.
Prérequis
Assurez-vous que :
Un cluster ACK managé Pro est créé.
kubectl est connecté au cluster.
Le désordonnancement n'est pas pris en charge sur les nœuds virtuels.
Remarques d'utilisation
Koordinator Descheduler se contente d'expulser les pods ; il ne les recrée pas. Le contrôleur de charge de travail (tel qu'un Deployment ou un StatefulSet) recrée les pods expulsés, et l'ordonnanceur standard les place.
Les anciens pods sont expulsés avant la création des nouveaux. Vérifiez que votre application dispose d'un nombre suffisant de
replicaspour maintenir la disponibilité pendant l'expulsion.ack-descheduler est obsolète. Si vous l'utilisez toujours, consultez la rubrique Comment migrer de ack-descheduler vers Koordinator Descheduler ?
Choisir un plug-in de désordonnancement
Sélectionnez un plug-in adapté à votre scénario :
| Scénario | Plug-in | Type de politique |
|---|---|---|
Les pods restent sur des nœuds ayant acquis un taint NoSchedule après l'ordonnancement |
RemovePodsViolatingNodeTaints |
Désordonnancement |
| Les pods enfreignent les règles d'anti-affinité inter-pods | RemovePodsViolatingInterPodAntiAffinity |
Désordonnancement |
| Les pods ne satisfont plus aux règles d'affinité de nœud | RemovePodsViolatingNodeAffinity |
Désordonnancement |
| Les pods redémarrent trop fréquemment | RemovePodsHavingTooManyRestarts |
Désordonnancement |
| Les pods ont dépassé leur durée de vie | PodLifeTime |
Désordonnancement |
| Les pods sont dans l'état Failed | RemoveFailedPod |
Désordonnancement |
| Les pods répliqués sont répartis de manière inégale entre les nœuds | RemoveDuplicates |
Équilibrage |
| L'allocation des ressources entraîne une utilisation inégale des nœuds | LowNodeUtilization |
Équilibrage |
| Les pods enfreignent les contraintes de répartition topologique | RemovePodsViolatingTopologySpreadConstraint |
Équilibrage |
| La consommation réelle des ressources surcharge les nœuds | LowNodeLoad |
Équilibrage |
Les exemples ci-dessous s'appuient sur RemovePodsViolatingNodeTaints. Avant de commencer, familiarisez-vous avec les concepts du désordonnancement et les différences entre Koordinator Descheduler et Kubernetes Descheduler.
Fonctionnement
À l'intervalle configuré, RemovePodsViolatingNodeTaints inspecte chaque nœud à la recherche de taints NoSchedule . Si un pod en cours d'exécution ne tolère pas le taint NoSchedule d'un nœud, le plug-in l'expulse. Le contrôleur de charge de travail recrée ensuite le pod, et l'ordonnanceur le place sur un nœud compatible.
Utilisez excludedTaints pour exempter certains taints. Lorsqu'une clé de taint ou une paire key=value correspond à une entrée de excludedTaints, le plug-in l'ignore.
Exemple de scénario :
Un cluster de trois nœuds exécute un Deployment avec un pod par nœud. Un administrateur ajoute des taints NoSchedule à deux nœuds après le déploiement :
Le nœud A reçoit
deschedule=not-allow:NoSchedule. Commedeschedule=not-allowfigure dansexcludedTaints, ce taint est ignoré et le pod reste en place.Le nœud B reçoit
deschedule=allow:NoSchedule. Ce taint n'est pas exclu : le pod est expulsé puis replacé sur le nœud C (qui ne porte aucun taintNoSchedule).
Étape 1 : Installer ack-koordinator et activer le désordonnancement
Si ack-koordinator est déjà installé, vérifiez que la version est 1.2.0-ack.2 ou ultérieure.
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom du cluster cible. Dans le volet de navigation de gauche, cliquez sur Add-ons.
Recherchez ack-koordinator et cliquez sur Install.
Dans la boîte de dialogue d'installation, sélectionnez Enable Descheduler for ACK-Koordinator et terminez l'installation.
Koordinator Descheduler est déployé sous forme de Deployment sur les nœuds du cluster.
Étape 2 : Activer le plug-in RemovePodsViolatingNodeTaints
Configurer le plug-in
Créez un fichier nommé koord-descheduler-config.yaml. Cette ConfigMap active RemovePodsViolatingNodeTaints et exclut le taint deschedule=not-allow .
# 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
Paramètres de RemovePodsViolatingNodeTaints :
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
excludedTaints |
list(string) | — | Clés de taint ou paires key=value à ignorer. Les pods situés sur des nœuds portant ces taints ne sont pas expulsés. |
includePreferNoSchedule |
bool | false | Lorsque cette option est activée, les taints dont l'effet est PreferNoSchedule sont également vérifiés, et pas seulement ceux définis sur NoSchedule . |
namespaces.include |
list(string) | — | Limite le désordonnancement à des namespaces spécifiques. Cette option est mutuellement exclusive avec namespaces.exclude . |
namespaces.exclude |
list(string) | — | Exclut des namespaces spécifiques du désordonnancement. Cette option est mutuellement exclusive avec namespaces.include . |
labelSelector |
map | — | Limite le désordonnancement aux pods correspondant aux libellés spécifiés. |
Appliquer la configuration
-
Appliquez la ConfigMap au cluster :
kubectl apply -f koord-descheduler-config.yaml -
Redémarrez Koordinator Descheduler pour charger la nouvelle configuration :
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
Configurer des paramètres avancés
Configurez le comportement global et les paramètres de modèle à l'aide d'une ConfigMap.
Exemple de configuration avancée
Cette ConfigMap utilise DeschedulerConfiguration pour les paramètres globaux, active RemovePodsViolatingNodeTaints comme politique de désordonnancement et emploie MigrationController comme évicteur.
# 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.
Configurations système
Configurez le comportement global au niveau système dans DeschedulerConfiguration .
| Paramètre | Type | Valeur valide | Description | Exemple |
|---|---|---|---|---|
dryRun |
boolean | true / false (par défaut : false) | Mode lecture seule. Lorsqu'il est activé, aucun pod n'est migré. | false |
deschedulingInterval |
time.Duration | >0s | Fréquence d'exécution du désordonnanceur. | 120s |
nodeSelector |
Structure | — | Limite les nœuds éligibles au désordonnancement. Accepte matchLabels (un seul pool de nœuds) ou matchExpressions (plusieurs pools de nœuds). Consultez Kubernetes labelSelector. |
Voir l'exemple YAML ci-dessus |
maxNoOfPodsToEvictPerNode |
int | ≥0 (par défaut : 0) | Nombre maximal de pods expulsés depuis un seul nœud par cycle de désordonnancement. 0 signifie aucune limite. | 10 |
maxNoOfPodsToEvictPerNamespace |
int | ≥0 (par défaut : 0) | Nombre maximal de pods expulsés depuis un seul namespace par cycle de désordonnancement. 0 signifie aucune limite. | 10 |
Configurations de modèle
Chaque modèle (profiles ) regroupe des politiques de désordonnancement et des évicteurs à l'aide des champs suivants :
name: Identifiant du modèle.plugins: Active ou désactive les politiques de désordonnancement (deschedule,balance), les évicteurs (evict) et les filtres préalables à l'expulsion (filter).pluginConfig: Arguments propres à chaque plug-in. Associez le champnameau nom du plug-in et configurez lesargs. Consultez Configurer les plug-ins de politique et Configurer les plug-ins évicteurs.nodeSelector: Restreint l'application du modèle à des nœuds spécifiques. S'il n'est pas défini, le modèle s'applique à tous les nœuds.
Le nodeSelector au niveau du modèle nécessite ack-koordinator v1.6.1-ack.1.16 ou une version ultérieure.
Référence du champ plugins :
| Champ | Plug-ins pris en charge | Description |
|---|---|---|
deschedule |
RemovePodsViolatingNodeTaints , RemovePodsViolatingInterPodAntiAffinity , RemovePodsViolatingNodeAffinity , RemovePodsHavingTooManyRestarts , PodLifeTime , RemoveFailedPod |
Tous désactivés par défaut. Indiquez les plug-ins à activer. |
balance |
RemoveDuplicates , LowNodeUtilization , HighNodeUtilization , RemovePodsViolatingTopologySpreadConstraint , LowNodeLoad |
Tous désactivés par défaut. Indiquez les plug-ins à activer. |
evict |
MigrationController , DefaultEvictor |
Évictueur de pods. MigrationController est activé par défaut. N'activez pas plusieurs plug-ins evict simultanément. |
filter |
MigrationController , DefaultEvictor |
Politique de filtrage préalable à l'expulsion. MigrationController est activé par défaut. N'activez pas plusieurs plug-ins filter simultanément. |
Configurer les plug-ins de politique
Koordinator Descheduler prend en charge six plug-ins Deschedule et cinq plug-ins Balance issus de Kubernetes Descheduler. LowNodeLoad est fourni par Koordinator. Pour en savoir plus, consultez Gérer le désordonnancement des points chauds sensibles à la charge.
| Type de politique | Plug-in | Description |
|---|---|---|
| Désordonnancement | RemovePodsViolatingInterPodAntiAffinity | Expulse les pods qui enfreignent les règles d'anti-affinité inter-pods. |
| Désordonnancement | RemovePodsViolatingNodeAffinity | Expulse les pods qui ne satisfont plus aux règles d'affinité de nœud. |
| Désordonnancement | RemovePodsViolatingNodeTaints | Expulse les pods qui ne peuvent pas tolérer les taints de nœud. |
| Désordonnancement | RemovePodsHavingTooManyRestarts | Expulse les pods qui redémarrent trop fréquemment. |
| Désordonnancement | PodLifeTime | Expulse les pods dont la durée de vie (TTL) a expiré. |
| Désordonnancement | RemoveFailedPod | Expulse les pods dans l'état Failed. |
| Équilibrage | RemoveDuplicates | Répartit uniformément les pods répliqués entre les nœuds. |
| Équilibrage | LowNodeUtilization | Redistribue les pods en fonction de l'allocation des ressources des nœuds. |
| Équilibrage | HighNodeUtilization | Consolide les pods provenant de nœuds sous-utilisés vers des nœuds plus sollicités. |
| Équilibrage | RemovePodsViolatingTopologySpreadConstraint | Expulse les pods qui enfreignent les contraintes de répartition topologique. |
Configurer les plug-ins évicteurs
Koordinator Descheduler prend en charge deux plug-ins évicteurs : DefaultEvictor et MigrationController .
MigrationController
MigrationController offre un contrôle fin de l'expulsion et une meilleure observabilité grâce aux tâches de migration.
| Paramètre | Type | Valeur valide | Description | Exemple |
|---|---|---|---|---|
evictLocalStoragePods |
boolean | true / false (par défaut : false) | Lorsque cette option est désactivée, les pods utilisant emptyDir ou hostPath ne sont pas désordonnés. |
false |
maxMigratingPerNode |
int64 | ≥0 (par défaut : 2) | Nombre maximal de pods migrés simultanément sur un nœud. 0 signifie aucune limite. | 2 |
maxMigratingPerNamespace |
int64 | ≥0 (par défaut : 0) | Nombre maximal de pods migrés simultanément dans un namespace. 0 signifie aucune limite. | 1 |
maxMigratingPerWorkload |
intOrString | ≥0 (par défaut : 10 %) | Nombre maximal ou pourcentage de pods migrés simultanément dans une charge de travail. 0 signifie aucune limite. Si une charge de travail ne compte qu'un seul pod, elle est exclue du désordonnancement. | 1 ou 10 % |
maxUnavailablePerWorkload |
intOrString | ≥0 et < nombre de réplicas (par défaut : 10 %) | Nombre maximal de pods répliqués indisponibles autorisés dans une charge de travail. 0 signifie aucune limite. | 1 ou 10 % |
objectLimiters.workload |
Structure | Duration >0 (par défaut : 5 min) ; MaxMigrating ≥0 (par défaut : 10 %) |
Régule la migration au niveau de la charge de travail dans une fenêtre temporelle. Duration définit la durée de la fenêtre. MaxMigrating fixe le nombre maximal de pods migrés durant cette période. |
duration: 5m maxMigrating: 1 |
evictionPolicy |
string | Eviction (par défaut), Delete , Soft |
Contrôle la méthode d'expulsion des pods. Eviction : appelle l'API Eviction pour une expulsion gracieuse. Delete : appelle l'API Delete. Soft : ajoute l'annotation scheduling.koordinator.sh/soft-eviction pour une gestion personnalisée en aval. |
Eviction |
DefaultEvictor
DefaultEvictor est l'évicteur standard de Kubernetes Descheduler. Consultez DefaultEvictor pour la configuration.
MigrationController contre DefaultEvictor
| Capacité | DefaultEvictor | MigrationController |
|---|---|---|
| Méthodes d'expulsion | API Eviction uniquement | API Eviction, API Delete ou annotation Soft |
| Limite d'expulsion par nœud | Pris en charge | Pris en charge |
| Limite d'expulsion par namespace | Pris en charge | Pris en charge |
| Limite d'expulsion par charge de travail | Non pris en charge | Pris en charge |
| Limite d'indisponibilité par charge de travail | Non pris en charge | Pris en charge |
| Régulation de l'expulsion | Non pris en charge | Régulation basée sur une fenêtre temporelle par charge de travail |
| Observabilité de l'expulsion | Journaux du composant uniquement | Journaux du composant et événements Kubernetes avec état de migration par pod |
Étapes suivantes
Désordonnancement — concepts, fonctionnalités et flux de travail.
Vous utilisez Kubernetes Descheduler de la communauté ? Consultez Koordinator Descheduler et Kubernetes Descheduler pour connaître les différences et la procédure de migration.
Configurez le désordonnancement sensible à la charge avec
LowNodeLoad: Gérer le désordonnancement des points chauds sensibles à la charge.Analysez l'utilisation des ressources du cluster et obtenez des recommandations pour réduire les coûts : Cost Insight.
Dépannage : FAQ sur l'ordonnancement.
Notes de version et présentation du composant : ack-koordinator (ack-slo-manager).