Fargate 日志记录 - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Fargate 日志记录

Amazon EKS 与 Fargate 支持内置的日志路由器,这意味着没有要安装或维护的附加容器。日志路由器允许您使用 AWS 上的服务宽度进行日志分析和存储。您可以将日志从 Fargate 直接流式传输到 Amazon CloudWatch、Amazon Elasticsearch Service 和 Amazon Kinesis Data Firehose 目标(如 Amazon S3、Amazon Kinesis 数据流和合作伙伴工具)。Fargate 使用适用于 Fluent Bit 的 AWS 版本,这是由 AWS 管理的符合上游条件的 Fluent Bit 分配。有关更多信息,请参阅 GitHub 上的适用于 Fluent Bit 的 AWS

Prerequisites

  • 使用现有 Amazon EKS 集群。集群必须运行以下(或更高版本)平台版本之一。

    EKS 版本 平台版本
    1.18 eks.3
    1.17 eks.5
    1.16 eks.5
    1.15 eks.6

    如果您在这些平台版本之一或更高版本上没有现有集群,请参阅开始使用 Amazon EKS以部署集群。

  • 一个现有 Fargate 配置文件,它指定将 Fargate Pod 部署到的现有 Kubernetes 命名空间。有关更多信息,请参阅 为您的集群创建 Fargate 配置文件.

将日志发送到您选择的目标

ConfigMap 应用于具有 Amazon EKS 数据值的 Fluent Conf 集群,该数据值定义容器日志将发送到何处。Fluent Conf 是一种快速轻量级日志处理器配置语言,用于将容器日志路由到所选的日志目标。有关更多信息,请参阅 Fluent Bit 文档中的配置文件

在以下步骤中,将 <example values> 替换为您自己的值。

  1. 创建 Kubernetes 命名空间。

    1. 将以下内容保存到计算机上名为 aws-observability-namespace.yaml 的文件中。名称必须为 aws-observability

      kind: Namespace apiVersion: v1 metadata: name: aws-observability labels: aws-observability: enabled
    2. 创建命名空间。

      kubectl apply -f aws-observability-namespace.yaml
  2. 配置 Kubernetes 以将 Fargate 日志发送到以下目标之一。必须在 ConfigMap 命名空间中创建您创建的 aws-observability

    1. (可选)将日志发送到 CloudWatch。在使用 CloudWatch 时,您有两个输出选项:

      以下示例说明如何使用 cloudwatch_logs 插件将日志发送到 CloudWatch。

      1. 将以下内容保存到名为 aws-logging-cloudwatch-configmap.yaml 的文件中。

        kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability labels: data: output.conf: | [OUTPUT] Name cloudwatch_logs Match * region <us-east-1> log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group On
      2. 将清单应用于您的集群。

        kubectl apply -f aws-logging-cloudwatch-configmap.yaml
      3. 将 CloudWatch IAM 策略下载到您的计算机。您还可以在 GitHub 上查看策略

        curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
    2. (可选)将日志发送到 Amazon Elasticsearch Service。您可以使用 es 输出,这是用 C 编写的插件。以下示例向您演示如何使用该插件将日志发送到 Elasticsearch。

      1. 将以下内容保存到名为 aws-logging-elasticsearch-configmap.yaml 的文件中。

        kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability labels: data: output.conf: | [OUTPUT] Name es Match * Host 192.168.2.3 Port 9200 Index my_index Type my_type AWS_Auth On AWS_Region <us-east-1>
      2. 将清单应用于您的集群。

        kubectl apply -f aws-logging-elasticsearch-configmap.yaml
      3. 将 Elasticsearch IAM 策略下载到您的计算机。您还可以在 GitHub 上查看策略

        curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json
    3. (可选)将日志发送到 Kinesis Data Firehose。在使用 Kinesis Data Firehose 时,您有两个输出选项:

      以下示例说明如何使用 kinesis_firehose 插件将日志发送到 Kinesis Data Firehose。

      1. 将以下内容保存到名为 aws-logging-firehose-configmap.yaml 的文件中。

        kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability labels: data: output.conf: | [OUTPUT] Name kinesis_firehose Match * region <us-east-1> delivery_stream my-stream-firehose
      2. 将清单应用于您的集群。

        kubectl apply -f aws-logging-firehose-configmap.yaml
      3. 将 Kinesis Data Firehose IAM 策略下载到您的计算机。您还可以在 GitHub 上查看策略

        curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
  3. 创建 IAM 策略。

    aws iam create-policy --policy-name <eks-fargate-logging-policy> --policy-document file://permissions.json
  4. 将 IAM 策略附加到为您的 Fargate 配置文件指定的 Pod 执行角色。将 <111122223333> 替换为您的账户 ID。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::<111122223333>:policy/<eks-fargate-logging-policy> \ --role-name <your-pod-execution-role>
  5. 部署示例 pod。

    1. 将以下内容保存到计算机上的 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
    2. 将清单应用于集群。

      kubectl apply -f <name-of-file-from-previous-step>.yaml
  6. 使用将日志发送到的工具查看日志。

大小注意事项

我们建议您为日志制定最多 50 MB 内存计划。如果您希望应用程序以非常高的吞吐量生成日志,则应计划高达 100 MB。

Troubleshooting

要确认日志记录功能是出于某种原因启用还是禁用(例如,无效 ConfigMap)以及为何无效),请使用 kubectl describe pod <pod_name> 检查 Pod 事件。输出可能包含 Pod 事件,以阐明是否启用日志记录,如以下示例输出。

... Annotations: CapacityProvisioned: 0.25vCPU 0.5GB Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND kubernetes.io/psp: eks.privileged ... 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 注释中,提供了有关日志记录功能是启用还是禁用以及原因的信息。

验证策略

典型 Fluent Conf 中的主要部分包括 ServiceInputFilterOutputFilterOutputParserServiceInput 由 Fargate 生成。Fargate 仅验证 Filter 中指定的 OutputParserFluent Conf。将忽略 FilterOutputParser 之外提供的任何部分。以下规则用于验证 FilterOutputParser 字段。

  1. [FILTER] 应在每个相应键下指定 [OUTPUT],[PARSER]filters.confoutput.confparsers.conf 和 。例如,[FILTER] 必须位于 filters.conf 下。您可以在 [FILTER] 下拥有多个 filters.conf。这同样适用于 [OUTPUT][PARSER]

  2. Fargate 验证每个部分所需的密钥。每个 Namematch 都需要 [FILTER][OUTPUT]。每个 Name 都需要 format[PARSER]。密钥不区分大小写。

  3. 中不允许使用环境变量,例如 ${ENV_VAR}configmap

  4. 每个 filters.confoutput.confparsers.conf 中的指令或键值对的缩进必须相同。键/值对的缩进范围必须多于指令。

  5. Fargate 针对以下支持的筛选条件进行验证:grepkubernetesparserrecord_modifierrewrite_tagthrottlenestmodify

  6. Fargate 针对以下支持的输出进行验证:esfirehosekinesis_firehosecloudwatchcloudwatch_logskinesis

  7. 必须在 Output 中提供至少一个支持的 ConfigMap 插件才能启用日志记录。启用日志记录无需 FilterParser

有关 Fluent Conf 的更多信息,请参阅 Fluent Bit 文档中的配置文件。您还可以使用所需配置在 Amazon EC2 上运行 Fluent Bit,以排查验证引起的任何问题。