Passer au contenu

Comment résoudre les problèmes liés à la configuration de l’outil Cluster Autoscaler sur un cluster Amazon EKS ?

Lecture de 11 minute(s)
0

Je souhaite résoudre des problèmes lorsque je lance l’outil Cluster Autoscaler sur mon cluster Amazon Elastic Kubernetes Service (Amazon EKS).

Résolution

Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'AWS CLI.

Les commandes de la résolution suivante n'utilisent pas l'indicateur --region car elles utilisent la région AWS par défaut. Pour vérifier votre région par défaut, exécutez la commande configure de l'AWS CLI suivante :

aws configure

Pour modifier la région, utilisez l'indicateur --region.

Prérequis : Installez ou mettez à jour eksctl vers la dernière version. Pour obtenir des instructions, consultez la page Installation sur le site Web d'eksctl.

Prenez les mesures de dépannage suivantes en fonction du problème rencontré. Pour résoudre les problèmes liés aux sondes, consultez la section Comment résoudre les problèmes liés aux sondes Liveness et Readiness de mes clusters Amazon EKS ?

Le pod Cluster Autoscaler se trouve dans un état « CrashLoopBackOff »

Pour résoudre les problèmes liés à l'état « CrashLoopBackoff », procédez comme suit :

  1. Pour vérifier l'état du pod Cluster Autoscaler, exécutez la commande suivante :

    kubectl get pods -n kube-system | grep cluster-autoscaler

    Exemple de sortie :

    NAME                            READY   STATUS             RESTARTS      AGE
    cluster-autoscaler-abcd-abcd   0/1     CrashLoopBackOff   3 (20s ago)   99s
  2. Pour en savoir plus sur les raisons pour lesquelles le pod est bloqué à l’état « CrashLoopBackoff », exécutez la commande suivante :

    kubectl describe pod cluster-autoscaler-abcd-abcde -n kube-system

    Remarque : Remplacez cluster-autoscaler-abcd-abcde par le nom du pod Cluster Autoscaler.
    Dans la sortie, vérifiez la valeur de Raison. Si vous constatez un problème avec OOMKilled, utilisez la commande kubectl edit pour augmenter les valeurs des limites et des requêtes pour les ressources mémoire dans le déploiement du Cluster Autoscaler. Pour plus d'informations sur kubectl edit, consultez la page kubectl edit sur le site Web de Kubernetes. Pour afficher les valeurs de mémoire par défaut du Cluster Autoscaler, consultez la page cluster-autoscaler-autodiscover.yaml sur le site Web de GitHub.
    Exemple de sortie :

    Name:               cluster-autoscaler-abcd-abcde
    Namespace:          kube-system
    State:              Waiting
    Reason:             CrashLoopBackOff
    Last State:         Terminated
    Reason:             OOMKilled
    Exit Code:          137
    ...
  3. Pour vérifier l’existence de problèmes dans les journaux du pod Cluster Autocluster, exécutez la commande suivante :

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

    Si les journaux indiquent des problèmes d'autorisations de Gestion des identités et des accès AWS (AWS IAM), passez à la section Le pod Cluster Autoscaler rencontre des problèmes d'autorisations IAM. Exemple de sortie :

    Failed to create AWS Manager: cannot autodiscover ASGs: AccessDenied: User: abc is not authorized to perform: autoscaling: DescribeTags because no identity-based policy allows the autoscaling:DescribeTags action status code: 403, request id: abcdexyz

    Si les journaux indiquent des problèmes de réseau tels que le délai d'attente des I/O, passez à la section Le pod Cluster Autoscaler rencontre des problèmes de réseau. Exemple de sortie :

    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

Le pod Cluster Autoscaler rencontre des problèmes d'autorisations IAM

Vérifiez si vous avez associé un fournisseur OIDC au cluster

Assurez-vous d'avoir créé un fournisseur OpenID Connect (OIDC) pour votre cluster.

Vérifiez si vous avez annoté le compte de service Cluster Autoscaler avec le rôle IAM

Pour vérifier les annotations de votre compte de service AWS, exécutez la commande suivante :

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

Vérifiez les annotations pour vous assurer que la sortie indique le rôle de votre compte de service Cluster Autoscaler. Exemple de sortie :

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/cluster_auto_scaler_iam_role
  name: cluster-autoscaler
  namespace: kube-system

Pour résoudre les problèmes liés au rôle de votre compte de service, consultez la section Comment résoudre un problème lié à un fournisseur OIDC et IRSA dans Amazon EKS ?

Vérifiez la politique IAM

Assurez-vous que vous avez associé la politique IAM appropriée au rôle de compte du service Cluster Autoscaler. Pour un exemple de politique et une liste des autorisations requises, consultez la page Politique IAM sur le site Web de GitHub.

Vérifiez si vous avez correctement configuré la relation d’approbation

Assurez-vous d'avoir correctement configuré la relation d’approbation. Exemple de relation d’approbation :

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::example_awsaccountid:oidc-provider/oidc.eks.example_region.amazonaws.com/id/example_oidcid"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.example_region.amazonaws.com/id/example_oidcid:aud": "sts.amazonaws.com",
          "oidc.eks.example_region.amazonaws.com/id/example_oidcid:sub": "system:serviceaccount:kube-system:cluster-autoscaler"
        }
      }
    }
  ]
}

Remarque : Remplacez example_awsaccountid par votre ID de compte AWS, example_region par votre région et example_oidcid par votre ID OIDC.

Chaque fois que vous modifiez le rôle ou la politique du compte de service, exécutez la commande suivante pour redémarrer le pod Cluster Autoscaler :

kubectl rollout restart deployment cluster-autoscaler -n kube-system

Le pod Cluster Autoscaler rencontre des problèmes de réseau

Assurez-vous d'avoir configuré le cluster Amazon EKS avec la configuration réseau requise. Vérifiez que le sous-réseau du composant master dispose d’une table de routage capable d’acheminer le trafic vers les points de terminaison suivants :

Si le cluster Amazon EKS est privé, vous devez créer un point de terminaison Amazon Virtual Private Cloud (Amazon VPC) pour les points de terminaison précédents.

Remarque : Le groupe de sécurité de chaque point de terminaison de VPC doit autoriser le groupe de sécurité du composant master Amazon EKS. Les groupes de sécurité doivent également autoriser le trafic entrant vers le bloc d'adresse CIDR de VPC Amazon EKS sur le port 443.

Vérifiez que la liste de contrôle d'accès au réseau (ACL réseau) du sous-réseau et les groupes de sécurité du composant master ne bloquent pas le trafic qui communique vers ces points de terminaison.

Le Cluster Autoscaler ne réduit ni n’augmente horizontalement les nœuds

Consultez les journaux du pod Cluster Autoscaler pour connaître les règles de planification

Pour vérifier l'état de vos pods, exécutez la commande suivante :

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

Pour vérifier si le pod à l’état En attente contient des règles de planification, telles que la règle d'affinité, exécutez la commande suivante :

kubectl describe pod example_podname -n example_namespace

Remarque : Remplacez example_podname par le nom du pod, et example_namespace par votre espace de noms.

Dans la sortie, consultez la section événements pour savoir pourquoi le pod est à l’état En attente. Exemple de sortie :

$ kubectl describe pod cluster-autoscaler-abcde-abcd -n kube-system
Name: cluster-autoscaler-5b6b675456-npf8p
...
Status: Pending
...
Events:
 Type Reason Age From Message
 ---- ------ ---- ---- -------
 Warning FailedScheduling 12s (x4 over 2m) default-scheduler 0/4 nodes are available: 1 node(s) didn't match node selector, 3 node(s) didn't match pod affinity rules.

Remarque : Le Cluster Autoscaler respecte nodeSelector et requiredDuringSchedulingIgnoredDuringExecution dans nodeAffinity. Assurez-vous d'étiqueter vos groupes de nœuds avec ces valeurs. Pour étiqueter vos groupes de nœuds, exécutez la commande suivante :

kubectl get nodes --show-labels

Si le Cluster Autoscaler ne peut pas planifier un pod avec nodeSelector ou requiredDuringSchedulingIgnoredDuringExecution, il utilise uniquement des groupes de nœuds qui répondent aux exigences d'extension. Pour planifier un pod sur un nœud, vous devez modifier les règles de planification définies sur les pods ou les nœuds. Pour plus d'informations, consultez la page Affinité et anti-affinité sur le site Web de Kubernetes.

Vérifiez l’identification du groupe Amazon EC2 Auto Scaling pour le Cluster Autoscaler

Pour que le Cluster Autoscaler détecte un groupe Auto Scaling, vous devez identifier le groupe Amazon EC2 Auto Scaling du groupe de nœuds avec les identifications suivantes.

Pour l’identification 1, configurez les valeurs suivantes :

  • Pour clé, saisissez k8s.io/cluster-autoscaler/example-cluster.
  • Pour valeur, saisissez détenu.

Remarque : Remplacez example-cluster par le nom de votre cluster.

Pour l’identification 2, configurez les valeurs suivantes :

  • Pour clé, saisissez k8s.io/cluster-autoscaler/enabled.
  • Pour valeur, saisissez true.

Vérifiez la configuration du manifeste de déploiement

Pour ouvrir le manifeste de déploiement, exécutez la commande suivante :

kubectl -n kube-system edit deployment.apps/cluster-autoscaler

Dans la sortie, pour node-group-auto-discover, assurez-vous que le manifeste indique le nom de cluster ou de groupe de nœuds correct. Exemple de sortie :

containers:- 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/example-cluster
   --balance-similar-node-groups
   --skip-nodes-with-system-pods=false

Assurez-vous de ne pas dépasser le nombre maximum de nœuds

Pour vérifier le nombre actuel de nœuds, exécutez la commande describe-nodegroup suivante :

aws eks describe-nodegroup --cluster-name example-cluster --nodegroup-name example-nodegroup

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

Si vous avez atteint le nombre minimum ou maximum de nœuds, exécutez la commande update-nodegroup-config suivante pour modifier les valeurs :

aws eks update-nodegroup-config \
    --cluster-name cluster-name \
    --nodegroup-name nodegroup-name \
    --scaling-config minSize=minvalue,maxSize=maxvalue,desiredSize=desiredvalue \

Remarque : Remplacez cluster-name par le nom de votre cluster et my-nodegroup-name par le nom de votre groupe de nœuds. Remplacez également minvalue par le nombre minimum de nœuds, maxvalue par le nombre maximum de nœuds et desiredvalue par la valeur souhaitée de nœuds.

Assurez-vous que vos nœuds peuvent rejoindre le cluster

Vérifiez si les nouvelles instances lancées par le groupe Amazon EC2 Auto Scaling peuvent rejoindre le cluster Amazon EKS. Si elles n'y parviennent pas, consultez la section Comment faire en sorte que mes composants master rejoignent mon cluster Amazon EKS ?

Assurez-vous d'utiliser le type d'instance de nœud correct

Pour vérifier si le Cluster Autoscaler peut répondre à la demande de ressource du pod avec les types d'instances de nœud actuels, exécutez la commande suivante :

kubectl -n example_namespace get pod example_podname -o yaml | grep resources -A6

Remarque : Remplacez example-cluster par le nom de votre cluster et example-podname par le nom de votre pod.

Exemple de sortie :

 containers:
        - image: registry.k8s.io/autoscaling/cluster-autoscaler:v1.32.1
          name: cluster-autoscaler
          resources:
            limits:
              cpu: 100m
              memory: 600Mi
            requests:
              cpu: 100m
              memory: 600Mi

Dans la sortie, vérifiez les valeurs des limites et des requêtes. Assurez-vous que les valeurs de processeur et de mémoire sont suffisamment élevées pour que le nœud puisse conserver le pod. Pour consulter les exigences de votre pod, exécutez la commande suivante :

kubectl describe pod podname -n namespace,

Remarque : Remplacez podname par le nom de votre pod et namespace par votre espace de noms.

Si les exigences du pod sont supérieures aux capacités du nœud, utilisez la commande kubectl edit pour augmenter les valeurs des limites et des requêtes pour les ressources mémoire dans le déploiement du Cluster Autoscaler. Vous pouvez également créer un nouveau groupe de nœuds avec un type d'instance différent qui répond aux besoins en ressources du pod. Pour plus d'informations sur kubectl edit, consultez la page kubectl edit sur le site Web de Kubernetes.

Vérifiez la configuration des rejets pour le nœud du groupe de nœuds

Pour vérifier si vous avez configuré des contaminations pour le nœud et si le pod peut les tolérer, exécutez la commande suivante :

kubectl describe node example_nodename | grep taint -A2

Remarque : Remplacez example_nodename par le nom de votre nœud.

Si vous avez configuré des rejets, supprimez les rejets définis sur le nœud. Pour connaître les étapes à suivre, consultez la section Votre pod est à l’état En attente dans Comment résoudre les problèmes liés à l'état du pod dans Amazon EKS ? Si le pod ne tolère pas les rejets, définissez la tolérance sur le pod. Pour plus d'informations, consultez la page Rejets et tolérances sur le site Web de Kubernetes.

Assurez-vous que la réduction de la taille n'est pas désactivée sur le nœud

Pour vérifier l'état de scale-down-disable sur votre nœud, exécutez la commande suivante :

kubectl describe node example_nodename | grep scale-down-disable

Remarque : Remplacez example_nodename par le nom de votre nœud.

Exemple de sortie :

cluster-autoscaler.kubernetes.io/scale-down-disabled: true

Si scale-down-disable est défini sur true, exécutez la commande suivante pour supprimer l'annotation du nœud et lui permettre de réduire sa taille :

kubectl annotate node example_nodename cluster-autoscaler.kubernetes.io/scale-down-disabled-

Remarque : Remplacez example_nodename par le nom de votre nœud.

Pour en savoir plus sur les étapes de dépannage du Cluster Autoscaler, consultez la page Questions fréquemment posées sur le site Web de GitHub.

AWS OFFICIELA mis à jour il y a 10 mois