Comment suivre l'ID d'instance d'un composant master Amazon EKS résilié à l'aide de son NodeName ?

Lecture de 7 minute(s)
0

Un incident a mis fin à des composants master dans mon cluster Amazon EKS, et je souhaite faire correspondre les noms des nœuds résiliés à leur identifiant d'instance.

Brève description

Dans Amazon EKS, le nom d'un nœud est enregistré et affiché à l'aide de PrivateDnsName. Ce nom suit un format similaire à ip-172-31-6-187.eu-west-1.compute.internal.

Vous pouvez utiliser le nom d'un nœud pour trouver son ID d'instance. Cependant, la commande par défaut kubectl get nodes ne renvoie pas d'ID d'instance dans sa sortie. Consultez l'exemple de sortie suivant :

NAME                                           STATUS   ROLES    AGE   VERSION
ip-192-168-132-83.eu-west-1.compute.internal   Ready    <none>   37m   v1.22.12-eks-ba74326
ip-192-168-96-83.eu-west-1.compute.internal    Ready    <none>   37m   v1.22.12-eks-ba74326

Pour récupérer l'ID d'instance des composants master actifs, ajoutez des colonnes supplémentaires comme indiqué dans la commande suivante :

kubectl get nodes -o custom-columns=Name:.metadata.name,Instance:.spec.providerID

Vous recevez un résultat similaire au suivant :

Name                                            Instance
ip-192-168-104-154.eu-west-1.compute.internal   aws:///eu-west-1a/i-0cb3f1ceeb038fb6c
ip-192-168-157-89.eu-west-1.compute.internal    aws:///eu-west-1b/i-02e80d4889b6ccffa

Toutefois, cette commande ne fonctionne pas pour les nœuds qui sont terminés.

Vous pouvez également utiliser TerminateInstances ou TerminateInstanceInAutoScalingGroup comme EventName dans AWS CloudTrail pour renvoyer l'ID de l'instance. Toutefois, ces commandes en elles-mêmes ne renvoient pas le nom d'un nœud Amazon EKS.

Par conséquent, vous devez d'abord exécuter une commande distincte pour récupérer le NodeName (PrivateDNSName) d'un nœud. Utilisez ensuite ce nom pour suivre l'ID d'instance du nœud. Pour trouver l'ID d'instance des composants master précédemment résiliés, effectuez une recherche dans les journaux du plan de contrôle Amazon EKS avec Amazon CloudWatch Logs Insights. Pour ce faire, vous devez activer la journalisation du plan de contrôle avant la terminaison du nœud. Si la journalisation du plan de contrôle n'est pas activée, utilisez CloudTrail.

Résolution

Remarque : si vous recevez des erreurs lors de l'exécution de l'interface de la ligne de commande AWS (AWS CLI), assurez-vous d'utiliser la version la plus récente d'AWS CLI.

Récupérez le NodeName pour vos nœuds

Pour les deux méthodes suivantes, vous devez connaître le NodeName d'un nœud résilié pour récupérer son ID d'instance. Pour récupérer la liste des nœuds Amazon EKS résiliés sur une période donnée, utilisez l'éditeur de requêtes CloudWatch Log Insight :

1.    Ouvrez la console CloudWatch.

2.    Dans le panneau de navigation, choisissez Logs (Journaux), puis Log Insights (Informations de journaux).

Remarque : Sur la page Logs Insights, l'éditeur de requêtes contient une requête par défaut qui renvoie les 20 événements de journaux les plus récents.

3.    Supprimez la requête par défaut. Puis, saisissez la commande suivante :

fields @timestamp, objectRef.name as NodeName
| filter @logStream like /^kube-apiserver-audit/
| filter objectRef.resource = "nodes"
| filter responseStatus.code = 200 or responseStatus.code = 201
| sort @timestamp desc
| filter verb like /delete/

4.    Dans la liste déroulante Sélectionner les groupes de journaux, choisissez les groupes de journaux du cluster Amazon EKS que vous souhaitez interroger.

Remarque : Votre groupe de journaux ressemble à /aws/eks/cluster_name/cluster. Dans cet exemple, remplacez cluster_name par votre propre nom de cluster Amazon EKS.

5.    Utilisez le sélecteur d'intervalle de temps pour sélectionner la période que vous souhaitez interroger.

6.    Choisissez Run (Exécuter) pour afficher les résultats.

Vous recevez un résultat similaire au suivant :

# @timestamp                    NodeName                                     
1 2023-01-23T08:03:03.062+00:00 ip-192-168-132-83.eu-west-1.compute.internal 
2 2023-01-23T19:03:41.848+00:00 ip-192-168-0-141.eu-west-1.compute.internal

Utilisez CloudWatch Logs Insights pour effectuer des recherches dans les journaux du plan de contrôle Amazon EKS

Utilisez CloudWatch Logs Insights pour rechercher dans les données du journal du plan de contrôle Amazon EKS les événements qui ont enregistré le NodeName d'un nœud. Pour consulter ces journaux dans Amazon CloudWatch Logs, vous devez activer la journalisation du plan de contrôle Amazon EKS avant la fermeture du nœud, et elle doit rester activée.

Supposons, par exemple, que vous souhaitiez récupérer l'ID d'instance d'un nœud portant le nom ip-192-168-132-83.eu-west-1.compute.internal. La date de fin de ce nœud était il y a quatre jours. Vous pouvez utiliser l'une des deux requêtes pour récupérer l'ID d'instance à partir du NodeName.

Tout d'abord, procédez comme suit pour exécuter une requête CloudWatch Logs Insights :

1.    Ouvrez la console CloudWatch.

2.    Dans le panneau de navigation, choisissez Logs (Journaux), puis Log Insights (Informations de journaux).

Remarque : Sur la page Logs Insights, l'éditeur de requêtes contient une requête par défaut qui renvoie les 20 événements de journaux les plus récents.

3.    Supprimez la requête par défaut. Entrez ensuite l'une des requêtes suivantes pour récupérer l'ID d'instance à partir du NodeName :

Requête 1

fields @timestamp, objectRef.name as NodeName, responseObject.spec.providerID as providerID
| filter @message like 'ip-192-168-132-83.eu-west-1.compute.internal' and @message like 'i-'
| sort responseObject.spec.providerID desc
| limit 10

Requête 2

fields @timestamp, objectRef.name as NodeName, user.extra.sessionName.0 as ID
| filter @message like 'ip-192-168-132-83.eu-west-1.compute.internal' and @message like 'i-'
| sort user.extra.sessionName.0 desc
| limit 5

4.    Dans la liste déroulante Sélectionner les groupes de journaux, choisissez les groupes de journaux du cluster Amazon EKS que vous souhaitez interroger.

Remarque : Votre groupe de journaux ressemble à /aws/eks/cluster_name/cluster. Dans cet exemple, remplacez cluster_name par votre propre nom de cluster Amazon EKS.

5.    Utilisez le sélecteur d'intervalle de temps pour sélectionner la période que vous souhaitez interroger.

6.    Choisissez Run (Exécuter) pour afficher les résultats.

Vous recevez un résultat basé sur la requête que vous avez exécutée.

La requête 1 renvoie un résultat similaire au suivant :

# @timestamp                    NodeName                                     providerID
1 2023-01-23T08:03:03.062+00:00 ip-192-168-132-83.eu-west-1.compute.internal aws:///eu-west-1a/i-06c893718d4123396

La requête 2 renvoie un résultat similaire au suivant :

# @timestamp                    NodeName                                     ID
1 2023-01-22T15:00:32.637+00:00 ip-192-168-11-247.eu-west-1.compute.internal i-06c893718d4123396

Utiliser les appels d'API en tant qu'événements dans CloudTrail

Vous pouvez récupérer l'ID d'instance d'un nœud à partir de son NodeName à l'aide d'une combinaison d'appels d'API dans CloudTrail. Utilisez RunInstances et TerminateInstances comme EventName. Ces appels d'API effectuent les opérations suivantes :

TerminateInstances : permet de récupérer tous les identifiants d'instance depuis l'incident qui les a interrompus. Il contient uniquement l'ID de l'instance.

RunInstances : contient à la fois l'ID de l'instance et le NodeName.

Tout d'abord, utilisez la commande suivante pour voir tous les composants master interrompus pendant la période de l'incident que vous souhaitez auditer. Remplacez les valeurs d'heure de début et d'heure de fin pour définir la période appropriée :

% aws cloudtrail lookup-events \
  --lookup-attributes AttributeKey=EventName,AttributeValue=TerminateInstances AttributeKey=ResourceType,AttributeValue=AWS::EC2::Instance \
  --start-time "January 27, 2023, 00:00:00" \
  --end-time "January 27, 2023, 23:59:00" | jq '.Events [] | .CloudTrailEvent | fromjson | .responseElements | .instancesSet | .items | .[]? | {InstanceID: .instanceId, NodeName: .privateDnsName}'

Vous recevez un résultat similaire au suivant :

{
  "InstanceID": "i-0926c5d4216fd934d",
  "NodeName": null
}
{
  "InstanceID": "i-00da28f580e28ff4f",
  "NodeName": null
}

Utilisez la commande suivante pour récupérer le résultat de l'appel d'API RunInstances pendant la période de l'incident que vous souhaitez auditer. Remplacez les valeurs d'heure de début et d'heure de fin pour définir la période appropriée :

% aws cloudtrail lookup-events \
  --lookup-attributes AttributeKey=EventName,AttributeValue=RunInstances AttributeKey=ResourceType,AttributeValue=AWS::EC2::Instance \
  --start-time "January 27, 2023, 00:00:00" \
  --end-time "January 27, 2023, 23:59:00" | jq '.Events [] | .CloudTrailEvent | fromjson | .responseElements | .instancesSet | .items | .[]? | {InstanceID: .instanceId, NodeName: .privateDnsName}'

Remarque : Pour obtenir les informations les plus complètes, définissez l'heure de début comme celle de la création des composants master.

Vous recevez un résultat similaire au suivant :

{
  "InstanceID": "i-0926c5d4216fd934d",
  "NodeName": "ip-192-168-96-83.eu-west-1.compute.internal"
}
{
  "InstanceID": "i-00da28f580e28ff4f",
  "NodeName": "ip-192-168-132-83.eu-west-1.compute.internal"
}

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an