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

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

Fargate 日志记录

具有 Fargate 的 Amazon EKS 支持内置日志路由器,这意味着没有需要安装或维护的边车容器。日志路由器允许您使用Amazon用于日志分析和存储。您可以将日志从 Fargate 直接流式传输到 Amazon CloudWatch、Amazon Elasticsearch Service 和 Amazon Kinesis Data Firehose 目标,例如 Amazon S3、Amazon Kinesis Data Streams 和合作伙伴工具。Fargate 使用Amazon对于流量位,这是一种符合上游规范的流量位分布,由Amazon。有关更多信息,请参阅 。Amazon针对流利位(位于 GitHub 上)。

Prerequisites

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

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

    如果您没有这些平台版本之一或更高版本的现有群集,请参阅Amazon EKS 入门部署集群。

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

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

应用ConfigMap添加到您的亚马逊 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 true
      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 配置文件指定的容器执行角色。Replace<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. 部署示例容器。

    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 事件,例如以下示例输出。

... 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 事件是短暂的,时间段取决于设置。您也可以使用查看 Pod 的注释kubectl describe pod <pod-name>。在容器注释中,有关是启用还是禁用日志记录功能以及原因的信息。

验证策略

主要部分包括在一个典型的Fluent ConfServiceInputFilter, 和OutputFilterOutput, 和ParserServiceInput是由 Fargate 生成的。Fargate 仅验证FilterOutput, 和Parser中指定的Fluent Conf。提供的任何部分FilterOutput, 和Parser将被拒绝。以下规则用于验证FilterOutput, 和Parser字段。

  1. [FILTER][OUTPUT],[PARSER]应该在每个相应的键下指定:filters.confoutput.conf, 和parsers.conf。例如,[FILTER]必须低于filters.conf。你可以有很多[FILTER]sfilters.conf。同样适用于[OUTPUT][PARSER]

  2. Fargate 会验证每个部分所需的密钥。Namematch是必需的每个[FILTER][OUTPUT]Nameformat是必需的每个[PARSER]。密钥不区分大小写。

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

  4. 对于每个指令或键值对,缩进必须是相同的filters.confoutput.conf, 和parsers.conf。键值对必须缩进多于指令。

  5. Fargate 根据以下受支持的过滤器进行验证:grepparserrecord_modifierrewrite_tagthrottlenest, 和modify

  6. Fargate 根据以下支持的输出进行验证:esfirehosekinesis_firehosecloudwatchcloudwatch_logs, 和kinesis

  7. 至少一个支持Output插件必须在ConfigMap以启用日志记录。FilterParser不需要启用日志记录。

有关 的更多信息Fluent Conf请参阅配置文件在流利位文档中。您还可以使用所需的配置在 Amazon EC2 上运行 Fluent Bit,以排除验证过程中出现的任何问题。