

 **帮助改进此页面** 

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

# 为集群启动 Amazon Fargate 日志记录
<a name="fargate-logging"></a>

Fargate 上的 Amazon EKS 提供了一个基于 Fluent Bit 的内置日志路由器。这意味着您没有明确地将 Fluent Bit 容器作为边车容器运行，但 Amazon 会为您运行该容器。您只需配置日志路由器即可。通过必须满足以下条件的专用 `ConfigMap` 进行配置：
+ 名为 `aws-logging` 
+ 在名为 `aws-observability` 的专用命名空间中创建 
+ 不能超过 5300 个字符。

一旦您创建了 `ConfigMap`，Fargate 上的 Amazon EKS 会自动检测到它并使用它来配置日志路由器。Fargate 使用 Amazon for Fluent Bit 的版本是 Fluent Bit 的一种上游合规发行版，由Amazon托管。有关更多信息，请参阅 GitHub 上的 [Amazon for Fluent Bit](https://github.com/aws/aws-for-fluent-bit)。

日志路由器允许您使用广泛的Amazon服务进行日志分析和存储。您可以将日志从 Fargate 直接流式传输到 Amazon CloudWatch、Amazon OpenSearch Service。您还可以通过 [Amazon Data Firehose](https://www.amazonaws.cn/kinesis/data-firehose/) 将日志流式传输到 [Amazon S3](https://www.amazonaws.cn/s3/)、[Amazon Kinesis Data Streams](https://www.amazonaws.cn/kinesis/data-streams/) 和合作伙伴工具等目标。
+ 现有的 Fargate 配置文件，用于指定您将 Fargate 容器组（pod）部署到的现有 Kubernetes 命名空间。有关更多信息，请参阅 [第 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 用户指南》中的 [Using CloudWatch Logs with interface VPC endpoints](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)**。

在以下步骤中，将所有 *example value* 替换为您自己的值。

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` 的文件中。将 *region-code* 替换为您的集群所在的 Amazon 区域。`[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` 的文件中。将所有 *example value* 替换为您自己的值。

      ```
      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` 的文件中。将 *region-code* 替换为您的集群所在的 Amazon 区域。

        ```
        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 容器组执行角色设置向目标发送日志的权限。

   1. 将目标的 IAM 策略下载到您的计算机。  
**Example**  

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

      将 CloudWatch IAM policy 下载到您的计算机。您还可以在 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 policy 下载到您的计算机。您还可以在 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 控制面板的访问控制配置正确。OpenSearch 控制面板中的 `all_access role` 需要映射 Fargate 容器组（pod）执行角色和 IAM 角色。必须为 `security_manager` 角色执行同样的映射。您可以添加以前的映射，方法为：选择 `Menu`，然后依次选择 `Security` 和 `Roles`，再选择相应的角色。有关更多信息，请参阅[如何对 CloudWatch Logs 进行故障排除，以便将其流式传输到我的 Amazon ES 域？](https://www.amazonaws.cn/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 policy 附加到为 Fargate 配置文件指定的容器组（pod）执行角色。请将 *111122223333* 替换为您的账户 ID。将 *AmazonEKSFargatePodExecutionRole* 替换为容器组（pod）执行角色（有关更多信息，请参阅[第 2 步：创建 Fargate 容器组（pod）执行角色](fargate-getting-started.md#fargate-sg-pod-execution-role)）。

      ```
      aws iam attach-role-policy \
        --policy-arn arn:aws-cn: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 需要额外的日志摄取和存储成本。将 *region-code* 替换为您的集群所在的 Amazon 区域。

```
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
```

日志位于集群所在 Amazon 区域的 CloudWatch 中。日志组名称为 ` my-cluster-fluent-bit-logs`，Fluent Bit 日志流名称为 `fluent-bit-podname-pod-namespace `。

**注意**  
仅当 Fluent Bit 流程成功开始后，才会发送流程日志。如果启动 Fluent Bit 时出现故障，则会丢失流程日志。您只能将流程日志发送到 CloudWatch。
要调试将流程日志传输到您的账户，可以应用以前的 `ConfigMap` 获取流程日志。Fluent Bit 启动失败通常是启动时 Fluent Bit 未解析或接受 `ConfigMap` 导致的。

### 停止发送 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>

我们建议您为日志路由器规划最多 50MB 的内存。如果您希望应用程序以非常高的吞吐量生成日志，那么您应该规划高达 100MB 的内存。

## 故障排除
<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）注释中包含有关日志记录功能是已启用还是已禁用状态以及对应原因的信息。