終了した Amazon EKS ワーカーノードのインスタンス ID を NodeName で追跡するにはどうすればよいですか。

所要時間3分
0

Amazon EKS クラスターのワーカーノードがインシデントによって終了されたので、終了したノードの名前をインスタンス ID と一致させたいのですが。

簡単な説明

Amazon EKS では、ノードの名前が記録され、その PrivateDnsName を使用して表示されます。この名前は、 ip-172-31-6-187.eu-west-1.compute.internal のような形式に従います

ノードの名前を使用して、そのインスタンス ID を見つけることができます。ただし、デフォルトの kubectl get nodes コマンドは、出力でインスタンス ID を返しません。次の出力例を参照してください。

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

アクティブなワーカーノードのインスタンス ID を取得するには、次のコマンドに示すように列を追加します。

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

次のような出力が表示されます。

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

ただし、このコマンドは、終了したノードでは機能しません。

TerminateInstances または TerminateInstanceInAutoScalingGroup を AWS CloudTrail の EventName として使用して、インスタンス ID を返すこともできます。ただし、これらのコマンド自体は Amazon EKS ノードの名前を返しません。

したがって、最初に別のコマンドを実行して、ノードの NodeName (PrivateDnsName) を取得する必要があります。次に、その名前を使用してノードのインスタンス ID を追跡します。以前に終了したワーカーノードのインスタンス ID を見つけるには、Amazon CloudWatch Logs Insights を使用して Amazon EKS コントロールプレーンログを検索します。これを行うには、ノードの終了前にコントロールプレーンのログを有効にする必要があります。コントロールプレーンのログ記録を有効にしていない場合は、CloudTrail を使用します。

解決方法

注意: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

ノードの NodeName を取得します

次のいずれの方法でも、インスタンス ID を取得するには、終了したノードの NodeName を知っている必要があります。特定の時間範囲から終了した Amazon EKS ノードのリストを取得するには、CloudWatch Log Insight Query Editor を使用します。

1.    CloudWatch コンソールを開きます。

2.    ナビゲーションペインで、[Logs] (ログ) を選択してから、[Logs Insights] (ログインサイト) を選択します。

注: [Logs Insights] (ログインサイト) ページのクエリエディターには、最新の 20 個のログイベントを返す既定のクエリが含まれています。

3.    デフォルトクエリを削除します。次に、次のコマンドを入力します。

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.    [Select log group(s)] (ロググループを選択) ドロップダウンリストで、クエリする Amazon EKS クラスターログ グループを選択します。

注: ロググループは /aws/eks/cluster_name/cluster のようになります。この例では、 cluster_name を独自の Amazon EKS クラスター名に置き換えます。

5.    時間間隔セレクターを使用して、クエリする期間を選択します。

6.    [Run] (実行) を選択して結果を表示します。

次のような出力が表示されます。

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

CloudWatch ログインサイトを使用して Amazon EKS コントロールプレーンのログを検索する

CloudWatch ログインサイトを使用して Amazon EKS コントロールプレーンのログデータを検索して、ノードの NodeName を記録したイベントを探します。これらのログを Amazon CloudWatch Logs で表示するには、ノードを終了する前に Amazon EKS コントロールプレーンのログ記録を有効にする必要があり、有効なままにしておく必要があります。

例えば、 ip-192-168-132-83.eu-west-1.compute.internal という名前のノードのインスタンス ID を取得するとします。このノードの終了日は 4 日前です。2 つのクエリのいずれかを使用して、 NodeName からインスタンス ID を取得できます。

まず、次の手順に従って CloudWatch ログインサイトクエリを実行します。

1.    CloudWatch コンソールを開きます。

2.    ナビゲーションペインで、[Logs] (ログ) を選択してから、[Logs Insights] (ログインサイト) を選択します。

注: [Logs Insights] (ログインサイト) ページのクエリエディターには、最新の 20 個のログイベントを返す既定のクエリが含まれています。

3.    デフォルトクエリを削除します。次に、次のクエリのいずれかを入力して、 NodeName からインスタンス ID を取得します。

クエリ 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

クエリ 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.    [Select log group(s)] (ロググループを選択) ドロップダウンリストで、クエリする Amazon EKS クラスターログ グループを選択します。

**注:**ロググループは /aws/eks/cluster_name/cluster のようになります。この例では、 cluster_name を独自の Amazon EKS クラスター名に置き換えます。

5.    時間間隔セレクターを使用して、クエリする期間を選択します。

6.    [Run] (実行) を選択して結果を表示します。

実行したクエリに基づいて出力を受け取ります。

クエリ 1 は、次のような出力を返します。

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

クエリ 2 は、次のような出力を返します。

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

CloudTrail で API 呼び出しをイベントとして使用する

CloudTrail で API 呼び出しを組み合わせて、NodeName からノードのインスタンス ID を取得できます。RunInstancesTerminateInstances の両方を EventName として使用します。これらの API 呼び出しは、次のことを行います。

TerminateInstances: これは、それらを終了させたインシデントの時点からすべてのインスタンス ID を取得します。これには、インスタンス ID のみが含まれます。

RunInstances: これには、インスタンス ID と NodeName の両方が含まれます。

最初に、次のコマンドを使用して、監査対象のインシデントの時間枠から終了したすべてのワーカーノードを表示します。開始時間終了時間の値を置き換えて、関連する時間枠を設定します。

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

次のような出力が表示されます。

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

次のコマンドを使用して、監査するインシデントの時間枠での RunInstances API 呼び出しの結果を取得します。開始時間終了時間の値を置き換えて、関連する時間枠を設定します。

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

注: 最も完全な情報を取得するには、開始時刻をワーカーノードが作成された時刻に設定します。

次のような出力が表示されます。

{
  "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公式
AWS公式更新しました 1年前
コメントはありません