(可选)将 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 将创建以下日志组(如果日志组尚不存在)。
日志组名称 | 日志源 |
---|---|
|
|
|
|
|
|
步骤 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 日志的get
、list
和watch
权限。有关更多信息,请参阅《Kubernetes 参考》中的 API 概述。 -
amazon-cloudwatch
命名空间中的名为fluentd-config
的 ConfigMap。该 ConfigMap 包含由 Fluentd 使用的配置。有关更多信息,请参阅《Kubernetes 任务》文档中的 配置 Pod 以使用 ConfigMap。
要安装 Fluentd
-
使用集群名称和日志将发送到的 AWS 区域创建一个名为
cluster-info
的 ConfigMap。运行以下命令,并使用您的集群和区域名称更新占位符。kubectl create configmap cluster-info \ --from-literal=cluster.name=
cluster_name
\ --from-literal=logs.region=region_name
-n amazon-cloudwatch -
运行以下命令将 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
。 -
运行以下命令以验证部署。每个节点应具有一个名为
fluentd-cloudwatch-*
的 pod。kubectl get pods -n amazon-cloudwatch
步骤 3:验证 Fluentd 设置
要验证您的 Fluentd 设置,请按照以下步骤进行操作。
要验证 Container Insights 的 Fluentd 设置
访问 https://console.aws.amazon.com/cloudwatch/
打开 CloudWatch 控制台。 -
在导航窗格中,选择 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.yaml
的 containers
部分的 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