Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何通过 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" }
- 语言
- 中文 (简体)
