如何通过 NodeName 追踪已终止的 Amazon EKS Worker 节点的实例 ID?

3 分钟阅读
0

某个事件终止了我的 Amazon EKS 集群中的 Worker 节点,我希望将已终止的节点名称与其实例 ID 相匹配。

简短描述

在 Amazon EKS 中,节点的名称使用其 PrivateDnsName(私有 DNS 名称)来进行记录和显示。该名称的格式类似于 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

要检索活动 Worker 节点的实例 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

但是,该命令不适用于已终止的节点。

您还可以使用 TerminateInstancesTerminateInstanceInAutoScalingGroup 作为 AWS CloudTrail 中的 EventName 来返回实例 ID。但是,这些命令自身并不会返回 Amazon EKS 节点的名称。

因此,必须先运行单独的命令来检索节点的 NodeNamePrivateDnsName)。然后,使用该名称追踪节点的实例 ID。要查找先前终止的 Worker 节点的实例 ID,请使用 Amazon CloudWatch Logs Insights 搜索 Amazon EKS 控制面板日志。为此,必须在节点终止之前激活控制面板日志记录。如果没有激活控制面板日志记录,请使用 CloudTrail。

解决方法

**注意:**如果您在运行 AWS 命令行界面(AWS CLI)命令时遇到错误,请确保您运行的是最新版本的 AWS CLI

检索节点的 NodeName

对于以下两种方法,必须知道已终止的节点 NodeName 才能检索其实例 ID。要检索给定时间范围内终止的 Amazon EKS 节点列表,请使用 CloudWatch Log Insight 查询编辑器:

1.    打开 CloudWatch 控制台

2.    在导航窗格中,选择 Log(日志),然后选择 Log 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 Logs Insights 搜索 Amazon EKS 控制面板日志

使用 CloudWatch Logs Insights 在 Amazon EKS 控制面板日志数据中搜索记录节点 NodeName 的事件。要在 Amazon CloudWatch Logs 中查看这些日志,必须在节点终止之前激活 Amazon EKS 控制面板日志记录,且必须保持激活状态。

例如,假设要检索名为 ip-192-168-132-83.eu-west-1.compute.internal 的节点的实例 ID。该节点的终止日期是四天前。您可以使用两个查询中的任意一个从 NodeName 检索实例 ID。

首先,按照以下步骤运行 CloudWatch Logs Insights 查询:

1.    打开 CloudWatch 控制台

2.    在导航窗格中,选择 Log(日志),然后选择 Log 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

首先,使用以下命令查看要审核的事件的时间范围内所有终止的 Worker 节点。替换 start-timeend-time 值,以设置相关的时间范围:

% 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 调用的结果。替换 start-timeend-time 值,以设置相关的时间范围:

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

**注意:**要获得最完整的信息,请将 start-time 设置为创建 Worker 节点的时间。

您会收到类似以下内容的输出:

{
  "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 年前