如何通过 NodeName 追踪已终止的 Amazon EKS Worker 节点的实例 ID?
某个事件终止了我的 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
但是,该命令不适用于已终止的节点。
您还可以使用 TerminateInstances 或 TerminateInstanceInAutoScalingGroup 作为 AWS CloudTrail 中的 EventName 来返回实例 ID。但是,这些命令自身并不会返回 Amazon EKS 节点的名称。
因此,必须先运行单独的命令来检索节点的 NodeName(PrivateDnsName)。然后,使用该名称追踪节点的实例 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。使用 RunInstances 和 TerminateInstances 作为 EventName。这些 API 调用将执行以下操作:
**TerminateInstances:**将检索实例终止事件时的所有实例 ID。这只包含实例 ID。
**RunInstances:**包含实例 ID 和 NodeName。
首先,使用以下命令查看要审核的事件的时间范围内所有终止的 Worker 节点。替换 start-time 和 end-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-time 和 end-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" }

相关内容
- 已提问 1 个月前lg...
- 已提问 2 个月前lg...
- 已提问 3 个月前lg...
- 已提问 20 天前lg...
- 已提问 4 个月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 个月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前