

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 使用 kubectl 和 S3 检索托管式节点的节点日志
<a name="auto-get-logs"></a>

了解如何检索具有节点监控代理的 Amazon EKS 托管式节点的节点日志。

## 先决条件
<a name="_prerequisites"></a>

确保您已满足以下条件：
+ 一个具有节点监控代理的现有 Amazon EKS 集群。有关更多信息，请参阅 [检测节点运行状况问题并启用自动节点修复](node-health.md)。
+ 已安装并配置好 `kubectl` 命令行工具，以便与您的集群通信。
+ 已安装 Amazon CLI 并登录，并且拥有创建 S3 存储桶和对象的充分权限。
+ 已安装 Python 3 的最新版本
+ 已安装适用于 Python 3、Boto 3 的 Amazon SDK。

## 第 1 步：创建 S3 存储桶目标（可选）
<a name="_step_1_create_s3_bucket_destination_optional"></a>

如果您还没有用来存储日志的 S3 存储桶，请创建一个。使用以下 Amazon CLI 命令。存储桶默认为 `private` 访问控制列表。将 *bucket-name* 替换为您选择的唯一存储桶名称。

```
aws s3api create-bucket --bucket <bucket-name>
```

## 第 2 步：创建用于 HTTP Put 的预签名 S3 URL
<a name="_step_2_create_pre_signed_s3_url_for_http_put"></a>

Amazon EKS 通过对您指定的 URL 执行 HTTP PUT 操作来返回节点日志。在本教程中，我们将生成一个预签名的 S3 HTTP PUT URL。

日志将以 gzip 压缩包的形式返回，扩展名为 `.tar.gz`。

**注意**  
您必须使用 Amazon API 或 SDK 创建预签名的 S3 上传 URL，以便 EKS 上传日志文件。您无法使用 Amazon CLI 创建预签名的 S3 上传 URL。

1. 确定要用于存储桶日志的位置。例如，可能将 *2024-11-12/logs1.tar.gz* 作为键。

1. 将以下 Python 代码保存到 *presign-upload.py* 文件中。替换 *<bucket-name>* 和 *<key>*。键应以 `.tar.gz` 结尾。

   ```
   import boto3; print(boto3.client('s3').generate_presigned_url(
      ClientMethod='put_object',
      Params={'Bucket': '<bucket-name>', 'Key': '<key>'},
      ExpiresIn=1000
   ))
   ```

1. 运行脚本

   ```
   python presign-upload.py
   ```

1. 记下 URL 输出。在下一步中，请将此值用作 *http-put-destination*。

有关更多信息，请参阅适用于 Python 的 Amazon Boto3 SDK 文档中的 [Generate a presigned URL to upload a file](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html#generating-a-presigned-url-to-upload-a-file)。

## 第 3 步：创建节点诊断资源
<a name="_step_3_create_nodediagnostic_resource"></a>

确定需要从中收集日志的节点的名称。

创建一个 `NodeDiagnostic` 清单，将节点名称作为资源名称，并提供 HTTP PUT URL 目标位置。

```
apiVersion: eks.amazonaws.com/v1alpha1
kind: NodeDiagnostic
metadata:
    name: <node-name>
spec:
    logCapture:
        destination: http-put-destination
```

将清单应用于集群。

```
kubectl apply -f nodediagnostic.yaml
```

您可以通过描述 `NodeDiagnostic` 资源来检查收集状态：
+ 如果状态为 `Success` 或 `SuccessWithErrors`，则表示任务已完成且日志已上传到提供的目标位置（`SuccessWithErrors` 表示可能缺失某些日志）
+ 如果状态为“失败”，请确认上传 URL 格式正确且未过期。

```
kubectl describe nodediagnostics.eks.amazonaws.com/<node-name>
```

## 第 4 步：从 S3 下载日志
<a name="_step_4_download_logs_from_s3"></a>

等待大约一分钟，然后再尝试下载日志。然后使用 S3 CLI 下载日志。

```
# Once NodeDiagnostic shows Success status, download the logs
aws s3 cp s3://<bucket-name>/key ./<path-to-node-logs>.tar.gz
```

## 第 5 步：清除节点诊断资源
<a name="_step_5_clean_up_nodediagnostic_resource"></a>
+  `NodeDiagnostic` 资源不会被自动删除。获取日志构件后，您需要自行清理这些文件

```
# Delete the NodeDiagnostic resource
kubectl delete nodediagnostics.eks.amazonaws.com/<node-name>
```

## NodeDiagnostic `node` 目标
<a name="_nodediagnostic_node_destination"></a>

从 Node Monitoring Agent 的 `v1.6.1-eksbuild.1` 版本开始，可以选择将日志收集目标设置为 `node`。使用此目标将导致日志在节点上收集并临时保留，以供后续收集。除此功能外，节点监控代理的 GitHub 存储库中还有一个 `kubectl` 插件，您可以安装该插件以便于交互和日志收集。有关更多信息，[请参阅 `kubectl ekslogs` 插件的文档](https://github.com/aws/eks-node-monitoring-agent/blob/main/tools/kubectl-ekslogs/README.md)。

## 示例用法
<a name="_example_usage"></a>

```
# Collect NodeDiagnostic logs from a single node
kubectl ekslogs <node-name>

# Collect NodeDiagnostic logs from multiple nodes
kubectl ekslogs <node-name-1> <node-name-2> <node-name-3>

# Collect NodeDiagnostic logs from all nodes with a specific label
kubectl ekslogs -l <key>=<value>
```