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

Fargate 日志记录

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

  • 名为 aws-logging

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

一旦您创建了 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 Kinesis Data Firehose 将日志流式传输到 Amazon S3、Amazon 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 部分,并管理 ServiceInput 部分本身。

    • Parser 部分。

    如果您提供了除 FilterOutputParser 之外的任何其他部分,则这些部分会被拒绝。

    在创建 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_logskinesiskubernetes

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

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

    重要

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

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

    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: output.conf: | [OUTPUT] Name cloudwatch_logs Match * region region-code log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group true log_key log 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 filters.conf: | [FILTER] Name parser Match * Key_name log Parser crio
    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
    Amazon OpenSearch Service

    为 Amazon OpenSearch Service 创建 ConfigMap

    如果您想要将日志发送到 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 策略下载到您的计算机。您还可以在 GitHub 上查看策略

      curl -o permissions.json 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 域?

    Kinesis Data Firehose

    为 Kinesis Data Firehose 创建 ConfigMap

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

    以下示例为您展示了如何使用 kinesis_firehose 插件将日志发送到 Kinesis Data 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. 将 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

Kubernetes 筛选器支持

此功能需要以下最低 Kubernetes 版本和平台版本或更高版本。支持比表中列出的版本更高的任何 Kubernetes 和平台版本。

Kubernetes 版本 平台版本
1.21 eks.3
1.20 eks.3
1.19 eks.7
1.18 eks.9
1.17 eks.10

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 会与 API 服务器通信以获取最新的元数据。

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

您可以使用下面的 ConfigMap 将 Fluent Bit 流程日志发送到 Amazon 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 启动失败通常是启动时 Fluent Bit 未解析或接受 ConfigMap 导致的。

测试应用程序

  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 日志。

大小注意事项

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

故障排除

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