帮助改进此页面
要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。
为集群启动 Amazon Fargate 日志记录
Fargate 上的 Amazon EKS 提供了一个基于 Fluent Bit 的内置日志路由器。这意味着您没有明确地将 Fluent Bit 容器作为边车容器运行,但 Amazon 会为您运行该容器。您只需配置日志路由器即可。通过必须满足以下条件的专用 ConfigMap
进行配置:
-
名为
aws-logging
-
在名为
aws-observability
的专用命名空间中创建 -
不能超过 5300 个字符。
一旦您创建了 ConfigMap
,Fargate 上的 Amazon EKS 会自动检测到它并使用它来配置日志路由器。Fargate 使用 Amazon for Fluent Bit 的版本是 Fluent Bit 的一种上游合规发行版,由Amazon托管。有关更多信息,请参阅 GitHub 上的 Amazon for Fluent Bit
日志路由器允许您使用广泛的Amazon服务进行日志分析和存储。您可以将日志从 Fargate 直接流式传输到 Amazon CloudWatch、Amazon OpenSearch Service。您还可以通过 Amazon Data Firehose
-
现有的 Fargate 配置文件,用于指定您将 Fargate 容器组(pod)部署到的现有 Kubernetes 命名空间。有关更多信息,请参阅 第 3 步:为集群创建 Fargate 配置文件。
-
现有的 Fargate 容器组(pod)执行角色。有关更多信息,请参阅 第 2 步:创建 Fargate 容器组(pod)执行角色。
日志路由器配置
在以下步骤中,将所有 example value
替换为您自己的值。
-
创建一个名为
aws-observability
的专用 Kubernetes 命名空间。-
将以下内容保存到计算机上名为
aws-observability-namespace.yaml
的文件中。name
的值必须为aws-observability
,并且aws-observability: enabled
标注是必需的。kind: Namespace apiVersion: v1 metadata: name: aws-observability labels: aws-observability: enabled
-
创建命名空间。
kubectl apply -f aws-observability-namespace.yaml
-
-
创建带有
Fluent Conf
数据值的ConfigMap
,以将容器日志发送到某个目标。Fluent Conf 为 Fluent Bit,是一种快速轻量级日志处理器配置语言,用于将容器日志路由到您选择的日志目标。有关更多信息,请参阅 Fluent Bit 文档中的配置文件。 重要
典型
Fluent Conf
中包含的主要部分为Service
、Input
、Filter
和Output
。但是,Fargate 日志路由器仅接受:-
Filter
和Output
部分。 -
Parser
部分。
如果您提供任何其他部分,将被拒绝。
Fargate 日志路由器管理
Service
和Input
部分。它包含以下Input
部分,无法修改,并且您的ConfigMap
也不需要该部分。但是,您可以从中获取见解,例如内存缓冲区限制和应用于日志的标签。[INPUT] Name tail Buffer_Max_Size 66KB DB /var/log/flb_kube.db Mem_Buf_Limit 45MB Path /var/log/containers/*.log Read_From_Head On Refresh_Interval 10 Rotate_Wait 30 Skip_Long_Lines On Tag kube.*
在创建
ConfigMap
时,请考虑 Fargate 用于验证字段的以下规则:-
[FILTER]
、[OUTPUT]
和[PARSER]
应该在每个相应的键下指定。例如,[FILTER]
必须在filters.conf
下。在filters.conf
下可以有一个或多个[FILTER]
。[OUTPUT]
和[PARSER]
部分也应在其相应的键下。通过指定多个[OUTPUT]
部分,您可以同时将日志路由到不同的目标。 -
Fargate 会验证每个部分所需的键。
Name
和match
是每个[FILTER]
和[OUTPUT]
所必需的。Name
和format
是每个[PARSER]
所必需的。键不区分大小写。 -
在
ConfigMap
中不允许使用环境变量(例如${ENV_VAR}
)。 -
对于每个
filters.conf
、output.conf
和parsers.conf
中的指令或键值对,缩进必须是相同的。键值对的缩进必须多于指令。 -
Fargate 根据以下受支持的筛选条件进行验证:
grep
、parser
、record_modifier
、rewrite_tag
、throttle
、nest
、modify
和kubernetes
。 -
Fargate 根据以下受支持的输出进行验证:
es
、firehose
、kinesis_firehose
、cloudwatch
、cloudwatch_logs
和kinesis
。 -
ConfigMap
中必须至少提供一个受支持的Output
插件才能启用日志记录。不需要Filter
和Parser
即可启用日志记录。您还可以使用所需的配置在 Amazon EC2 上运行 Fluent Bit,以对验证过程中出现的任何问题进行故障排除。使用以下示例之一创建您的
ConfigMap
。重要
Amazon EKS Fargate 日志记录不支持
ConfigMap
的动态配置。对ConfigMap
所做的任何更改都只会应用于新容器组(pod)。不会将更改应用于现有容器组(pod)。使用所需日志目标的示例创建
ConfigMap
。注意
您也可以将 Amazon Kinesis Data Streams 用作您的日志目的地。如果您使用 Kinesis Data Streams,则请确保容器组(pod)执行角色已被授予
kinesis:PutRecords
权限。有关更多信息,请参阅《Fluent Bit:官方手册》中的 Amazon Kinesis Data Streams 权限。
-
-
为 Fargate 容器组执行角色设置向目标发送日志的权限。
-
将目标的 IAM 策略下载到您的计算机。
-
使用下载的策略文件创建一个 IAM 策略。
aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
-
使用以下命令将 IAM policy 附加到为 Fargate 配置文件指定的容器组(pod)执行角色。请将
111122223333
替换为您的账户 ID。将AmazonEKSFargatePodExecutionRole
替换为容器组(pod)执行角色(有关更多信息,请参阅第 2 步:创建 Fargate 容器组(pod)执行角色)。aws iam attach-role-policy \ --policy-arn arn:aws-cn:iam::
111122223333
:policy/eks-fargate-logging-policy \ --role-nameAmazonEKSFargatePodExecutionRole
-
Kubernetes 筛选器支持
此功能需要以下最低 Kubernetes 版本和平台版本或更高版本。
Kubernetes 版本 | 平台版本 |
---|---|
1.23 和更高版本 |
eks.1 |
Fluent Bit Kubernetes 筛选器允许您将 Kubernetes 元数据添加到日志文件中。有关筛选器的更多信息,请参阅 Fluent Bit 文档中的 Kubernetes
filters.conf: | [FILTER] Name kubernetes Match kube.* Merge_Log On Buffer_Size 0 Kube_Meta_Cache_TTL
300
s
重要
-
Kube_URL
、Kube_CA_File
、Kube_Token_Command
和Kube_Token_File
是服务拥有的配置参数,不能指定。Amazon EKS Fargate 填充这些值。 -
Kube_Meta_Cache_TTL
是 Fluent Bit 与 API 服务器通信以获取最新元数据等待的时间。如果未指定Kube_Meta_Cache_TTL
,则 Amazon EKS Fargate 会追加原定设置值 30 分钟,以减轻 API 服务器的负载。
将 Fluent Bit 进程日志发送到您的账户
您可以选择使用下面的 ConfigMap
,将 Fluent Bit 进程日志发送到 Amazon CloudWatch。将 Fluent Bit 进程日志发送到 CloudWatch 需要额外的日志摄取和存储成本。将 region-code
替换为您的集群所在的 Amazon 区域。
kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability labels: data: # Configuration files: server, input, filters and output # ====================================================== flb_log_cw: "true" # Ships Fluent Bit process logs to CloudWatch. output.conf: | [OUTPUT] Name cloudwatch Match kube.* region
region-code
log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group true
日志位于集群所在 Amazon 区域的 CloudWatch 中。日志组名称为
,Fluent Bit 日志流名称为 my-cluster
-fluent-bit-logsfluent-bit-
。podname
-pod-namespace
注意
-
仅当 Fluent Bit 流程成功开始后,才会发送流程日志。如果启动 Fluent Bit 时出现故障,则会丢失流程日志。您只能将流程日志发送到 CloudWatch。
-
要调试将流程日志传输到您的账户,可以应用以前的
ConfigMap
获取流程日志。Fluent Bit 启动失败通常是启动时 Fluent Bit 未解析或接受ConfigMap
导致的。
停止发送 Fluent Bit 进程日志
将 Fluent Bit 进程日志发送到 CloudWatch 需要额外的日志摄取和存储成本。要排除现有 ConfigMap
设置中的进程日志,请执行以下步骤。
-
在启用 Fargate 日志记录后,找到为 Amazon EKS 集群的 Fluent Bit 进程日志自动创建的 CloudWatch 日志组。它遵循格式
my-cluster
-fluent-bit-logs -
删除 CloudWatch 日志组中为每个容器组(pod)的进程日志创建的现有 CloudWatch 日志流。
-
编辑
ConfigMap
并设置flb_log_cw: "false"
。 -
重启集群中的任何现有容器组(pod)。
测试应用程序
-
部署示例容器组(pod)。
-
将以下内容保存到计算机上名为
sample-app.yaml
的文件中。apiVersion: apps/v1 kind: Deployment metadata: name: sample-app namespace:
same-namespace-as-your-fargate-profile
spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - name: http containerPort: 80 -
将清单应用于集群。
kubectl apply -f sample-app.yaml
-
-
使用您在
ConfigMap
中配置的目标查看 NGINX 日志。
大小注意事项
我们建议您为日志路由器规划最多 50MB 的内存。如果您希望应用程序以非常高的吞吐量生成日志,那么您应该规划高达 100MB 的内存。
故障排除
要确认日志记录功能是否因某种原因(例如无效 ConfigMap
)而启用还是禁用,以及无效的原因,请使用 kubectl describe pod
检查您的容器组(pod)事件。输出可能包含澄清是否已启用日志记录的容器组(pod)事件,例如以下示例输出。pod-name
[...] Annotations: CapacityProvisioned: 0.25vCPU 0.5GB Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND kubernetes.io/psp: eks.privileged [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning LoggingDisabled <unknown> fargate-scheduler Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
容器组(pod)事件是短暂的,时间长短取决于设置。您也可以使用 kubectl describe pod
查看容器组(pod)的注释。容器组(pod)注释中包含有关日志记录功能是已启用还是已禁用状态以及对应原因的信息。pod-name