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

将 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

  • Fluent Bit 和 Fluentd 中大部分元数据如 pod_namenamespace_name 是相同的,但以下是不同的。

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

    • 两种 Fluent Bit 配置均不使用以下元数据。它们仅存在于 Fluentd 中:container_image_idmaster_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.servicedocker.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,该 ConfigMap 以集群名称和要向其发送日志的区域命名。将 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 daemonset 下载并部署到集群中。

    • 如果需要 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
    • 如果需要更类似于 Fluentd 的 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-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.aws.amazon.com/cloudwatch/

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

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

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

    • /aws/containerinsights/Cluster_Name/application

    • /aws/containerinsights/Cluster_Name/host

    • /aws/containerinsights/Cluster_Name/dataplane

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

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

多行日志支持

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

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

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

[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 的日志事件,请在 Fluent-Bit.yaml 文件的 application-log.conf 部分中添加以下筛选条件。

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 用户指南中的 Amazon EKS IAM 策略、角色和权限

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

kubectl describe pod pod_name -n amazon-cloudwatch

Dashboard

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

注意

在设置此控制面板之前,您必须为 Prometheus 指标设置 Container Insights。有关更多信息,请参阅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