将 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 的快速入门设置 中的步骤操作,也可以按照本节中的步骤操作。

无论使用哪种方法,附加到集群节点的 IAM 角色必须具有足够的权限。有关运行 Amazon EKS 集群所需权限的更多信息,请参阅 Amazon EKS 用户指南中的 Amazon EKS IAM 策略、角色和权限

在以下步骤中,您将 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

kubelet.servicekubeproxy.servicedocker.service/var/log/journal 中的日志。

安装 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

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

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

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

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

如果要验证 Fluent Bit 设置,请按照下列步骤操作。

验证 Fluent Bit 设置

  1. 访问 https://console.aws.amazon.com/cloudwatch/,打开 CloudWatch 控制台。

  2. 在导航窗格中,选择 Log groups(日志组)

  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.

问题排查

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

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

kubectl get pods -n amazon-cloudwatch

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

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

kubectl describe pod pod_name -n amazon-cloudwatch

控制面板

您可以创建一个控制面板来监控每个正在运行的插件的指标。您可以查看输入和输出字节以及记录处理率以及输出错误和重试/失败率的数据。要查看这些指标,您需要为 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