Passer au contenu

Comment résoudre les problèmes de planification des pods liés au Cluster Autoscaler dans Amazon EKS ?

Lecture de 6 minute(s)
0

Des problèmes de planification des pods se produisent lorsque j'utilise l’outil Cluster Autoscaler dans Amazon Elastic Kubernetes Service (Amazon EKS). Mon pod est bloqué à l'état En attente ou je reçois une notification concernant l’échec d'un événement de planification.

Résolution

Si vous avez activé Cluster Autoscaler et que votre pod est bloqué à l'état En attente, Cluster Autoscaler peut ne pas ajouter de nouveaux nœuds aux pods non planifiés.

Vérifier l'état de votre pod

Pour vérifier l'état de votre pod, exécutez la commande kubectl get pods suivante :

kubectl get pods -n kube-system -l app=cluster-autoscaler

Si le pod se trouve à l’état En attente ou si le conteneur de votre pod est à l’état En attente, résolvez le statut du pod.

Si votre pod se trouve à l’état CrashLoopBackOff, exécutez la commande kubectl describe pod suivante :

kubectl describe pod cluster-autoscaler-####-#### -n kube-system

Remarque : Remplacez cluster-autoscaler-####-#### par votre pod Cluster Autoscaler.

Si la sortie de la commande indique « OOMKilled » avec le code de sortie 137, augmentez vos limites de ressources mémoire et vos requêtes pour le déploiement cluster-autoscaler. Pour plus d'informations, consultez la page Spécifier une demande de mémoire et une limite de mémoire sur le site Web de Kubernetes.

Pour vérifier les journaux du pod, exécutez la commande kubectl logs suivante :

kubectl logs -f -n kube-system -l app=cluster-autoscaler

Les journaux peuvent fournir des informations de dépannage. Par exemple, le journal du pod peut afficher le message d'erreur « AccessDenied » suivant :

« Failed to create AWS Manager: AccessDenied: User: arn:aws:sts::444455556666:assumed-role/your-role is not authorized to perform: your-action because no identity-based policy allows the your-action action »

Pour résoudre les problèmes d'autorisations relatives à Gestion des identités et des accès AWS (AWS IAM), associez la politique IAM appropriée au pod. Pour plus d'informations, consultez la page Politique IAM sur le site Web de GitHub.

Ou bien, le journal peut afficher le message d'erreur suivant :

« Failed to create AWS Manager: cannot autodiscover ASGs: WebIdentityErr: failed to retrieve credentials caused by: RequestError: send request failed caused by: Post https://sts.region.amazonaws.com/: : dial tcp: i/o timeout »

Si vous rencontrez des problèmes de connectivité réseau, vérifiez que le sous-réseau de votre composant master dispose d'un itinéraire vers les points de terminaison de services AWS suivants :

  • ec2.region.amazonaws.com
  • autoscaling.region.amazonaws.com
  • sts.region.amazonaws.com

Vérifiez également que la liste de contrôle d'accès au réseau (ACL réseau) ou le groupe de sécurité du composant master de votre sous-réseau ne bloque pas le trafic vers les points de terminaison précédents.

Si votre cluster est privé, procédez comme suit :

  • Ajoutez les points de terminaison précédents à votre cloud privé virtuel (VPC).
  • Configurez le groupe de sécurité pour les points de terminaison afin d'autoriser le trafic sur le port 443 à partir d'un groupe de sécurité de composant master.

Identifier la raison pour laquelle votre Cluster Autoscaler ne peut pas augmenter horizontalement le groupe Auto Scaling

Pour vérifier si votre pod contient une règle de planification, telle que l'affinité ou l'anti-affinité, exécutez la commande kubectl describe pod suivante :

kubectl describe pod pending-pod-name -n pending-pod-namespace

Remarque : Remplacez pending-pod-name par le nom de votre pod en attente et pending-pod-namespace par l'espace de noms de votre pod en attente. Pour plus d'informations, consultez la page Affinité et anti-affinité sur le site Web de Kubernetes.

Dans la sortie de la commande, consultez la section Événements pour déterminer pourquoi votre pod est bloqué à l'état En attente. Par exemple, vous pourriez identifier un problème avec les étiquettes de vos groupes de nœuds.

Pour vous assurer que vos groupes de nœuds fonctionnent, procédez comme suit :

  • Configurez vos groupes de nœuds avec des étiquettes qui correspondent aux paramètres nodeSelector et requiredDuringSchedulingIgnoredDuringExecution dans la spécification nodeAffinity de votre pod. Pour plus d’informations, consultez la page Étiquettes de nœud sur le site Web de Kubernetes. Les étiquettes correctes permettent au Cluster Autoscaler d'identifier les nœuds éligibles pour les opérations de mise à l’échelle.
  • Assurez-vous d'avoir correctement défini les règles de planification de votre pod. Pour plus d'informations, consultez la page Affectation de pods à des nœuds sur le site Web de Kubernetes. Lorsque les pods utilisent nodeSelector ou requiredDuringSchedulingIgnoredDuringExecution, le Cluster Autoscaler prend uniquement en compte la mise à l'échelle des groupes de nœuds qui répondent aux exigences de planification pour ces paramètres.

Pour vérifier la configuration du Cluster Autoscaler, exécutez la commande kubectl get deployment suivante :

kubectl get deployment cluster-autoscaler -n kube-system -o yaml

Si le Cluster Autoscaler utilise l'argument node-group-auto-discovery approprié, la sortie de la commande affiche la configuration suivante :

command:
  - ./cluster-autoscaler
  - --v=4
  - --stderrthreshold=info
  - --cloud-provider=aws
  - --skip-nodes-with-local-storage=false
  - --expander=least-waste
  - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/your-cluster-name

Vérifiez si le groupe Auto Scaling utilise les identifications appropriées.

Le Cluster Autoscaler nécessite les identifications suivantes pour découvrir le groupe Auto Scaling associé au groupe de nœuds :

Tag 1:
key: k8s.io/cluster-autoscaler/your-cluster-name
value: owned

Tag 2:
key: k8s.io/cluster-autoscaler/enabled
value: true

Pour vérifier si le groupe de nœuds a atteint le nombre maximum de nœuds, exécutez la commande describe-nodegroup suivante :

aws eks describe-nodegroup --cluster-name your-cluster-name --nodegroup-name your-nodegroup-name

Remarque : Remplacez your-cluster-name par le nom de votre cluster et your-nodegroup-name par le nom de votre groupe de nœuds.

Si le groupe de nœuds a atteint le nombre maximum de nœuds, mettez-le à jour pour augmenter le nombre maximum de nœuds. Les nouveaux nœuds peuvent ensuite planifier les nouveaux pods.

Vérifiez si l'instance Amazon Elastic Compute Cloud (Amazon EC2) lancée par votre groupe Auto Scaling peut rejoindre votre cluster. Si l'instance ne parvient pas à rejoindre votre cluster, dépannez vos composants master.

Pour vérifier la demande de ressource de pod, exécutez la commande kubectl get pod suivante :

kubectl get pod pending-pod-name -n pending-pod-namespace -o yaml | grep resources -A6

Remarque : Remplacez pending-pod-name par le nom de votre pod en attente et pending-pod-namespace par le nom de l'espace de noms de votre pod en attente.

Vérifiez si le type d'instance de nœud actuel répond à la demande de ressource de pod et modifiez la demande de ressource de pod si nécessaire. Vous pouvez également créer un nouveau groupe de nœuds avec un type d'instance modifié. Pour plus d'informations sur les demandes de ressources de pod, consultez la page Gestion des ressources pour les pods et les conteneurs sur le site Web de Kubernetes.

Pour afficher les teintes d'un nœud, exécutez la commande kubectl describe node suivante :

kubectl describe node your-node-name

Remarque : Remplacez your-node-name par le nom de votre nœud.

Assurez-vous que vos pods tolèrent les teintes que vous avez ajoutées au nœud. Si le nœud n'a pas besoin des teintes, supprimez-les du nœud. Pour plus d'informations, consultez la page Teintes et tolérances sur le site Web de Kubernetes.

Informations connexes

Questions fréquemment posées sur le site Web de GitHub

AWS OFFICIELA mis à jour il y a 2 mois