

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 kubectl 及 S3 擷取受管節點的節點日誌
<a name="auto-get-logs"></a>

了解如何為已安裝節點監控代理程式的 Amazon EKS 受管節點擷取節點記錄。

## 先決條件
<a name="_prerequisites"></a>

請確認您已具備以項目：
+ 現有已安裝節點監控代理程式的 Amazon EKS 叢集。如需詳細資訊，請參閱[偵測節點運作狀態問題並啟用自動節點修復](node-health.md)。
+ 已安裝並設定為可與您叢集通訊的 `kubectl` 命令列工具。
+ 安裝並登入 AWS 的 CLI 具有足夠的許可來建立 S3 儲存貯體和物件。
+ 已安裝最新版本 Python 3
+ 已安裝適用於 Python 3、Boto 3 的 AWS SDK。

## 步驟 1：建立 S3 儲存貯體目的地 (選用)
<a name="_step_1_create_s3_bucket_destination_optional"></a>

若您還沒有 S3 儲存貯體來儲存日誌，請先建立一個。使用下列 AWS 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 檔 (副檔名為 `.tar.gz`) 形式傳回。

**注意**  
您必須使用 AWS API 或 SDK 來建立預先簽章的 S3 上傳 URL，以供 EKS 上傳日誌檔案。您無法使用 CLI 建立預先簽章的 S3 AWS 上傳 URL。

1. 決定您要在儲存貯體中的哪個位置儲存日誌。例如，您可以使用 *2024-11-12/logs1.tar.gz* 做為金鑰。

1. 將下列 Python 程式碼儲存至檔案 https：//*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 文件的Boto3 開發套件中產生預先簽章的 URL 以上傳檔案](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html#generating-a-presigned-url-to-upload-a-file)。 AWS Boto3 

## 步驟 3：建立 NodeDiagnostic 資源
<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：清理 NodeDiagnostic 資源
<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>

從節點監控代理`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>
```