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

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

警告

Container Insights 对 Fluentd 的支持目前处于维护模式,这意味着 AWS 不会为 Fluentd 提供任何进一步的更新,我们计划在不久的将来将其弃用。此外,Container Insights 的当前 Fluentd 配置使用的是旧版本的 Fluentd 映像 fluent/fluentd-kubernetes-daemonset:v1.10.3-debian-cloudwatch-1.0,该版本没有最新的改进和安全补丁。有关开源社群支持的最新 Fluentd 映像,请参阅 fluentd-kubernetes-daemonset

如果可能,我们强烈建议您迁移以将 FluentBit 与 Container Insights 结合使用。使用 FluentBit 作为 Container Insights 的日志转发器,可显着提高性能。

有关更多信息,请参阅 将 Fluent Bit 设置为 DaemonSet 以将日志发送到 CloudWatch Logs 您在使用 Fluentd 时出现的差异

要设置 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

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/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/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 下载并部署到集群中。确保您使用的是具有正确架构的容器镜像。示例清单仅适用于 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
    注意

    由于最近进行了更改,以优化 Fluentd 配置并最大限度地减少 Fluentd API 请求对 Kubernetes API 端点的影响,因此默认情况下,Kubernetes 筛选条件的“监视”选项已禁用。有关更多详细信息,请参阅 fluent-plugin-kubernetes_metadata_filter

  3. 运行以下命令以验证部署。每个节点应具有一个名为 fluentd-cloudwatch-* 的 pod。

    kubectl get pods -n amazon-cloudwatch

步骤 3:验证 Fluentd 设置

要验证您的 Fluentd 设置,请按照以下步骤进行操作。

要验证 Container Insights 的 Fluentd 设置
  1. 访问 https://console.aws.amazon.com/cloudwatch/ 打开 CloudWatch 控制台。

  2. 在导航窗格中,选择 Log groups(日志组)。确保您位于将 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

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