Come posso tracciare l'ID istanza di un nodo worker Amazon EKS terminato in base al relativo NodeName?

7 minuti di lettura
0

Un incidente ha interrotto i nodi worker nel mio cluster Amazon EKS e voglio far corrispondere i nomi dei nodi terminati al loro ID istanza.

Breve descrizione

In Amazon EKS, il nome di un nodo viene registrato e visualizzato utilizzando il relativo PrivateDnsName. Questo nome segue un formato simile a ip-172-31-6-187.eu-west-1.compute.internal.

Puoi usare il nome di un nodo per trovare il suo ID istanza. Tuttavia, il comando predefinito kubectl get nodes non restituisce l'ID istanza nel suo output. Vedi il seguente esempio di output:

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

Per recuperare l'ID istanza dei nodi worker attivi, aggiungi ulteriori colonne come mostrato nel comando seguente:

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

Otterrai un output simile al seguente:

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

Tuttavia, questo comando non funziona per i nodi terminati.

Puoi anche utilizzare TerminateInstances o TerminateInstanceInAutoScalingGroup come EventName in AWS CloudTrail per restituire l'ID istanza. Tuttavia, questi comandi da soli non restituiscono il nome di un nodo Amazon EKS.

Pertanto, è necessario prima eseguire un comando separato per recuperare il NodeName (PrivateDnsName) di un nodo. Quindi, usa quel nome per tenere traccia dell'ID istanza del nodo. Per trovare l'ID istanza per i nodi worker precedentemente terminati, cerca nei log del piano di controllo (control-plane) di Amazon EKS utilizzando gli approfondimenti sui file di log Amazon CloudWatch. A tale scopo, è necessario attivare la registrazione del piano di controllo prima della terminazione del nodo. Se non hai attivato la registrazione del piano di controllo, usa CloudTrail.

Risoluzione

Nota: se ricevi messaggi di errore durante l'esecuzione dei comandi dell'Interfaccia della linea di comando AWS (AWS CLI), assicurati di utilizzare la versione più recente di AWS CLI.

Recupera il NodeName per i tuoi nodi

Per entrambi i metodi seguenti, è necessario conoscere il NodeName di un nodo terminato per recuperare il relativo ID istanza. Per recuperare un elenco di nodi Amazon EKS terminati in un determinato intervallo di tempo, utilizza l'editor di query degli approfondimenti sui file di log Amazon CloudWatch:

1.    Apri la console CloudWatch.

2.    Nel pannello di navigazione, scegli Logs (Log) e poi Log Insights (Approfondimenti sui file di log).

Nota: nella pagina Logs Insights (Approfondimenti sui file di log), l'editor di query contiene una query predefinita che restituisce i 20 log eventi più recenti.

3.    Elimina la query predefinita. Quindi, inserisci il seguente comando:

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.    Nell'elenco a discesa Select log group(s) (Seleziona uno o più gruppi di log), scegli i gruppi di log del cluster Amazon EKS che desideri interrogare.

Nota: il tuo gruppo di log è simile a /aws/eks/cluster_name/cluster. In questo esempio, sostituisci cluster_name con il nome del tuo cluster Amazon EKS.

5.    Usa il selettore dell'intervallo di tempo per selezionare un periodo di tempo che desideri interrogare.

6.    Seleziona Run (Esegui) per visualizzare i risultati.

Otterrai un output simile al seguente:

# @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

Usa gli approfondimenti sui file di log Amazon CloudWatch per cercare i log dei piani di controllo di Amazon EKS

Usa gli approfondimenti sui file di log Amazon CloudWatch per cercare nei dati di log del piano di controllo Amazon EKS gli eventi che hanno registrato il NodeName di un nodo. Per visualizzare questi log nei File di log Amazon CloudWatch, devi attivare la registrazione del piano di controllo di Amazon EKS prima della terminazione del nodo e mantenerla attiva.

Ad esempio, supponiamo di voler recuperare l'ID istanza di un nodo con il nome ip-192-168-132-83.eu-west-1.compute.internal. La data di terminazione di questo nodo è stata quattro giorni fa. È possibile utilizzare una delle due query per recuperare l'ID istanza dal NodeName.

Innanzitutto, segui questi passaggi per eseguire una query con gli approfondimenti sui file di log Amazon CloudWatch:

1.    Apri la console CloudWatch.

2.    Nel pannello di navigazione, scegli Logs (Log) e poi Log Insights (Approfondimenti sui file di log).

Nota: nella pagina Logs Insights (Approfondimenti sui file di log), l'editor di query contiene una query predefinita che restituisce i 20 log eventi più recenti.

3.    Elimina la query predefinita. Quindi, inserisci una delle seguenti query per recuperare l'ID istanza dal NodeName:

Query 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

Query 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.    Nell'elenco a discesa Select log group(s) (Seleziona uno o più gruppi di log), scegli i gruppi di log del cluster Amazon EKS che desideri interrogare.

Nota: il tuo gruppo di log è simile a /aws/eks/cluster_name/cluster. In questo esempio, sostituisci cluster_name con il nome del tuo cluster Amazon EKS.

5.    Usa il selettore dell'intervallo di tempo per selezionare un periodo di tempo che desideri interrogare.

6.    Seleziona Run (Esegui) per visualizzare i risultati.

Otterrai un output in base alla query che hai eseguito.

La query 1 restituisce un output simile al seguente:

# @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 query 2 restituisce un output simile al seguente:

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

Usa le chiamate API come eventi in CloudTrail

Puoi recuperare l'ID istanza di un nodo dal relativo NodeName con una combinazione di chiamate API in CloudTrail. Usa sia RunInstances che TerminateInstances come EventName. Queste chiamate API eseguono le seguenti operazioni:

TerminateInstances: recupera tutti gli ID istanza dal momento dell'incidente che ha interrotto i nodi worker. Contiene solo l'ID istanza.

RunInstances: contiene sia l'ID istanza che il NodeName.

Innanzitutto, utilizza il seguente comando per visualizzare tutti i nodi worker terminati nell'intervallo di tempo dell'incidente che desideri controllare. Sostituisci i valori start-time (ora di inizio) ed end-time (ora di fine) per impostare l'intervallo di tempo pertinente:

% 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}'

Otterrai un output simile al seguente:

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

Utilizza il seguente comando per recuperare il risultato della chiamata API RunInstances durante l'intervallo di tempo dell'incidente che desideri controllare. Sostituisci i valori start-time (ora di inizio) ed end-time (ora di fine) per impostare l'intervallo di tempo pertinente:

% 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}'

Nota: per ottenere le informazioni più complete, imposta l'ora di inizio sul momento in cui sono stati creati i nodi worker.

Otterrai un output simile al seguente:

{
  "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 UFFICIALE
AWS UFFICIALEAggiornata un anno fa