Tous les produits
Search
Centre de documentation

Container Service for Kubernetes:Enable the descheduling feature

Dernière mise à jour :Aug 11, 2026

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 :

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 replicas pour 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. Comme deschedule=not-allow figure dans excludedTaints, 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 taint NoSchedule ).

É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.
  1. Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.

  2. Sur la page Clusters, cliquez sur le nom du cluster cible. Dans le volet de navigation de gauche, cliquez sur Add-ons.

  3. Recherchez ack-koordinator et cliquez sur Install.

  4. 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

  1. Appliquez la ConfigMap au cluster :

    kubectl apply -f koord-descheduler-config.yaml
  2. 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

Étape 3 : Vérifier le désordonnancement

Cet exemple s'appuie sur un cluster de trois nœuds.

  1. Créez un fichier nommé stress-demo.yaml :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: stress-demo
      namespace: default
      labels:
        app: stress-demo
    spec:
      replicas: 3
      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: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4
              imagePullPolicy: Always
              name: stress
              resources:
                limits:
                  cpu: '2'
                  memory: 4Gi
                requests:
                  cpu: '2'
                  memory: 4Gi
          restartPolicy: Always
  2. Déployez la charge de travail de test :

    kubectl create -f stress-demo.yaml
  3. Attendez que les pods passent à l'état Running :

    kubectl get pod -o wide

    Sortie attendue :

    NAME                         READY   STATUS    RESTARTS   AGE    IP              NODE                        NOMINATED NODE   READINESS GATES
    stress-demo-5f6cddf9-9****   1/1     Running   0          10s    192.XX.XX.27   cn-beijing.192.XX.XX.247   <none>           <none>
    stress-demo-5f6cddf9-h****   1/1     Running   0          10s    192.XX.XX.20   cn-beijing.192.XX.XX.249   <none>           <none>
    stress-demo-5f6cddf9-v****   1/1     Running   0          10s    192.XX.XX.32   cn-beijing.192.XX.XX.248   <none>           <none>
  4. Ajoutez des taints NoSchedule à deux nœuds :

    • Ajoutez deschedule=not-allow:NoSchedule à cn-beijing.192.XX.XX.247 (exclu par excludedTaints : le pod doit rester) :

      kubectl taint nodes cn-beijing.192.XX.XX.247 deschedule=not-allow:NoSchedule

      Sortie attendue :

      node/cn-beijing.192.XX.XX.247 tainted
    • Ajoutez deschedule=allow:NoSchedule à cn-beijing.192.XX.XX.248 (non exclu : le pod doit être expulsé) :

      kubectl taint nodes cn-beijing.192.XX.XX.248 deschedule=allow:NoSchedule

      Sortie attendue :

      node/cn-beijing.192.XX.XX.248 tainted
  5. Observez les modifications des pods. Le désordonnanceur vérifie les taints toutes les deschedulingInterval (120 secondes) :

    kubectl get pod -o wide -w

    Sortie attendue :

    NAME                         READY   STATUS              RESTARTS   AGE     IP             NODE                    NOMINATED NODE   READINESS GATES
    stress-demo-5f6cddf9-9****   1/1     Running             0          5m34s   192.XX.XX.27   cn-beijing.192.XX.XX.247   <none>           <none>
    stress-demo-5f6cddf9-h****   1/1     Running             0          5m34s   192.XX.XX.20   cn-beijing.192.XX.XX.249   <none>           <none>
    stress-demo-5f6cddf9-v****   1/1     Running             0          5m34s   192.XX.XX.32   cn-beijing.192.XX.XX.248   <none>           <none>
    stress-demo-5f6cddf9-v****   1/1     Terminating         0          7m58s   192.XX.XX.32   cn-beijing.192.XX.XX.248   <none>           <none>
    stress-demo-5f6cddf9-j****   0/1     ContainerCreating   0          0s      <none>         cn-beijing.192.XX.XX.249   <none>           <none>
    stress-demo-5f6cddf9-j****   1/1     Running             0          2s      192.XX.XX.32   cn-beijing.192.XX.XX.249   <none>           <none>

    La sortie confirme que :

    • Le pod situé sur cn-beijing.192.XX.XX.248 (taint deschedule=allow:NoSchedule , non exclu) est expulsé.

    • Le pod situé sur cn-beijing.192.XX.XX.247 (taint deschedule=not-allow:NoSchedule , exclu) reste en cours d'exécution.

    • Le pod expulsé est replacé sur cn-beijing.192.XX.XX.249 , qui ne porte aucun taint NoSchedule .

  6. Consultez les événements d'expulsion du pod expulsé :

    kubectl get event | grep stress-demo-5f6cddf9-v****

    Sortie attendue :

    3m24s       Normal    Evicting            podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798****   Pod "default/stress-demo-5f6cddf9-v****" evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints"
    2m51s       Normal    EvictComplete       podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798****   Pod "default/stress-demo-5f6cddf9-v****" has been evicted
    3m24s       Normal    Descheduled         pod/stress-demo-5f6cddf9-v****                         Pod evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints"
    3m24s       Normal    Killing             pod/stress-demo-5f6cddf9-v****                         Stopping container stress

    Chaque événement correspond à une phase du cycle de vie de la migration :

    Événement Source Signification
    Evicting PodMigrationJob Le désordonnanceur a démarré une tâche de migration pour expulser le pod.
    Descheduled Pod Le pod a reçu le signal d'expulsion.
    Killing Pod Le runtime de conteneur arrête le conteneur.
    EvictComplete PodMigrationJob Le pod est entièrement expulsé. Le contrôleur de charge de travail le recrée.

    Le pod situé sur cn-beijing.192.XX.XX.248 ne tolérait pas le taint deschedule=allow:NoSchedule (absent de excludedTaints ), il a donc été expulsé.

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 champ name au nom du plug-in et configurez les args . 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