Wie verfolge ich die Instance-ID eines terminierten Amazon-EKS-Worker-Knotens anhand seines NodeName?

Lesedauer: 6 Minute
0

Ein Vorfall hat Worker-Knoten in meinem Amazon-EKS-Cluster beendet, und ich möchte die Namen der beendeten Knoten ihrer Instance-ID zuordnen.

Kurzbeschreibung

In Amazon EKS wird der Name eines Knotens aufgezeichnet und unter Verwendung seines PrivateDnsName angezeigt. Dieser Name folgt einem Format, das ip-172-31-6-187.eu-west-1.compute.internal ähnelt.

Sie können den Namen eines Knotens verwenden, um seine Instance-ID zu finden. Der Standardbefehl kubectl get nodes gibt jedoch in seiner Ausgabe keine Instance-ID zurück. Ein Beispiel für eine Ausgabe finden Sie im Folgenden:

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

Um die Instance-ID der aktiven Worker-Knoten abzurufen, fügen Sie zusätzliche Spalten hinzu, wie im folgenden Befehl gezeigt:

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

Sie erhalten eine Ausgabe, die der folgenden ähnelt:

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

Dieser Befehl funktioniert jedoch nicht für Knoten, die terminiert sind.

Sie können auch TerminateInstances oder TerminateInstanceInAutoScalingGroup als EventName in AWS CloudTrail verwenden, um die Instance-ID zurückzugeben. Diese Befehle allein geben jedoch nicht den Namen eines Amazon-EKS-Knotens zurück.

Daher müssen Sie zuerst einen separaten Befehl ausführen, um den NodeName (PrivateDnsName) eines Knotens abzurufen. Verwenden Sie dann diesen Namen, um die Instance-ID des Knotens zu verfolgen. Um die Instance-ID für zuvor beendete Worker-Knoten zu finden, durchsuchen Sie die Protokolle der Amazon-EKS-Steuerungsebene mit Amazon CloudWatch Logs Insights. Dazu müssen Sie die Protokollierung der Steuerungsebene vor der Knotenbeendigung aktivieren. Wenn Sie die Protokollierung der Steuerungsebene nicht aktiviert haben, verwenden Sie CloudTrail.

Lösung

Hinweis: Wenn Sie beim Ausführen von AWS-Command-Line-Interface-Befehlen (AWS CLI) Fehler erhalten, stellen Sie sicher, dass Sie die neueste AWS-CLI-Version verwenden.

NodeName für Ihre Knoten abrufen

Für die beiden folgenden Methoden müssen Sie den NodeName eines terminierten Knotens kennen, um dessen Instance-ID abzurufen. Verwenden Sie den CloudWatch Log Insight Query Editor, um eine Liste der beendeten Amazon-EKS-Knoten aus einem bestimmten Zeitraum abzurufen:

1.    Öffnen Sie die CloudWatch-Konsole.

2.    Wählen Sie im Navigationsbereich Protokolle und dann Logs Insights aus.

Hinweis: Auf der Seite Logs Insights enthält der Abfrage-Editor eine Standardabfrage, die die 20 neuesten Protokollereignisse zurückgibt.

3.    Löschen Sie die Standardabfrage. Geben Sie dann den folgenden Befehl ein:

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.    Wählen Sie in der Dropdown-Liste Protokollgruppe(n) auswählen die Amazon-EKS-Cluster-Protokollgruppen aus, die Sie abfragen möchten.

Hinweis: Ihre Protokollgruppe sieht ähnlich aus wie /aws/eks/cluster_name/cluster. In diesem Beispiel ersetzen Sie cluster_name durch Ihren eigenen Amazon-EKS-Clusternamen.

5.    Verwenden Sie die Zeitintervallauswahl, um einen Zeitraum auszuwählen, den Sie abfragen möchten.

6.    Wählen Sie Ausführen, um die Ergebnisse anzuzeigen.

Sie erhalten eine Ausgabe, die der folgenden ähnelt:

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

Verwenden Sie CloudWatch Logs Insights, um die Protokolle der Amazon-EKS-Steuerungsebene zu durchsuchen

Verwenden Sie CloudWatch Logs Insights, um die Protokolldaten der Amazon-EKS-Steuerungsebene nach Ereignissen zu durchsuchen, bei denen der NodeName eines Knotens aufgezeichnet wurde. Um diese Protokolle in Amazon CloudWatch Logs anzeigen zu können, müssen Sie die Amazon-EKS-Steuerungsebenenprotokollierung vor der Knotenbeendigung aktivieren und sie muss aktiviert bleiben.

Angenommen, Sie möchten die Instance-ID eines Knotens mit dem Namen ip-192-168-132-83.eu-west-1.compute.internal abrufen. Das Kündigungsdatum dieses Knotens war vor vier Tagen. Sie können eine von zwei Abfragen verwenden, um die Instanz-ID aus dem NodeName abzurufen.

Gehen Sie zunächst wie folgt vor, um eine CloudWatch-Logs-Insights-Abfrage auszuführen:

1.    Öffnen Sie die CloudWatch-Konsole.

2.    Wählen Sie im Navigationsbereich Protokolle und dann Logs Insights aus.

Hinweis: Auf der Seite Logs Insights enthält der Abfrage-Editor eine Standardabfrage, die die 20 neuesten Protokollereignisse zurückgibt.

3.    Löschen Sie die Standardabfrage. Geben Sie dann eine der folgenden Abfragen ein, um die Instance-ID aus dem NodeName abzurufen:

Abfrage 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

Abfrage 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.    Wählen Sie in der Dropdown-Liste Protokollgruppe(n) auswählen die Amazon-EKS-Cluster-Protokollgruppen aus, die Sie abfragen möchten.

Hinweis: Ihre Protokollgruppe sieht ähnlich aus wie /aws/eks/cluster_name/cluster. In diesem Beispiel ersetzen Sie cluster_name durch Ihren eigenen Amazon-EKS-Clusternamen.

5.    Verwenden Sie die Zeitintervallauswahl, um einen Zeitraum auszuwählen, den Sie abfragen möchten.

6.    Wählen Sie Ausführen, um die Ergebnisse anzuzeigen.

Sie erhalten eine Ausgabe, die auf der von Ihnen ausgeführten Abfrage basiert.

Abfrage 1 gibt eine Ausgabe zurück, die der folgenden ähnlich ist:

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

Abfrage 2 gibt eine Ausgabe zurück, die der folgenden ähnlich ist:

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

API-Aufrufe als Ereignisse in CloudTrail verwenden

Sie können die Instance-ID eines Knotens anhand seines NodeName mit einer Kombination von API-Aufrufen in CloudTrail abrufen. Verwenden Sie sowohl RunInstances als auch TerminateInstances als EventName. Diese API-Aufrufe haben folgende Funktionen:

TerminateInstances: Damit werden alle Instance-IDs aus dem Zeitpunkt des Incidents abgerufen, der sie beendet hat. Dies enthält nur die Instance-ID.

RunInstances: Dies enthält sowohl die Instance-ID als auch den NodeName.

Verwenden Sie zunächst den folgenden Befehl, um alle beendeten Worker-Knoten aus dem Zeitraum des Vorfalls zu sehen, den Sie überprüfen möchten. Ersetzen Sie die Werte für Startzeit und Endzeit, um Ihren entsprechenden Zeitrahmen festzulegen:

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

Sie erhalten eine Ausgabe, die der folgenden ähnelt:

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

Verwenden Sie den folgenden Befehl, um das Ergebnis des **RunInstances-API-**Aufrufs während des Zeitrahmens des Vorfalls abzurufen, den Sie überprüfen möchten. Ersetzen Sie die Werte für Startzeit und Endzeit, um Ihren entsprechenden Zeitrahmen festzulegen:

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

Hinweis: Um die umfassendsten Informationen zu erhalten, legen Sie die Startzeit auf den Zeitpunkt fest, zu dem die Worker-Knoten erstellt wurden.

Sie erhalten eine Ausgabe, die der folgenden ähnelt:

{
  "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 OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr