Amazon CloudWatch
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

将 FluentD 设置为 DaemonSet 以将日志发送到 CloudWatch Logs

要设置 FluentD 以从容器中收集日志,您可以按照 Amazon EKS 上的 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

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

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

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

为 CloudWatch 创建命名空间

  • 输入以下命令。

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/master/k8s-yaml-templates/cloudwatch-namespace.yaml

步骤 2:安装 FluentD

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

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

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

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

安装 FluentD

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

    kubectl create configmap cluster-info \ --from-literal=cluster.name=cluster_name \ --from-literal=logs.region=region_name -n amazon-cloudwatch
  2. 运行以下命令将 FluentD DaemonSet 下载并部署到集群中。

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/master/k8s-yaml-templates/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 文件中进行两项更改来支持它们。

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

<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 的日志事件,请在 fluentd.yaml 文件的 record_transformer 部分中添加一行。在要删除此元数据的日志源中,添加以下行。

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>

故障排除

如果您没有看到这些日志组并且查看的是正确区域,请检查 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 用户指南 中的 Amazon EKS IAM 策略、角色和权限

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

kubectl describe pod pod_name -n amazon-cloudwatch