Passer au contenu

Pourquoi les composants master n'ont-ils pas réussi à rejoindre mon cluster Amazon EKS ?

Lecture de 12 minute(s)
0

J’ai essayé de joindre des composants master à mon cluster Amazon Elastic Kubernetes Service (Amazon EKS). J'ai reçu un message d'erreur ou les nœuds n'ont pas rejoint le cluster.

Brève description

Lorsque vous essayez de joindre des composants master à votre cluster Amazon EKS, l'un des problèmes suivants peut se produire :

  • Lorsque vous créez un groupe de nœuds gérés dans le cluster EKS, le groupe de nœuds gérés passe à l'état Échec de la création. Les composants master ne rejoignent pas le cluster EKS et le message d'erreur « Instances failed to join the kubernetes cluster » s’affiche.
  • Les nouveaux composants master ne parviennent pas à rejoindre le cluster EKS lorsque vous mettez à niveau le groupe de nœuds gérés dans le cluster 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.

Utiliser le dossier d'exploitation d’automatisation de Systems Manager

Utilisez le dossier d'exploitation AWSSupport-TroubleshootEKSWorkerNode pour déterminer pourquoi vos composants master ne rejoignent pas votre cluster.

Important : Pour que l'automatisation fonctionne, vos composants master doivent être autorisés à accéder à AWS Systems Manager et à l'exécuter. Pour accorder l'autorisation, attachez la politique gérée par AWS AmazonSSMManagedInstanceCore au rôle Gestion des identités et des accès AWS (AWS IAM) qui correspond à votre profil d'instance Amazon Elastic Compute Cloud (EC2). Utilisez la politique AmazonSSMManagedInstanceCore comme configuration par défaut pour les groupes de nœuds gérés Amazon EKS que vous créez via eksctl. Utilisez le format [-a-zA-Z0-9]{1,100}$ pour le nom de votre cluster.

Pour lancer l'automatisation, procédez comme suit :

  1. Sur la console Systems Manager, ouvrez le dossier d'exploitation AWSSupport-TroubleshootEKSWorkerNode.
  2. Remarque : Consultez la section Détails du document du dossier d'exploitation pour plus d'informations sur le dossier d'exploitation.
  3. Vérifiez que vous avez défini la région AWS sur la même région que celle de votre cluster.
  4. Dans la section Paramètres d'entrée, saisissez le nom de votre cluster dans le champ ClusterName et l'ID de l'instance Amazon EC2 dans le champ WorkerID.
  5. (Facultatif) Dans le champ AutomationAssumeRole, saisissez l’Amazon Resource Name (ARN) du rôle IAM qui permet à l’automatisation d’effectuer les actions pour vous. Si vous ne spécifiez aucun rôle IAM, l'automatisation utilise les autorisations de l'utilisateur qui lance le dossier d’exploitation.
  6. Sélectionnez Exécuter.
  7. Consultez la section Sorties pour déterminer la cause du problème et les mesures que vous pouvez prendre pour le résoudre.

Vérifier la prise en charge du DNS pour votre Amazon VPC

Vérifiez que vous avez activé les noms d'hôte DNS et la résolution DNS dans Amazon Virtual Private Cloud (Amazon VPC) pour votre cluster EKS.

Vérifier que les composants master de votre profil d'instance disposent des autorisations appropriées

Associez les politiques gérées par AWS suivantes au rôle qui est associé aux composants master de votre profil d'instance :

Assurez-vous que la limite des autorisations ou la politique de contrôle des services (SCP) au niveau de l'organisation ou du compte n'empêchent pas le composant master d'effectuer des appels d'API.

Configurer les données utilisateur pour vos composants master

Remarque : Si vous utilisez AWS CloudFormation pour lancer vos composants master, il n’est pas nécessaire de configurer les données utilisateur pour vos composants master. À la place, utilisez la console CloudFormation pour lancer des nœuds Amazon Linux autogérés.

Si vous utilisez des groupes de nœuds gérés pour lancer votre composant master, il n’est pas nécessaire de configurer de données utilisateur avec des Amazon Machine Images (AMI) Amazon Linux optimisées pour Amazon EKS. Configurez les données utilisateur uniquement lorsque vous utilisez des AMI personnalisées pour lancer vos composants master via des groupes de nœuds gérés.

Si vous utilisez des groupes de nœuds gérés par Amazon EKS avec un modèle de lancement personnalisé, indiquez les données utilisateur correctes dans le modèle de lancement. Si le cluster Amazon EKS est un cluster entièrement privé qui utilise des points de terminaison de VPC pour se connecter, vous devez mettre à jour les données utilisateur. Spécifiez l'autorité de certification (CA), le point de terminaison du serveur API et l'adresse IP du cluster DNS dans les données utilisateur.

Exemple de configuration des données utilisateur :

#!/bin/bash
set -ex
B64_CLUSTER_CA=CA-CERT
API_SERVER_URL=ENDPOINT
K8S_CLUSTER_DNS_IP=IP-ADDRESS
/etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArguments} —b64-cluster-ca $B64_CLUSTER_CA —apiserver-endpoint $API_SERVER_URL —dns-cluster-ip $K8S_CLUSTER_DNS_I

Remarque : Remplacez CA-CERT, ENDPOINT et IP-ADDRESS par les valeurs de votre instance. Remplacez également ${ClusterName} par le nom de votre cluster EKS et ${BootstrapArguments} par des valeurs de bootstrap supplémentaires, si nécessaire.

Si vous devez fournir des données utilisateur pour transmettre des arguments au fichier bootstrap.sh pour l'AMI Linux/Bottlerocket optimisée pour Amazon EKS, spécifiez un ID d'AMI dans ImageField de votre modèle de lancement.

Pour configurer les données utilisateur pour vos composants master, spécifiez les données utilisateur lorsque vous lancez vos instances EC2.

Par exemple, si vous utilisez un outil tiers tel que Terraform, mettez à jour le champ de données utilisateur pour lancer vos composants master EKS.

Exemple de configuration des données utilisateur :

#!/bin/bash
set -o xtrace
/etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArguments}

Remarque : Remplacez ${ClusterName} par le nom de votre cluster EKS et ${BootstrapArguments} par des valeurs de bootstrap supplémentaires, si nécessaire.

Si vous utilisez une AMI Amazon Linux 2023, ajoutez les paramètres minimaux requis aux données utilisateur au format suivant :

MIME-Version: 1.0Content-Type: multipart/mixed; boundary="//"

--//
Content-Type: application/node.eks.aws

---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    apiServerEndpoint: https://example.com
    certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
    cidr: 10.100.0.0/16
    name: my-cluster

--//--

Vérifiez que vous avez correctement configuré la mise en réseau pour vos sous-réseaux Amazon VPC et que vos composants master se trouvent dans le même Amazon VPC que votre cluster EKS

Si vous utilisez une passerelle Internet, vérifiez que vous l'avez correctement connectée à la table de routage.

Si vous utilisez une passerelle NAT, assurez-vous que vous l’avez correctement configurée dans un sous-réseau public. Vérifiez également que vous avez correctement configuré la table de routage.

Si vous utilisez des points de terminaison privés de VPC pour un cluster entièrement privé, assurez-vous de disposer des points de terminaison d’interface suivants :

  • com.amazonaws.region.ec2
  • com.amazonaws.region.ecr.api
  • com.amazonaws.region.ecr.dkr
  • com.amazonaws.region.sts

Assurez-vous également que vous disposez du point de terminaison de passerelle, com.amazonaws.region.s3.

Vous pouvez restreindre la politique de point de terminaison de VPC de passerelle Amazon Simple Storage Service (Amazon S3) pour Amazon ECR. Pour plus d'informations, consultez la section Autorisations de compartiment Amazon S3 minimales pour Amazon ECR.

Les pods que vous configurez avec des rôles IAM pour les comptes de service obtiennent des informations d'identification à partir d’un appel d’API du service de jetons de sécurité AWS (AWS STS). S'il n'y a pas d'accès Internet sortant, vous devez créer et utiliser un point de terminaison de VPC AWS STS dans votre VPC.

Le groupe de sécurité pour le point de terminaison de VPC doit disposer d’une règle entrante qui autorise le trafic à partir du port 443. Pour en savoir plus, consultez la section Contrôler le trafic vers vos ressources AWS à l’aide de groupes de sécurité.

Assurez-vous que la politique associée au point de terminaison de VPC dispose des autorisations requises pour effectuer des appels d'API vers le service spécifique.

Dans la section Mise en réseau du cluster EKS, identifiez les sous-réseaux associés à votre cluster. Vérifiez qu'ils appartiennent au même VPC.

Vous devez créer des points de terminaison distincts pour chaque service AWS que vous utilisez. Pour obtenir la liste des points de terminaison pour les services AWS courants, consultez le tableau figurant dans la section Exigences relatives aux pods. Vous pouvez également créer un service de point de terminaison en fonction de votre cas d’utilisation.

En outre, vous pouvez configurer différents sous-réseaux dans lesquels lancer vos composants master. Les sous-réseaux doivent exister dans le même Amazon VPC et vous devez les identifier correctement. Amazon EKS gère automatiquement les identifications uniquement pour les sous-réseaux que vous configurez lors de la création du cluster. Pour plus d'informations, consultez la section Exigences et considérations relatives aux sous-réseaux.

Mettre à jour le ConfigMap aws-auth avec le NodeInstanceRole de vos composants master

Vérifiez que vous avez correctement configuré le ConfigMap aws-auth avec le rôle IAM de votre composant master et non avec le profil d’instance.

Exécutez la commande suivante :

kubectl describe configmap -n kube-system aws-auth

Si vous n'avez pas configuré correctement le ConfigMap aws-auth, le message d'erreur suivant s'affiche :

« 571 reflector.go:153] k8s.io/kubernetes/pkg/kubelet/kubelet.go:458 : Failed to list *v1.Node: Unauthorized »

Si vous utilisez la méthode d'authentification de l'API EKS, créez une entrée d'accès pour NodeInstanceRole. Dans Type, sélectionnez EC2_linux.

Respecter les exigences relatives aux groupes de sécurité de vos composants master

Vérifiez que vous avez configuré le groupe de sécurité de votre plan de contrôle et le groupe de sécurité du composant master avec les paramètres recommandés pour le trafic entrant et sortant. Vérifiez également que vous avez configuré les règles de votre liste de contrôle d'accès au réseau (ACL réseau) pour autoriser le trafic en provenance et à destination de 0.0.0.0/0 pour les ports 80, 443 et 1025-65535.

Définir les identifications pour vos composants master

Pour la propriété Identification de vos composants master, définissez Clé sur kubernetes.io/cluster/clusterName et Valeur sur détenu.

Pour plus d'informations, consultez la section Exigences et considérations relatives au VPC.

Vérifier si vos composants master peuvent atteindre le point de terminaison du serveur API pour votre cluster EKS

Lancez des composants master dans un sous-réseau associé à une table de routage qui redirige vers le point de terminaison de l'API via une passerelle NAT ou Internet. Lorsque vous lancez vos composants master sur un réseau privé restreint, vérifiez que vos composants master peuvent atteindre le point de terminaison du serveur API EKS. Lorsque vous lancez des composants master avec un Amazon VPC qui utilise un DNS personnalisé au lieu de AmazonProvidedDNS, il est possible qu'ils ne puissent pas résoudre le point de terminaison.

Remarque : Le point de terminaison n'est pas résolu lorsque vous désactivez l'accès public au point de terminaison et que vous activez uniquement l'accès privé. Pour plus d'informations, consultez la section Activation de la résolution DNS pour les points de terminaison du cluster Amazon EKS.

Vérifier si Kubelet peut atteindre les points de terminaison requis

Exécutez les commandes suivantes pour déterminer si kubelet peut atteindre les points de terminaison :

$ nc -vz ec2.region.amazonaws.com 443
$ nc -vz dkr.ecr.region.amazonaws.com 443
$ nc -vz api.ecr.region.amazonaws.com 443
$ nc -vz s3.region.amazonaws.com 443

Remarque : Remplacez region par votre région.

Vérifier que vous avez correctement configuré le rôle de cluster

Vous devez associer AmazonEKSclusterPolicy au rôle IAM de votre cluster Amazon EKS. De plus, la relation d’approbation de votre cluster doit autoriser le service eks.amazonaws.com pour sts:AssumeRole.

Exemple de politique d’approbation :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Confirmer que vous avez activé les points de terminaison STS régionaux

Si le cluster se trouve dans une région qui prend en charge les points de terminaison STS, activez le point de terminaison STS régional pour authentifier le kubelet. Le kubelet peut ensuite créer l’objet nœud.

Assurez-vous que vous avez configuré votre AMI afin qu'elle fonctionne avec EKS et que l'AMI inclut les composants requis

L'AMI Amazon Linux optimisée pour Amazon EKS contient les composants nécessaires pour fonctionner avec le cluster EKS. Si l’AMI des composants master n’est pas le service AMI Amazon Linux optimisé pour Amazon EKS, vérifiez que les composants Kubernetes suivants sont à l’état Actif :

  • kubelet
  • AWS IAM Authenticator
  • Docker (Amazon EKS versions 1.23 et antérieures)
  • containerd

Utiliser SSH pour se connecter à l’instance de composant master EKS et consulter les journaux de l'agent kubelet

Vérifiez que vous avez configuré l'agent kubelet en tant que service systemd dans l'instance de composant master EKS.

Pour valider vos journaux kubelet, exécutez la commande suivante :

journalctl -f -u kubelet

Pour résoudre les problèmes, consultez la section Résoudre les problèmes liés aux clusters et nœuds Amazon EKS.

Utiliser le script de collecteur de journaux Amazon EKS pour résoudre des erreurs

Utilisez les fichiers journaux et les journaux du système d'exploitation pour résoudre des problèmes liés à votre cluster Amazon EKS. Les composants master du cluster Amazon EKS stockent les journaux d'initialisation cloud-init dans /var/log/cloud-init-output.log et /var/log/cloud-init.log.

Pour collecter des journaux à l’aide du script de collecteur de journaux EKS, vous devez utiliser SSH pour vous connecter au composant master concerné. Puis, exécutez le script suivant :

curl -O https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/log-collector-script/linux/eks-log-collector.sh

sudo bash eks-log-collector.sh

Vérifier que les sous-réseaux Amazon VPC du composant master disposent d’adresses IP disponibles

Si votre Amazon VPC ne dispose pas d’adresses IP disponibles, vous pouvez associer un CIDR secondaire à votre Amazon VPC existant. Pour plus d'informations, consultez la section Afficher les exigences de mise en réseau d'Amazon EKS pour le VPC et les sous-réseaux. L'AMI optimisée pour EKS contient les composants requis pour fonctionner avec le cluster EKS.

AWS OFFICIELA mis à jour il y a 2 mois