将 Fluent Bit 设置为 DaemonSet 以将日志发送到 CloudWatch Logs - Amazon CloudWatch
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

将 Fluent Bit 设置为 DaemonSet 以将日志发送到 CloudWatch Logs

以下部分帮助您部署 Fluent Bit 以将日志从容器发送到 CloudWatch Logs。

差异(如果您已在使用 Fluentd)

如果您已使用 Fluentd 将日志从容器发送到 CloudWatch Logs,请阅读此部分以查看 Fluentd 和 Fluent Bit 之间的区别。如果您尚未将 Fluentd 与 Container Insights 结合使用,则可以跳到 设置 Fluent Bit

我们为 Fluent Bit 提供了两个默认配置:

  • Fluent Bit 优化配置 — 符合 Fluent Bit 最佳实践的配置。

  • 与 Fluentd 兼容的配置 — 尽可能与 Fluentd 行为相符的配置。

以下列表详细介绍了 Fluentd 与每个 Fluent Bit 配置之间的区别。

  • 日志流名称的差异 — 如果您使用 Fluent Bit 优化的配置,日志流名称将不同。

    /aws/containerinsights/Cluster_Name/application

    • Fluent Bit 优化配置将日志发送到 kubernetes-nodeName-application.var.log.containers.kubernetes-podName_kubernetes-namespace_kubernetes-container-name-kubernetes-containerID

    • Fluentd 将日志发送到 kubernetes-podName_kubernetes-namespace_kubernetes-containerName_kubernetes-containerID

    /aws/containerinsights/Cluster_Name/host

    • Fluent Bit 优化配置将日志发送到 kubernetes-nodeName.host-log-file

    • Fluentd 将日志发送到 host-log-file-Kubernetes-NodePrivateIp

    /aws/containerinsights/Cluster_Name/dataplane

    • Fluent Bit 优化配置将日志发送到 kubernetes-nodeName.dataplaneServiceLog

    • Fluentd 将日志发送到 dataplaneServiceLog-Kubernetes-nodeName

  • Container Insights 写入的 kube-proxyaws-node 日志文件位于不同的位置。在 FluentD 配置中,它们位于 中/aws/containerinsights/Cluster_Name/application。在 Fluent Bit 优化配置中,它们位于 中/aws/containerinsights/Cluster_Name/dataplane

  • 大多数元数据(如 pod_name namespace_name 和 )在 Fluent Bit 和 Fluentd 中是相同的,但以下元数据不同。

    • Fluent Bit 优化配置使用 docker_id ,Fluentd 使用 Docker.container_id

    • 两个 Fluent Bit 配置不使用以下元数据。它们仅存在于 Fluentd 中container_image_id:、master_urlnamespace_idnamespace_labels

设置 Fluent Bit

要设置 Fluent Bit 以从容器中收集日志,您可以按照中的步骤操作Amazon EKS 和 Kubernetes 上的 Container Insights 快速入门设置,也可以按照本节中的步骤操作。

在以下步骤中,您将 Fluent Bit 设置为daemonSet以将日志发送到 CloudWatch Logs。完成此步骤后,Fluent Bit 将创建以下日志组(如果它们尚不存在)。

日志组名称 日志源

/aws/containerinsights/Cluster_Name/application

/var/log/containers 中的所有日志文件

/aws/containerinsights/Cluster_Name/host

来自 /var/log/dmesg、 和 /var/log/secure的日志 /var/log/messages

/aws/containerinsights/Cluster_Name/dataplane

/var/log/journalkubelet.servicekubeproxy.service 的登录日志docker.service

安装 Fluent Bit 以将日志从容器发送到 CloudWatch Logs

  1. 如果您还没有名为 的命名空间amazon-cloudwatch,请输入以下命令创建一个:

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
  2. 运行以下命令以使用cluster-info集群名称和要将日志发送到的 区域创建名为 的 ConfigMap。Replace cluster-namecluster-region 替换为您的集群的名称和区域。

    ClusterName=cluster-name RegionName=cluster-region FluentBitHttpPort='2020' FluentBitReadFromHead='Off' [[ ${FluentBitReadFromHead} = 'On' ]] && FluentBitReadFromTail='Off'|| FluentBitReadFromTail='On' [[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer='Off' || FluentBitHttpServer='On' kubectl create configmap fluent-bit-cluster-info \ --from-literal=cluster.name=${ClusterName} \ --from-literal=http.server=${FluentBitHttpServer} \ --from-literal=http.port=${FluentBitHttpPort} \ --from-literal=read.head=${FluentBitReadFromHead} \ --from-literal=read.tail=${FluentBitReadFromTail} \ --from-literal=logs.region=${RegionName} -n amazon-cloudwatch

    在此命令中,用于监控插件指标FluentBitHttpServer的 默认处于启用状态。要禁用它,请将命令中的第三行更改为命令中的 FluentBitHttpPort='' (空字符串)。

    此外,默认情况下,Fluent Bit 从结尾读取日志文件,并且仅在部署后捕获新日志。如果您需要相反的值,请设置 FluentBitReadFromHead='On' ,它将收集文件系统中的所有日志。

  3. 运行以下命令之一以将 Fluent Bit 守护程序集下载并部署到集群。

    • 如果您需要 Fluent Bit 优化配置,请运行此命令。

      kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit.yaml
    • 如果您希望 Fluent Bit 配置更类似于 Fluentd,请运行此命令。

      kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit-compatible.yaml
  4. 运行以下命令以验证部署。每个节点应有一个名为 fluent-bit-* 的 pod。

    kubectl get pods -n amazon-cloudwatch

上述步骤在集群中创建以下资源:

  • Fluent-Bit 命名空间中名为 amazon-cloudwatch 的服务账户。此服务账户用于运行 Fluent Bit daemonSet。有关更多信息,请参阅《Kubernetes 参考》中的管理服务账户

  • Fluent-Bit-role 命名空间中名为 amazon-cloudwatch 的集群角色。该集群角色为 get 服务账户授予有关 pod 日志的 listwatchFluent-Bit 权限。有关更多信息,请参阅《Kubernetes 参考》中的 API 概述

  • Fluent-Bit-config 命名空间中的名为 amazon-cloudwatch 的 ConfigMap。此 ConfigMap 包含要由 Fluent Bit 使用的配置。有关更多信息,请参阅《Kubernetes 任务》文档中的配置 Pod 以使用ConfigMap

如果您要验证 Fluent Bit 设置,请执行以下步骤。

验证 Fluent Bit 设置

  1. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  2. 在导航窗格中,选择 Logs

  3. 确保您位于部署了 Fluent Bit 的区域中。

  4. 检查 区域中的日志组列表。您将看到以下内容:

    • /aws/containerinsights/Cluster_Name/application

    • /aws/containerinsights/Cluster_Name/host

    • /aws/containerinsights/Cluster_Name/dataplane

  5. 导航到其中一个日志组,查看日志流的上次事件时间。如果它是相对于您部署 Fluent Bit 时的最新设置,则会验证设置。

    创建/dataplane日志组时可能会出现轻微延迟。这是正常的,因为只有在 Fluent Bit 开始发送该日志组的日志时,才会创建这些日志组。

多行日志支持

默认情况下,多行日志条目启动器是任何没有空格的字符。这意味着,以不具有空格的字符开头的所有日志行都被视为新的多行日志条目。

如果您自己的应用程序日志使用不同的多行启动器,则可以通过在 Fluent-Bit.yaml 文件中进行两项更改来支持它们。

首先,通过将日志文件的路径名添加到 的 exclude_path 部分的 containers 字段,从默认输入中排除它们Fluent-Bit.yaml。以下是示例。

[INPUT] Name tail Tag application.* Exclude_Path full_pathname_of_log_file*, full_pathname_of_log_file2* Path /var/log/containers/*.log

接下来,将日志文件的数据块添加到 Fluent-Bit.yaml 文件中。请参阅下面的 cloudwatch-agent 日志配置示例,该示例使用时间戳正则表达式作为多行启动器。

application-log.conf: | [INPUT] Name tail Tag application.* Path /var/log/containers/cloudwatch-agent* Docker_Mode On Docker_Mode_Flush 5 Docker_Mode_Parser cwagent_firstline Parser docker DB /fluent-bit/state/flb_cwagent.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 parsers.conf: | [PARSER] Name cwagent_firstline Format regex Regex (?<log>(?<="log":")\d{4}[\/-]\d{1,2}[\/-]\d{1,2}[ T]\d{2}:\d{2}:\d{2}(?!\.).*?)(?<!\\)".*(?<stream>(?<="stream":").*?)".*(?<time>\d{4}-\d{1,2}-\d{1,2}T\d{2}:\d{2}:\d{2}\.\w*).*(?=}) Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%LZ

从 Fluent Bit 减少日志卷(可选)

默认情况下,我们将 Fluent Bit 应用程序日志和 Kubernetes 元数据发送到 CloudWatch。如果您要减少发送到 CloudWatch 的数据量,可以停止将这些数据源中的一个或两个发送到 CloudWatch。

要停止 Fluent Bit 应用程序日志,请从 Fluent-Bit.yaml 文件中删除以下部分。

[INPUT] Name tail Tag application.* Path /var/log/containers/fluent_bit* Parser docker DB /fluent-bit/state/flb_log.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10

要删除 Kubernetes 元数据附加到发送到 的日志事件CloudWatch,请将以下筛选条件添加到 application-log.conf 文件的 Fluent-Bit.yaml 部分。

application-log.conf: | [FILTER] Name nest Match application.* Operation lift Nested_under kubernetes Add_prefix Kube. [FILTER] Name modify Match application.* Remove Kube.<Metadata_1> Remove Kube.<Metadata_2> Remove Kube.<Metadata_3> [FILTER] Name nest Match application.* Operation nest Wildcard Kube.* Nested_under kubernetes Remove_prefix Kube.

Troubleshooting

如果您没有看到这些日志组,并且正在正确的区域中查找,请检查 Fluent Bit daemonSet Pod 的日志以查找错误。

运行以下命令,并确保状态为 Running

kubectl get pods -n amazon-cloudwatch

如果日志具有与IAM权限相关的错误,请检查附加到集群节点的 IAM 角色。有关运行 Amazon EKS 集群所需的权限的更多信息,请参阅 中的 Amazon EKS Amazon EKS IAM 策略、角色和权限Amazon EKS 用户指南

如果 pod 状态为 CreateContainerConfigError,请运行以下命令以获取确切的错误。

kubectl describe pod pod_name -n amazon-cloudwatch

Dashboard

您可以创建一个控制面板来监控每个正在运行的插件的指标。您可以查看输入和输出字节的数据、记录处理速率以及输出错误和重试/失败速率。要查看这些指标,您需要安装具有 CloudWatch 和 Kubernetes 集群的 Prometheus 指标集合的 Amazon EKS 代理。有关如何设置控制面板的更多信息,请参阅在 CloudWatch 和 Kubernetes 集群上安装具有 Prometheus 指标集合的 Amazon EKS 代理

注意

您必须先设置 Container Insights for Prometheus 指标,然后才能设置此控制面板。有关更多信息,请参阅Container Insights Prometheus 指标监控

为 Fluent Bit Prometheus 指标创建控制面板

  1. 创建环境变量,替换右侧以下行中的值以匹配您的部署。

    DASHBOARD_NAME=your_cw_dashboard_name REGION_NAME=your_metric_region_such_as_us-west-1 CLUSTER_NAME=your_kubernetes_cluster_name
  2. 通过运行以下命令来创建控制面板。

    curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/fluent-bit/cw_dashboard_fluent_bit.json \ | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \ | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \ | xargs -0 aws cloudwatch put-dashboard --dashboard-name ${DASHBOARD_NAME} --dashboard-body