Tous les produits
Search
Centre de documentation

Container Service for Kubernetes:Enable dynamic resource overcommitment

Dernière mise à jour :Aug 11, 2026

Les charges de travail en ligne réservent généralement du processeur et de la mémoire en se basant sur des estimations de pointe, alors que l'utilisation réelle est souvent bien inférieure. Il en résulte un important pool de ressources allouées mais inactives, que les pods BestEffort standards peuvent partager, mais sans garanties d'ordonnancement ni contrôles d'équité. La surallocation dynamique des ressources résout ces deux problèmes : le composant ack-koordinator surveille la charge des nœuds en temps réel, calcule la capacité récupérable et l'expose sous forme de ressources étendues Batch (kubernetes.io/batch-cpu et kubernetes.io/batch-memory) que les pods BestEffort peuvent demander explicitement.

Pour tirer le meilleur parti de cette fonctionnalité, consultez les rubriques Pod Quality of Service Classes et Assign Memory Resources to Containers and Pods dans la documentation Kubernetes.

Fonctionnement

ack-koordinator suit en continu la charge par nœud et publie la capacité récupérable sous forme de ressources étendues sur chaque nœud. Les pods BestEffort déclarent des demandes et des limites explicites pour ces ressources Batch, ce qui permet à l'ordonnanceur ACK de prendre des décisions de placement éclairées et d'appliquer les limites de ressources via la hiérarchie cgroup du nœud.

Le schéma suivant illustre les limites de la surallocation standard des ressources :

image

Sans surallocation dynamique, l'ordonnanceur ne dispose d'aucune visibilité sur la charge réelle des nœuds et peut donc placer des pods BestEffort sur des nœuds déjà surchargés. Par ailleurs, il est impossible d'exprimer des quantités de ressources différentes par pod, ce qui empêche une distribution équitable des ressources entre les pods BestEffort.

ack-koordinator introduit trois termes pour décrire la capacité de ressources récupérées :

Terme Description
Reclaimed Ressources pouvant être dynamiquement surallouées à cet instant
Buffered Ressources réservées et exclues de la récupération
Usage Consommation réelle des ressources

image

Classes QoS et ressources Batch

Kubernetes attribue à chaque pod une classe de qualité de service (QoS) en fonction de sa configuration de ressources. Les ressources Batch sont conçues spécifiquement pour la classe BestEffort :

Classe QoS Configuration des ressources Cas d'utilisation
Guaranteed requests == limits pour tous les conteneurs Services de production sensibles à la latence
Burstable requests < limits pour au moins un conteneur Charges de travail en ligne générales
BestEffort Pas de requests ni de limits — utilisez plutôt les ressources Batch Tâches batch et tâches hors ligne

Pour utiliser la surallocation dynamique des ressources, définissez koordinator.sh/qosClass: "BE" sur le pod et remplacez les champs de ressources standards par kubernetes.io/batch-cpu et kubernetes.io/batch-memory.

Facturation

L'installation et l'utilisation du composant ack-koordinator sont gratuites. Veuillez noter les points suivants :

  • ack-koordinator est un composant non géré. Après l'installation, il consomme des ressources des nœuds de travail. Spécifiez les demandes de ressources par module lors de l'installation.

  • ack-koordinator peut exposer des métriques Prometheus pour des fonctionnalités telles que le profilage des ressources et l'ordonnancement fin. Si vous activez les métriques Prometheus pour ack-koordinator et utilisez Managed Service for Prometheus, ces métriques sont comptabilisées comme des custom metrics et facturées en conséquence. Avant l'activation, consultez la rubrique Billing pour Managed Service for Prometheus et lisez la page Query the amount of observable data and bills pour comprendre le calcul des coûts.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Un cluster ACK Pro. Pour plus d'informations, consultez la rubrique Create an ACK Pro cluster.

  • Le composant ack-koordinator installé en version 0.8.0 ou ultérieure. Pour plus d'informations, consultez la rubrique ack-koordinator.

Activer la surallocation dynamique des ressources

Activez et configurez la fonctionnalité en créant ou en mettant à jour une ConfigMap dans le namespace kube-system.

Étape 1 : Créer la ConfigMap

Créez un fichier nommé configmap.yaml avec le contenu suivant :

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".
    }
Les valeurs cpuReclaimThresholdPercent et memoryReclaimThresholdPercent de cet exemple (60 et 70) sont des valeurs d'illustration. Les valeurs par défaut réelles sont 65 pour les deux paramètres.

Le tableau suivant décrit chaque paramètre en détail :

Paramètre Type Valeur par défaut Description
enable Boolean false Active les mises à jour dynamiques des ressources Batch. Définir cette valeur sur false réinitialise les ressources récupérables à 0.
metricAggregateDurationSeconds Int 60 Fréquence (en secondes) à laquelle le système agrège les métriques des nœuds pour recalculer la capacité des ressources Batch. Utilisez la valeur par défaut.
cpuReclaimThresholdPercent Int 65 Seuil de récupération pour les ressources batch-cpu, en pourcentage du processeur allouable. Consultez la section Calculer la capacité des ressources Batch.
memoryReclaimThresholdPercent Int 65 Seuil de récupération pour les ressources batch-memory, en pourcentage de la mémoire allouable. Consultez la section Calculer la capacité des ressources Batch.
memoryCalculatePolicy String "usage" Méthode de calcul de la capacité batch-memory. "usage" : inclut les ressources non allouées et les ressources allouées mais inactives (basé sur l'utilisation réelle des pods Guaranteed et Burstable). "request" : inclut uniquement les ressources non allouées (basé sur les demandes de mémoire des pods Guaranteed et Burstable).

Calculer la capacité des ressources Batch

ack-koordinator applique la formule suivante pour calculer la quantité de ressources Batch disponibles sur chaque nœud.

Calcul basé sur l'utilisation (par défaut, memoryCalculatePolicy: "usage") :

nodeBatchAllocatable = nodeAllocatable × thresholdPercent − podUsage(non-BE) − systemUsage

Calcul basé sur les demandes (memoryCalculatePolicy: "request", s'applique uniquement à batch-memory) :

nodeBatchAllocatable = nodeAllocatable × thresholdPercent − podRequest(non-BE) − systemUsage

Où :

Variable Description
nodeAllocatable Total du processeur ou de la mémoire allouable sur le nœud
thresholdPercent Pourcentage de seuil de récupération configuré
podUsage(non-BE) Utilisation réelle des ressources des pods Guaranteed et Burstable
podRequest(non-BE) Somme des demandes de ressources des pods Guaranteed et Burstable
systemUsage Consommation de ressources au niveau du système sur le nœud

Étape 2 : Appliquer la ConfigMap

Vérifiez si la ConfigMap ack-slo-config existe déjà dans le namespace kube-system :

  • Si elle existe, utilisez kubectl patch pour fusionner vos modifications sans écraser les autres paramètres :

    kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"
  • Si elle n'existe pas, créez-la :

    kubectl apply -f configmap.yaml

Demander des ressources Batch

Après avoir activé la surallocation dynamique des ressources, configurez les pods pour qu'ils demandent des ressources Batch.

Important
  • Un pod ne peut pas demander simultanément des ressources Batch et des ressources standards.

  • Pour les Deployments ou autres charges de travail, définissez le libellé sur template.metadata, et non sur l'objet de charge de travail lui-même.

  • ack-koordinator ajuste dynamiquement la capacité Batch disponible en fonction de la charge réelle des nœuds. Dans de rares cas, kubelet peut prendre du retard dans la communication du statut du nœud, ce qui entraîne l'échec de l'ordonnancement des pods par manque de ressources. Si cela se produit, supprimez et recréez les pods concernés.

  • Les montants des ressources Batch doivent être des entiers. batch-cpu utilise l'unité millicœur (1 cœur = 1 000 millicœurs).

Étape 1 : Vérifier les ressources Batch disponibles sur le nœud

# Replace $nodeName with the actual node name.
kubectl get node $nodeName -o yaml

Recherchez la section status.allocatable dans la sortie :

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

Étape 2 : Configurer le pod pour utiliser les ressources Batch

Ajoutez le libellé koordinator.sh/qosClass: "BE" aux métadonnées du pod et définissez kubernetes.io/batch-cpu et kubernetes.io/batch-memory dans le champ resources du conteneur :

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"

Exemple

Cet exemple déploie un pod de test BestEffort qui utilise des ressources Batch et vérifie que les limites de ressources sont appliquées dans le cgroup du nœud.

  1. Vérifiez les ressources Batch disponibles sur le nœud :

    kubectl get node $nodeName -o yaml

    Sortie attendue :

    status:
      allocatable:
        kubernetes.io/batch-cpu: 50000
        kubernetes.io/batch-memory: 53687091200
  2. Créez un fichier nommé be-pod-demo.yaml :

    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
  3. Déployez le pod :

    kubectl apply -f be-pod-demo.yaml
  4. Vérifiez que les limites de ressources sont reflétées dans le cgroup du nœud. Vérifiez la limite de processeur :

    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_us

    Sortie attendue (50 cœurs) :

    5000000

    Vérifiez la limite de mémoire :

    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_bytes

    Sortie attendue (10 Go) :

    10737418240

Surveiller l'utilisation des ressources Batch

Les clusters ACK s'intègrent à Managed Service for Prometheus. Pour afficher l'utilisation des ressources Batch :

  1. Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur console ACKClusters.

  2. Sur la page Clusters, cliquez sur le nom du cluster cible. Dans le volet de gauche, choisissez Operations > Prometheus Monitoring.

  3. Cliquez sur l'onglet Others, puis sur l'onglet k8s-reclaimed-resource. Ce tableau de bord affiche les revenus mixtes du cluster ainsi que la capacité des ressources aux niveaux du cluster, du nœud et du pod. Pour plus d'informations, consultez la rubrique Enable the colocation monitoring feature.

Si vous avez créé un tableau de bord Prometheus personnalisé, utilisez les métriques suivantes pour interroger les données des ressources Batch :

# 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"}

FAQ

Après la mise à niveau d'ack-slo-manager vers ack-koordinator, l'ancienne configuration de surallocation fonctionne-t-elle toujours ?

Oui. ack-koordinator est rétrocompatible avec l'ancien protocole ack-slo-manager. L'ordonnanceur du cluster ACK Pro peut calculer les ressources demandées et disponibles en utilisant simultanément les anciens et les nouveaux formats de protocole, ce qui permet d'effectuer la mise à niveau sans reconfigurer les charges de travail existantes.

L'ancien protocole utilise :

  • L'annotation de pod alibabacloud.com/qosClass

  • Le champ alibabacloud.com/reclaimed pour les demandes et les limites de ressources

ack-koordinator prend en charge ces éléments via des versions de protocole datant au plus tard du 30 juillet 2023. Migrez les charges de travail existantes vers le protocole koordinator.sh lorsque cela sera possible.

Le tableau suivant montre la compatibilité entre les versions des composants :

Version de l'ordonnanceur ack-koordinator Protocole alibabacloud.com Protocole koordinator.sh
≥1.18 et <1.22.15-ack-2.0 ≥0.3.0 Pris en charge Non pris en charge
≥1.22.15-ack-2.0 ≥0.8.0 Pris en charge Pris en charge

Pourquoi l'utilisation de la mémoire augmente-t-elle brusquement juste après le démarrage du pod ?

Symptôme : L'utilisation de la mémoire augmente immédiatement après le démarrage d'un conteneur, dépassant la limite kubernetes.io/batch-memory prévue.

Cause : Lors de la création d'un conteneur, ack-koordinator définit la limite de mémoire du cgroup en fonction de kubernetes.io/batch-memory. Certaines applications lisent la limite du cgroup au démarrage pour déterminer la quantité de mémoire à allouer en interne. Si l'application lit le cgroup avant qu'ack-koordinator n'ait écrit la limite, elle peut allouer plus de mémoire que prévu. Le système d'exploitation ne récupère pas immédiatement cette mémoire, de sorte que l'utilisation reste élevée jusqu'à ce qu'elle baisse naturellement en dessous de la limite configurée.

Vérification : Exécutez la commande suivante à l'intérieur du conteneur pour confirmer que la limite de mémoire est correctement définie :

# Unit: bytes
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# Expected output example
1048576000

Solution : Configurez la limite de mémoire de l'application dans son script de démarrage avant le lancement du processus principal. Cela garantit que la limite est en place avant que l'application ne lise le cgroup.

Pourquoi un pod BestEffort reste-t-il dans l'état Pending ?

Symptôme : Un pod configuré avec des ressources Batch reste dans l'état Pending et ne peut pas être ordonnancé.

Vérification : Exécutez kubectl describe pod <pod-name> et recherchez les événements d'échec d'ordonnancement.

Causes courantes et solutions :

Cause Solution
Ressources Batch insuffisantes sur tous les nœuds Exécutez kubectl get node <node> -o yaml et vérifiez status.allocatable pour batch-cpu et batch-memory. Réduisez les demandes du pod ou attendez que les ressources soient récupérées.
kubelet n'a pas encore synchronisé le statut du nœud Supprimez et recréez le pod. ack-koordinator ajuste dynamiquement la capacité Batch et kubelet peut prendre du retard dans la communication des ressources allouables mises à jour.
Le pod demande à la fois des ressources Batch et des ressources standards Un pod ne peut pas demander simultanément des ressources Batch et des ressources standards. Supprimez l'un des ensembles de champs de ressources.

Étapes suivantes

ack-koordinator fournit des contrôles supplémentaires pour protéger les charges de travail en ligne contre les interférences causées par les pods BestEffort. Consultez les rubriques suivantes :