本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 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-proxy
和aws-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_url
、namespace_id
和namespace_labels
。
-
设置 Fluent Bit
要设置 Fluent Bit 以从容器中收集日志,您可以按照中的步骤操作Amazon EKS 和 Kubernetes 上的 Container Insights 快速入门设置,也可以按照本节中的步骤操作。
在以下步骤中,您将 Fluent Bit 设置为daemonSet以将日志发送到 CloudWatch Logs。完成此步骤后,Fluent Bit 将创建以下日志组(如果它们尚不存在)。
日志组名称 | 日志源 |
---|---|
|
|
|
来自 |
|
|
安装 Fluent Bit 以将日志从容器发送到 CloudWatch Logs
-
如果您还没有名为 的命名空间
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
-
运行以下命令以使用
cluster-info
集群名称和要将日志发送到的 区域创建名为 的 ConfigMap。Replacecluster-name
和cluster-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'
,它将收集文件系统中的所有日志。 -
运行以下命令之一以将 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
-
-
运行以下命令以验证部署。每个节点应有一个名为 fluent-bit-* 的 pod。
kubectl get pods -n amazon-cloudwatch
上述步骤在集群中创建以下资源:
-
Fluent-Bit
命名空间中名为amazon-cloudwatch
的服务账户。此服务账户用于运行 Fluent Bit daemonSet。有关更多信息,请参阅《Kubernetes 参考》中的管理服务账户。 -
Fluent-Bit-role
命名空间中名为amazon-cloudwatch
的集群角色。该集群角色为get
服务账户授予有关 pod 日志的list
、watch
和Fluent-Bit
权限。有关更多信息,请参阅《Kubernetes 参考》中的 API 概述。 -
Fluent-Bit-config
命名空间中的名为amazon-cloudwatch
的 ConfigMap。此 ConfigMap 包含要由 Fluent Bit 使用的配置。有关更多信息,请参阅《Kubernetes 任务》文档中的配置 Pod 以使用ConfigMap。
如果您要验证 Fluent Bit 设置,请执行以下步骤。
验证 Fluent Bit 设置
-
通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/
。 -
在导航窗格中,选择 Logs。
-
确保您位于部署了 Fluent Bit 的区域中。
-
检查 区域中的日志组列表。您将看到以下内容:
-
/aws/containerinsights/
Cluster_Name
/application -
/aws/containerinsights/
Cluster_Name
/host -
/aws/containerinsights/
Cluster_Name
/dataplane
-
-
导航到其中一个日志组,查看日志流的上次事件时间。如果它是相对于您部署 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 指标创建控制面板
-
创建环境变量,替换右侧以下行中的值以匹配您的部署。
DASHBOARD_NAME=
your_cw_dashboard_name
REGION_NAME=your_metric_region_such_as_us-west-1
CLUSTER_NAME=your_kubernetes_cluster_name
-
通过运行以下命令来创建控制面板。
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