

 **協助改進此頁面** 

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

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

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

# 為您的叢集啟動 AWS Fargate 記錄
<a name="fargate-logging"></a>

Amazon EKS on Fargate 提供了基於 Fluent Bit 的內建日誌路由器。這表示您沒有明確地執行 Fluent Bit 容器以作為附屬，但 Amazon 會為您執行。您只需設定日誌路由器即可。組態會透過必須符合以下條件的專用 `ConfigMap` 生效：
+ 名稱 `aws-logging` 
+ 在名為 `aws-observability` 的專用命名空間中建立 
+ 不可超過 5300 個字元。

一旦建立了 `ConfigMap`，Amazon EKS on Fargate 會使用其自動偵測並設定日誌路由器。Fargate 使用 Fluent Bit 的 AWS 版本，是由 AWS 管理的 Fluent Bit 上游合規發行版本。如需詳細資訊，請參閱 GitHub 上的[適用於 Fluent Bit 的 AWS](https://github.com/aws/aws-for-fluent-bit)。

日誌路由器可讓您使用 AWS 服務廣度進行日誌分析和儲存。您可以直接將日誌從 Fargate 串流至 Amazon CloudWatch 和 Amazon OpenSearch Service。您也可以透過 [Amazon Data Firehose](https://aws.amazon.com/kinesis/data-firehose/) 將日誌串流至 [Amazon S3](https://aws.amazon.com/s3/)、[Amazon Kinesis Data Streams](https://aws.amazon.com/kinesis/data-streams/) 與合作夥伴工具等目的地。
+ 指定您部署 Fargate Pod 的現有 Kubernetes 命名空間的現有 Fargate 設定檔。如需詳細資訊，請參閱 [步驟 3：為您的叢集建立 Fargate 設定檔](fargate-getting-started.md#fargate-gs-create-profile)。
+ 現有 Fargate Pod 執行角色。如需詳細資訊，請參閱 [步驟 2：建立 Fargate Pod 執行角色](fargate-getting-started.md#fargate-sg-pod-execution-role)。

## 日誌路由器組態
<a name="fargate-logging-log-router-configuration"></a>

**重要**  
若要成功發布日誌，您叢集所在的 VPC 必須具有對日誌目的地的網路存取權。這主要涉及使用者為其 VPC 自訂輸出規則。如需使用 CloudWatch 的範例，請參閱《*Amazon CloudWatch Logs 使用者指南*》中的[搭配介面 VPC 端點使用 CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)。

在下列步驟中，使用您自己的值取代每一個*範例值*。

1. 建立名為 `aws-observability` 的專用 Kubernetes 命名空間。

   1. 將下列內容儲存到電腦上名為 `aws-observability-namespace.yaml` 的檔案中。`name` 的值必須為 `aws-observability`，且需要 `aws-observability: enabled` 標籤。

      ```
      kind: Namespace
      apiVersion: v1
      metadata:
        name: aws-observability
        labels:
          aws-observability: enabled
      ```

   1. 建立命名空間。

      ```
      kubectl apply -f aws-observability-namespace.yaml
      ```

1. 建立具有 `Fluent Conf` 資料值的 `ConfigMap`，將容器日誌寄送至目的地。Fluent Conf 就是 Fluent Bit，這是一種快速且輕量的日誌處理器組態語言，可用於將容器日誌路由至您選擇的日誌目的地。如需詳細資訊，請參閱 Fluent Bit 文件中的[組態檔案](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/configuration-file)。
**重要**  
一般 `Fluent Conf` 中包含的主要區段是 `Service`、`Input`、`Filter` 和 `Output`。然而，Fargate 日誌路由器僅接受：  
`Filter` 和 `Output` 區段。
`Parser` 區段。
如果您提供任何其他區段，則這些區段將被拒絕。

   Fargate 日誌路由器管理 `Service` 和 `Input` 區段。其具有下列 `Input` 區段，無法修改，也不需要在您的 `ConfigMap` 中。但是，您可以從中取得洞察，例如記憶體緩衝區限制和套用於日誌的標籤。

   ```
   [INPUT]
       Name tail
       Buffer_Max_Size 66KB
       DB /var/log/flb_kube.db
       Mem_Buf_Limit 45MB
       Path /var/log/containers/*.log
       Read_From_Head On
       Refresh_Interval 10
       Rotate_Wait 30
       Skip_Long_Lines On
       Tag kube.*
   ```

   建立 `ConfigMap` 時，請考慮下列 Fargate 用來驗證欄位的規則：
   +  應該在每個相應的索引鍵下指定 `[FILTER]`、`[OUTPUT]` 和 `[PARSER]`。例如，`[FILTER]` 必須位於 `filters.conf` 之下。您可以在 `filters.conf` 下有一或多個 `[FILTER]`。`[OUTPUT]` 和 `[PARSER]` 區段也應該位於其相應的索引鍵之下。透過指定多個 `[OUTPUT]` 區段中，您可以同時將日誌路由到不同的目的地。
   + Fargate 驗證每個區段所需的索引鍵。`Name` 和 `match` 對於每個 `[FILTER]` 和 `[OUTPUT]` 都是必要項目。`Name` 和 `format` 對於每個 `[PARSER]` 都是必要項目。索引鍵不區分大小寫。
   + `ConfigMap` 中不允許環境變數 (例如 `${ENV_VAR}`)。
   + 在每個 `filters.conf`、`output.conf` 和 `parsers.conf` 中每個指令或鍵值對的縮排必須是相同的。鍵值對必須比指令縮排更多。
   + Fargate 會根據以下支援的篩選條件進行驗證：`grep`、`parser`、`record_modifier`、`rewrite_tag`、`throttle`、`nest`、`modify` 和 `kubernetes`。
   + Fargate 會根據以下支援的輸出進行驗證：`es`、`firehose`、`kinesis_firehose`、`cloudwatch`、`cloudwatch_logs` 和 `kinesis`。
   + 必須在 `ConfigMap` 中提供至少一個支援的 `Output` 外掛程式來啟用記錄。啟用記錄時不需要 `Filter` 和 `Parser`。

     您也可以使用所需的組態在 Amazon EC2 上執行 Fluent Bit，以對因驗證而產生的任何問題進行故障診斷。使用下列範例之一建立您的 `ConfigMap`。
**重要**  
Amazon EKS Fargate 記錄不支援 `ConfigMap` 的動態組態。`ConfigMap` 的任何變更僅適用於新的 Pod。變更不會套用至現有 Pod。

     使用您所需的日誌目的地範例建立 `ConfigMap`。
**注意**  
您也可以將 Amazon Kinesis Data Streams 用於您的日誌目的地。如果您使用 Kinesis Data Streams，請確定 Pod 執行角色已獲 `kinesis:PutRecords` 許可。如需詳細資訊，請參閱《*Fluent Bit：官方手冊*》中的 Amazon Kinesis Data Streams [許可](https://docs.fluentbit.io/manual/pipeline/outputs/kinesis#permissions)。  
**Example**  

------
#### [ CloudWatch ]

   使用 CloudWatch 時，您有兩個輸出選項：
   +  [用 C 編寫的輸出外掛程式](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/cloudwatch) 
   +  [用 Golang 編寫的輸出外掛程式](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit) 

   以下範例顯示如何使用 `cloudwatch_logs` 外掛程式將日誌傳送至 CloudWatch。

   1. 將下列內容儲存到名為 `aws-logging-cloudwatch-configmap.yaml` 的檔案中。使用叢集所在的 AWS 區域取代 *region-code*。`[OUTPUT]` 下的參數為必要項目。

      ```
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: aws-logging
        namespace: aws-observability
      data:
        flb_log_cw: "false"  # Set to true to ship Fluent Bit process logs to CloudWatch.
        filters.conf: |
          [FILTER]
              Name parser
              Match *
              Key_name log
              Parser crio
          [FILTER]
              Name kubernetes
              Match kube.*
              Merge_Log On
              Keep_Log Off
              Buffer_Size 0
              Kube_Meta_Cache_TTL 300s
        output.conf: |
          [OUTPUT]
              Name cloudwatch_logs
              Match   kube.*
              region region-code
              log_group_name my-logs
              log_stream_prefix from-fluent-bit-
              log_retention_days 60
              auto_create_group true
        parsers.conf: |
          [PARSER]
              Name crio
              Format Regex
              Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$
              Time_Key    time
              Time_Format %Y-%m-%dT%H:%M:%S.%L%z
      ```

   1. 將清單檔案套用至叢集。

      ```
      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
      ```

------
#### [ Amazon OpenSearch Service ]

   如果您想要將日誌傳送到 Amazon OpenSearch Service，您可以使用 [es](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/elasticsearch) 輸出，這是用 C 語言編寫的外掛程式。下列範例說明如何使用該外掛程式將日誌傳送到 OpenSearch。

   1. 將下列內容儲存到名為 `aws-logging-opensearch-configmap.yaml` 的檔案中。使用您自己的值取代每一個*範例值*。

      ```
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: aws-logging
        namespace: aws-observability
      data:
        output.conf: |
          [OUTPUT]
            Name  es
            Match *
            Host  search-example-gjxdcilagiprbglqn42jsty66y.region-code.es.amazonaws.com
            Port  443
            Index example
            Type  example_type
            AWS_Auth On
            AWS_Region region-code
            tls   On
      ```

   1. 將清單檔案套用至叢集。

      ```
      kubectl apply -f aws-logging-opensearch-configmap.yaml
      ```

------
#### [ Firehose ]

   將日誌傳送到 Firehose 時，您有兩個輸出選項：
   +  [kinesis\$1firehose](https://docs.fluentbit.io/manual/pipeline/outputs/firehose)：用 C 語言編寫的輸出外掛程式。
   +  [firehose](https://github.com/aws/amazon-kinesis-firehose-for-fluent-bit)：用 Golang 編寫的輸出外掛程式。

     以下範例顯示如何使用 `kinesis_firehose` 外掛程式將日誌傳送到 Firehose。

     1. 將下列內容儲存到名為 `aws-logging-firehose-configmap.yaml` 的檔案中。使用叢集所在的 AWS 區域取代 *region-code*。

        ```
        kind: ConfigMap
        apiVersion: v1
        metadata:
          name: aws-logging
          namespace: aws-observability
        data:
          output.conf: |
            [OUTPUT]
             Name  kinesis_firehose
             Match *
             region region-code
             delivery_stream my-stream-firehose
        ```

     1. 將清單檔案套用至叢集。

        ```
        kubectl apply -f aws-logging-firehose-configmap.yaml
        ```

------

1. 為 Fargate Pod 執行角色設定許可，以將日誌傳送至目的地。

   1. 將您目的地的 IAM 政策下載到您的電腦。  
**Example**  

------
#### [ CloudWatch ]

      將 CloudWatch IAM 政策下載到您的電腦。您也可以在 GitHub 上[檢視政策](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json)。

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
      ```

------
#### [ Amazon OpenSearch Service ]

      將 OpenSearch IAM 政策下載到您的電腦。您也可以在 GitHub 上[檢視政策](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json)。

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json
      ```

      確認 OpenSearch Dashboards 的存取控制設定正確。OpenSearch 儀表板中的 `all_access role` 需要具有 Fargate Pod 執行角色和 IAM 角色映射。必須為 `security_manager` 角色進行相同的映射。您可以新增先前的映射，方法是選取 `Menu`、`Security`、`Roles`，然後選取個別的角色。如需詳細資訊，請參閱[如何對 CloudWatch Logs 進行故障診斷，以便將其串流至我的 Amazon ES 網域？](https://aws.amazon.com/tr/premiumsupport/knowledge-center/es-troubleshoot-cloudwatch-logs/)。

------
#### [ Firehose ]

      將 Firehose IAM 政策下載到您的電腦。您也可以在 GitHub 上[檢視政策](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json)。

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
      ```

------

   1. 從您下載的政策檔案建立 IAM 政策。

      ```
      aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
      ```

   1. 使用下列命令，將 IAM 政策連接至為 Fargate 設定檔指定的 Pod 執行角色。使用您的帳戶 ID 取代 *111122223333*。使用您的 Pod 執行角色取代 *AmazonEKSFargatePodExecutionRole* (如需詳細資訊，請參閱 [步驟 2：建立 Fargate Pod 執行角色](fargate-getting-started.md#fargate-sg-pod-execution-role))。

      ```
      aws iam attach-role-policy \
        --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
        --role-name AmazonEKSFargatePodExecutionRole
      ```

### Kubernetes 篩選條件支援
<a name="fargate-logging-kubernetes-filter"></a>

Fluent Bit Kubernetes 篩選條件可讓您將 Kubernetes 中繼資料新增至您的日誌檔案。如需有關篩選條件的相關資訊，請參閱 Fluent Bit 說明文件中的 [Kubernetes](https://docs.fluentbit.io/manual/pipeline/filters/kubernetes)。您可以使用 API 伺服器端點來套用篩選條件。

```
filters.conf: |
    [FILTER]
        Name             kubernetes
        Match            kube.*
        Merge_Log           On
        Buffer_Size         0
        Kube_Meta_Cache_TTL 300s
```

**重要**  
 `Kube_URL`、`Kube_CA_File`、`Kube_Token_Command` 和 `Kube_Token_File` 是服務擁有的組態參數，您無法指定這些參數。Amazon EKS Fargate 會將這些值填入。
 `Kube_Meta_Cache_TTL` 是 Fluent Bit 等待直到其可以與 API 伺服器通訊，以取得最新中繼資料所需的時間。若並未指定 `Kube_Meta_Cache_TTL`，則 Amazon EKS Fargate 會附加預設值 30 分鐘，以減少 API 伺服器上的負載。

### 將 Fluent Bit 程序日誌傳送至帳戶
<a name="ship-fluent-bit-process-logs"></a>

您可以選擇性地使用以下 `ConfigMap` 將 Fluent Bit 程序日誌傳送至 Amazon CloudWatch。將 Fluent Bit 處理日誌傳送至 CloudWatch 需要額外的記錄擷取和儲存費用。使用叢集所在的 AWS 區域取代 *region-code*。

```
kind: ConfigMap
apiVersion: v1
metadata:
  name: aws-logging
  namespace: aws-observability
  labels:
data:
  # Configuration files: server, input, filters and output
  # ======================================================
  flb_log_cw: "true"  # Ships Fluent Bit process logs to CloudWatch.

  output.conf: |
    [OUTPUT]
        Name cloudwatch
        Match kube.*
        region region-code
        log_group_name fluent-bit-cloudwatch
        log_stream_prefix from-fluent-bit-
        auto_create_group true
```

日誌位於與叢集相同的 AWS 區域的 CloudWatch 中。日誌群組的名稱是 ` my-cluster-fluent-bit-logs`，而 Fluent Bit logstream 的名稱是 `fluent-bit-podname-pod-namespace `。

**注意**  
只有當 Fluent Bit 程序成功啟動時，才會傳送程序日誌。若在啟動 Fluent Bit 時失敗，程序日誌就會遺失。您只能將程序日誌傳送至 CloudWatch。
若要對傳送程序日誌至您的帳戶除錯，您可以套用先前的 `ConfigMap` 來取得程序日誌。Fluent Bit 無法啟動通常是由於您的 `ConfigMap` 開始時無法被 Fluent Bit 剖析或接受。

### 若要停止傳送 Fluent Bit 程序日誌
<a name="stop-fluent-bit-process-logs"></a>

將 Fluent Bit 處理日誌傳送至 CloudWatch 需要額外的記錄擷取和儲存費用。若要排除現有 `ConfigMap` 設定中的處理日誌，請執行下列步驟。

1. 在啟用 Fargate 記錄後，找出為 Amazon EKS 叢集的 Fluent Bit 程序日誌自動建立的 CloudWatch 日誌群組。它遵循格式 ` my-cluster-fluent-bit-logs`。

1. 刪除針對 CloudWatch 日誌群組中每個 Pod 程序日誌所建立的現有 CloudWatch 日誌串流。

1. 編輯 `ConfigMap` 和設定 `flb_log_cw: "false"`。

1. 重新啟動叢集中的任何現有 Pod。

## 測試應用程式
<a name="fargate-logging-test-application"></a>

1. 部署範例 Pod。

   1. 將下列內容儲存到電腦上名為 `sample-app.yaml` 的檔案中。

      ```
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sample-app
        namespace: same-namespace-as-your-fargate-profile
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
              - name: nginx
                image: nginx:latest
                ports:
                  - name: http
                    containerPort: 80
      ```

   1. 將清單檔案套用至叢集。

      ```
      kubectl apply -f sample-app.yaml
      ```

1. 使用您在 `ConfigMap` 中設定的目的地檢視 NGINX 日誌。

## 大小考量因素
<a name="fargate-logging-size-considerations"></a>

建議您為日誌路由器規劃最多 50 MB 的記憶體。如果您希望應用程式以非常高的輸送量產生日誌，則應該規劃最多 100 MB。

## 故障診斷
<a name="fargate-logging-troubleshooting"></a>

若要確認記錄功能是因某些原因 (例如無效的 `ConfigMap` 以及無效的原因) 啟用或停用，請使用 `kubectl describe pod pod-name ` 檢查您的 Pod 事件。輸出可能包含可釐清是否已啟用記錄的 Pod 事件，例如下列範例輸出。

```
[...]
Annotations:          CapacityProvisioned: 0.25vCPU 0.5GB
                      Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND
[...]
Events:
  Type     Reason           Age        From                                                           Message
  ----     ------           ----       ----                                                           -------
  Warning  LoggingDisabled  <unknown>  fargate-scheduler                                              Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
```

Pod 事件是暫時性的，具體取決於設定的時段。您也可以使用 `kubectl describe pod pod-name ` 來檢視 Pod 註釋。在 Pod 註釋中，可參閱是否已啟用或停用記錄功能及其原因的相關資訊。