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

将 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 将创建以下日志组(如果尚不存在)。

重要

如果您已经在 Container Insights 中配置了 FluentD 并且 FluentD DaemonSet 没有按预期运行(如果您使用 containerd 运行时系统可能会发生这种情况),则必须在安装 Fluent Bit 之前将其卸载,以防止 Fluent Bit 处理 FluentD 错误日志消息。否则,您必须在成功安装 Fluent Bit 后立即卸载 FluentD。在安装 Fluent Bit 后卸载 Fluentd 可确保在此迁移过程中日志记录的连续性。将日志发送到 CloudWatch Logs 只需要 Fluent Bit 或 FluentD 中的其中一个。

日志组名称 日志源

/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 下载并部署到集群中。

    • 如果需要针对 Linux 计算机的 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
    • 如果需要针对 Windows 计算机的 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-windows.yaml
    • 如果使用 Linux 计算机且需要更类似于 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
    重要

    默认情况下,Fluent Bit 守护程序集配置会将日志级别设置为 INFO,这可能会导致 CloudWatch Logs 摄取成本增加。要减少日志摄取量和成本,您可以将日志级别更改为 ERROR。

    有关如何减少日志量的更多信息,请参阅 (可选)从 Fluent Bit 减少日志卷

  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 用于多行日志的信息,请参阅 Fluent Bit 文档的以下部分:

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

默认情况下,我们将 Fluent Bit 应用程序日志和 Kubernetes 元数据发送到 CloudWatch。如果您要减少发送到 CloudWatch 的数据量,可以停止将这些数据源中的一个或两个发送到 CloudWatch。如果您已按照本页上的步骤设置 Fluent Bit,则请通过之前运行的 kubectl apply 命令下载 Kubernetes 清单 YAML 文件,并根据您的更改对其进行修改,然后可以将其重新应用到集群。或者,如果您使用的是 Amazon CloudWatch 可观测性 EKS 加载项或 Helm 图表,则请参阅 (可选)其他配置,了解有关使用加载项的高级配置或 Helm 图表管理 Fluent Bit 配置的信息。

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

[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 配置的 application-log.conf 部分中添加以下筛选条件。将 <Metadata_1> 和类似字段替换为实际的元数据标识符。

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 代理

注意

在设置此控制面板之前,您必须为 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