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

帮助改进此页面

想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。

Fargate 日志记录

Fargate 上的 Amazon EKS 提供了一个基于 Fluent Bit 的内置日志路由器。这意味着您没有明确地将 Fluent Bit 容器作为 Sidecar 运行,但 Amazon 会为您运行它。您只需配置日志路由器即可。通过必须满足以下条件的专用 ConfigMap 进行配置:

  • 名为 aws-logging

  • 在名为 aws-observability 的专用命名空间中创建

  • 不能超过 5300 个字符。

一旦您创建了 ConfigMap,Fargate 上的 Amazon EKS 会自动检测到它并使用它来配置日志路由器。Fargate 使用的 Amazon for Fluent Bit 版本是 Fluent Bit 的一种上游合规发行版,由 Amazon 托管。有关更多信息,请参阅 GitHub 上的 Amazon for Fluent Bit

日志路由器允许您使用广泛的Amazon服务进行日志分析和存储。您可以将日志从 Fargate 直接流式传输到 Amazon CloudWatch、Amazon OpenSearch Service。您还可以通过 Amazon Data Firehose 将日志流式传输到 Amazon S3Amazon Kinesis Data Streams 和合作伙伴工具等目标。

先决条件

日志路由器配置

配置日志路由器

在以下步骤中,将每个 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
    2. 创建命名空间。

      kubectl apply -f aws-observability-namespace.yaml
  2. 创建带有 Fluent Conf 数据值的 ConfigMap,以将容器日志发送到某个目标。Fluent Conf 为 Fluent Bit,是一种快速轻量级日志处理器配置语言,用于将容器日志路由到您选择的日志目标。有关更多信息,请参阅 Fluent Bit 文档中的配置文件

    重要

    典型 Fluent Conf 中包含的主要部分为 ServiceInputFilterOutput。但是,Fargate 日志路由器仅接受:

    • FilterOutput 部分。

    • Parser 部分。

    如果您提供任何其他部分,将被拒绝。

    Fargate 日志路由器管理 ServiceInput 部分。它包含以下 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 会验证每个部分所需的键。Namematch 是每个 [FILTER][OUTPUT] 所必需的。Nameformat 是每个 [PARSER] 所必需的。键不区分大小写。

    • ConfigMap 中不允许使用环境变量(例如 ${ENV_VAR})。

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

    • Fargate 根据以下受支持的筛选条件进行验证:grepparserrecord_modifierrewrite_tagthrottlenestmodifykubernetes

    • Fargate 根据以下受支持的输出进行验证:esfirehosekinesis_firehosecloudwatchcloudwatch_logskinesis

    • ConfigMap 中必须至少提供一个受支持的 Output 插件才能启用日志记录。不需要 FilterParser 即可启用日志记录。

    您还可以使用所需的配置在 Amazon EC2 上运行 Fluent Bit,以对验证过程中出现的任何问题进行故障排除。使用以下示例之一创建您的 ConfigMap

    重要

    Amazon EKS Fargate 日志记录不支持 ConfigMaps 的动态配置。对 ConfigMaps 所做的任何更改均仅应用于新 Pods。不会将更改应用于现有 Pods。

    使用所需日志目标的示例创建 ConfigMap

    注意

    您也可以将 Amazon Kinesis Data Streams 用作您的日志目的地。如果您使用 Kinesis Data Streams,则请确保容器组(pod)执行角色已被授予 kinesis:PutRecords 权限。有关更多信息,请参阅 Fluent Bit:官方手册中的 Amazon Kinesis Data Streams 权限

    CloudWatch

    为 CloudWatch 创建 ConfigMap

    使用 CloudWatch 视时,您有两个输出选项:

    以下示例为您展示了如何使用 cloudwatch_logs 插件将日志发送到 CloudWatch。

    1. 将以下内容保存到名为 aws-logging-cloudwatch-configmap.yaml 的文件中。region-code 替换为集群所在的 Amazon Web Services 区域。[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
    2. 将清单应用于集群。

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

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

    要创建 ConfigMap for Amazon OpenSearch Service

    如果您希望将日志发送到 Amazon OpenSearch Service,您可以使用 es 输出,这是以 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
    2. 将清单应用于集群。

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

      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,然后依次选择 SecurityRoles,再选择相应的角色。有关更多信息,请参阅如何对 CloudWatch Logs 进行故障排除,以便将其流式传输到我的 Amazon ES 域?

    Firehose

    为 Firehose 创建 ConfigMap

    将日志发送到 Firehose 时,您有两个输出选项:

    以下示例向您展示了如何使用 kinesis_firehose 插件将日志发送到 Firehose。

    1. 将以下内容保存到名为 aws-logging-firehose-configmap.yaml 的文件中。region-code 替换为集群所在的 Amazon Web Services 区域。

      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
    2. 将清单应用于集群。

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

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
  3. 使用上一步中下载的策略文件创建 IAM policy。

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
  4. 使用以下命令将 IAM policy 附加到为 Fargate 配置文件指定的容器组(pod)执行角色。请将 111122223333 替换为您的账户 ID。将 AmazonEKSFargatePodExecutionRole 替换为您的 Pod 执行角色(有关更多信息,请参阅 创建 Fargate Pod 执行角色)。

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

Kubernetes 筛选器支持

此功能需要以下最低 Kubernetes 版本和平台版本或更高版本。

Kubernetes 版本 平台版本
1.23 和更高版本 eks.1

Fluent Bit Kubernetes 筛选器允许您将 Kubernetes 元数据添加到您的日志文件。有关筛选器的更多信息,请参阅 Fluent Bit 文档中的 Kubernetes。您可以使用 API 服务器终端节点应用筛选器。

filters.conf: | [FILTER] Name kubernetes Match kube.* Merge_Log On Buffer_Size 0 Kube_Meta_Cache_TTL 300s
重要
  • Kube_URLKube_CA_FileKube_Token_CommandKube_Token_File 是服务拥有的配置参数,不能指定。Amazon EKS Fargate 填充这些值。

  • Kube_Meta_Cache_TTL 是 Fluent Bit 与 API 服务器通信以获取最新元数据等待的时间。如果未指定 Kube_Meta_Cache_TTL,则 Amazon EKS Fargate 会追加原定设置值 30 分钟,以减轻 API 服务器的负载。

将 Fluent Bit 流程日志发送到您的账户

您可以选择性地使用下面的 ConfigMap 将 Fluent Bit 流程日志发送到 Amazon CloudWatch。将 Fluent Bit 进程日志发送到 CloudWatch 需要额外的日志摄取和存储成本。region-code 替换为集群所在的 Amazon Web Services 区域。

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

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

注意
  • 仅当 Fluent Bit 流程成功开始后,才会发送流程日志。如果启动 Fluent Bit 时出现故障,则会丢失流程日志。您只能将流程日志发送到 CloudWatch。

  • 要调试将流程日志发送到您的账户的过程,可以应用以前的 ConfigMap 以获取流程日志。Fluent Bit 无法启动通常是由于您的 ConfigMap 在启动时未被 Fluent Bit 解析或接受。

要停止发送 Fluent Bit 进程日志

将 Fluent Bit 进程日志发送到 CloudWatch 需要额外的日志摄取和存储成本。要排除现有 ConfigMap 设置中的进程日志,请执行以下步骤。

  1. 在启用 Fargate 日志记录后,找到为 Amazon EKS 集群的 Fluent Bit 进程日志自动创建的 CloudWatch 日志组。它遵循格式 {cluster_name}-fluent-bit-logs

  2. 删除 CloudWatch 日志组中为每个 Pod's 的进程日志创建的现有 CloudWatch 日志流。

  3. 编辑 ConfigMap 并设置 flb_log_cw: "false"

  4. 重启集群中的任何现有 Pods。

测试应用程序

  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
    2. 将清单应用于集群。

      kubectl apply -f sample-app.yaml
  2. 使用您在 ConfigMap 中配置的目标查看 NGINX 日志。

大小注意事项

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

故障排除

要确认日志记录功能是否因某种原因(例如无效 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's 的注释。Pod 注释中包含有关日志记录功能是已启用还是已禁用状态以及对应原因的信息。