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 :
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 |
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 valeurscpuReclaimThresholdPercentetmemoryReclaimThresholdPercentde 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 patchpour 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.
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.
-
Vérifiez les ressources Batch disponibles sur le nœud :
kubectl get node $nodeName -o yamlSortie attendue :
status: allocatable: kubernetes.io/batch-cpu: 50000 kubernetes.io/batch-memory: 53687091200 -
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 -
Déployez le pod :
kubectl apply -f be-pod-demo.yaml -
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_usSortie attendue (50 cœurs) :
5000000Vé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_bytesSortie 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 :
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur console ACKClusters.
Sur la page Clusters, cliquez sur le nom du cluster cible. Dans le volet de gauche, choisissez Operations > Prometheus Monitoring.
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/qosClassLe champ
alibabacloud.com/reclaimedpour 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 :