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

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

(可选)将 FluentD 设置为 DaemonSet 以将日志发送到 CloudWatch Logs

注意

Amazon 现已推出 Fluent Bit 作为 Container Insights 的默认日志解决方案,并获得显著的性能收益。我们建议您使用 Fluent Bit 而不是 Fluentd。有关更多信息,请参阅将 Fluent Bit 设置为 DaemonSet 以将日志发送到 CloudWatch Logs

要设置 FluentD 以从容器中收集日志,您可以按照 Amazon EKS 和 Kubernetes 上的 Container Insights 快速入门设置中的步骤操作,也可以按照本节中的步骤操作。在以下步骤中,您将 FluentD 设置为 DaemonSet 以将日志发送到 CloudWatch Logs。在完成该步骤时,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

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

步骤 1:为 CloudWatch 创建命名空间

使用以下步骤为 amazon-cloudwatch 创建名为 CloudWatch 的 Kubernetes 命名空间。如果已创建该命名空间,您可以跳过此步骤。

为 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:安装 FluentD

下载 FluentD 以开始执行该过程。在完成这些步骤时,部署将在集群上创建以下资源:

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

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

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

安装 FluentD

  1. 使用集群名称和日志将发送到的 cluster-info 区域创建一个名为 AWS 的 ConfigMap。运行以下命令,并使用您的集群和区域名称更新占位符。

    kubectl create configmap cluster-info \ --from-literal=cluster.name=cluster_name \ --from-literal=logs.region=region_name -n amazon-cloudwatch
  2. 运行以下命令将 FluentD DaemonSet 下载并部署到集群中。确保您使用的是具有正确架构的容器映像。该示例清单仅适用于 x86 实例CrashLoopBackOff,如果您的集群中有高级 RISC 系统 (ARM) 实例,则将进入该清单。FluentD daemonSet没有官方多架构 Docker 映像,这使您能够对多个基础映像使用一个标签,并让容器运行时向右拉取一个。FluentD ARM 映像使用后缀不同的标签arm64

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

    kubectl get pods -n amazon-cloudwatch

步骤 3:验证 FluentD 设置

要验证您的 FluentD 设置,请使用以下步骤。

验证 Container Insights 的 FluentD 设置

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

  2. 在导航窗格中,选择 Logs。确保您位于将 FluentD 部署到您的容器的区域中。

    在该区域上的日志组列表中,您将会看到以下内容:

    • /aws/containerinsights/Cluster_Name/application

    • /aws/containerinsights/Cluster_Name/host

    • /aws/containerinsights/Cluster_Name/dataplane

    如果看到这些日志组,则已验证 FluentD 设置。

多行日志支持

2019 年 8 月 19 日,我们为 FluentD 收集的日志添加了多行日志支持。

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

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

首先,通过将日志文件的路径名添加到 exclude_pathcontainers 部分的 fluentd.yaml 字段中,将它们从默认的多行支持中排除。以下是示例。

<source> @type tail @id in_tail_container_logs @label @containers path /var/log/containers/*.log exclude_path ["full_pathname_of_log_file*", "full_pathname_of_log_file2*"]

接下来,将日志文件的数据块添加到 fluentd.yaml 文件中。以下示例用于 CloudWatch 代理的日志文件,该文件使用时间戳正则表达式作为多行启动器。您可以复制此数据块并将其添加到 fluentd.yaml。更改指示的行以反映您要使用的应用程序日志文件名和多行启动器。

<source> @type tail @id in_tail_cwagent_logs @label @cwagentlogs path /var/log/containers/cloudwatch-agent* pos_file /var/log/cloudwatch-agent.log.pos tag * read_from_head true <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source>
<label @cwagentlogs> <filter **> @type kubernetes_metadata @id filter_kube_metadata_cwagent </filter> <filter **> @type record_transformer @id filter_cwagent_stream_transformer <record> stream_name ${tag_parts[3]} </record> </filter> <filter **> @type concat key log multiline_start_regexp /^\d{4}[-/]\d{1,2}[-/]\d{1,2}/ separator "" flush_interval 5 timeout_label @NORMAL </filter> <match **> @type relabel @label @NORMAL </match> </label>

从 FluentD 减少日志卷(可选)

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

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

<source> @type tail @id in_tail_fluentd_logs @label @fluentdlogs path /var/log/containers/fluentd* pos_file /var/log/fluentd.log.pos tag * read_from_head true <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source> <label @fluentdlogs> <filter **> @type kubernetes_metadata @id filter_kube_metadata_fluentd </filter> <filter **> @type record_transformer @id filter_fluentd_stream_transformer <record> stream_name ${tag_parts[3]} </record> </filter> <match **> @type relabel @label @NORMAL </match> </label>

要取消将 Kubernetes 元数据附加到发送到 CloudWatch 的日志事件,请在 record_transformer 文件的 fluentd.yaml 部分中添加一行。在要删除此元数据的日志源中,添加以下行。

remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id

例如:

<filter **> @type record_transformer @id filter_containers_stream_transformer <record> stream_name ${tag_parts[3]} </record> remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id </filter>

Troubleshooting

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

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

kubectl get pods -n amazon-cloudwatch

在上一命令的结果中,记下以 fluentd-cloudwatch 开头的 pod 名称。在以下命令中使用该 pod 名称。

kubectl logs pod_name -n amazon-cloudwatch

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

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

kubectl describe pod pod_name -n amazon-cloudwatch

如果 pod 状态为 CrashLoopBackOff,请确保 Fluentd 容器映像的架构与安装 Fluentd 时的 节点相同。如果您的集群同时具有 x86 和 ARM64 节点,您可以使用 kubernetes.io/arch 标签将图像放置在正确的节点上。有关更多信息,请参阅 kubentes.io/arch。