Fargate 日志记录
Fargate 上的 Amazon EKS 提供了一个基于 Fluent Bit 的内置日志路由器。这意味着您没有明确地将 Fluent Bit 容器作为 Sidecar 运行,但 Amazon 会为您运行它。您只需配置日志路由器即可。通过必须满足以下条件的专用 ConfigMap
进行配置:
-
名为
aws-logging
-
在名为
aws-observability
的专用命名空间中创建
一旦您创建了 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 Kinesis Data Firehose 将日志流式传输到 Amazon S3、Amazon Kinesis Data Streams 和合作伙伴工具等目标。
先决条件
-
现有的 Fargate 配置文件,用于指定您将 Fargate Pod 部署到的现有 Kubernetes 命名空间。有关更多信息,请参阅 为您的集群创建 Fargate 配置文件。
-
现有的 Fargate Pod 执行角色。有关更多信息,请参阅 创建 Fargate Pod 执行角色。
日志路由器配置
配置日志路由器
在以下步骤中,将每个
替换为您自己的值。example-value
-
创建一个名为
aws-observability
的专用 Kubernetes 命名空间。-
将以下内容保存到计算机上名为
的文件中。aws-observability-namespace
.yamlname
的值必须为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
部分,并管理Service
和Input
部分本身。 -
Parser
部分。
如果您提供了除
Filter
、Output
和Parser
之外的任何其他部分,则这些部分会被拒绝。在创建
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
和kubernetes
。 -
ConfigMap
中必须至少提供一个受支持的Output
插件才能启用日志记录。不需要Filter
和Parser
即可启用日志记录。
您还可以使用所需的配置在 Amazon EC2 上运行 Fluent Bit,以对验证过程中出现的任何问题进行故障排除。使用以下示例之一创建您的
ConfigMap
。重要 Amazon EKS Fargate 日志记录不支持
ConfigMaps
的动态配置。对ConfigMaps
所做的任何更改均仅应用于新 Pod。不会将更改应用于现有 Pod。使用所需日志目标的示例创建
ConfigMap
。 -
-
使用上一步中下载的策略文件创建 IAM 策略。
aws iam create-policy --policy-name
eks-fargate-logging-policy
--policy-document file://permissions.json -
将 IAM 策略附加到为 Fargate 配置文件指定的 Pod 执行角色。将
替换为您的账户 ID。111122223333
aws iam attach-role-policy \ --policy-arn arn:aws:iam::
111122223333
:policy/eks-fargate-logging-policy
\ --role-nameyour-pod-execution-role
Kubernetes 筛选器支持
此功能需要以下最低 Kubernetes 版本和平台版本或更高版本。支持比表中列出的版本更高的任何 Kubernetes 和平台版本。
Kubernetes 版本 | 平台版本 |
---|---|
1.21 | eks.3 |
1.20 | eks.3 |
1.19 | eks.7 |
1.18 | eks.9 |
1.17 | eks.10 |
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 会与 API 服务器通信以获取最新的元数据。
将 Fluent-bit 流程日志发送到您的账户
您可以使用下面的 ConfigMap
将 Fluent Bit 流程日志发送到 Amazon CloudWatch。将
替换为 Amazon Web Services 区域。region-code
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
日志位于 CloudWatch 下集群所在的 Amazon Web Services 区域中。日志组名称为
,Fluent Bit 日志流名称为 my-cluster
-fluent-bit-logsfluent-bit-
。podname
-pod-namespace
-
仅当 Fluent Bit 流程成功开始后,才会发送流程日志。如果启动 Fluent Bit 时出现故障,则会丢失流程日志。您只能将流程日志发送到 CloudWatch。
-
要调试将流程日志传输到您的账户,可以应用以前的
ConfigMap
获取流程日志。Fluent Bit 启动失败通常是启动时 Fluent Bit 未解析或接受ConfigMap
导致的。
测试应用程序
-
部署示例 Pod。
-
将以下内容保存到计算机上名为
的文件中。sample-app
.yamlapiVersion: 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 日志。
大小注意事项
我们建议您为日志路由器规划最多 50 MB 的内存。如果您希望应用程序以非常高的吞吐量生成日志,那么您应该规划高达 100 MB 的内存。
故障排除
要确认日志记录功能是否因某种原因(例如无效 ConfigMap
)而启用还是禁用,以及无效的原因,请使用
检查您的 Pod(一组容器)事件。输出可能包含澄清是否已启用日志记录的 Pod 事件,例如以下示例输出。kubectl describe 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 事件是短暂性的,时间长短取决于设置。您也可以使用
查看 Pod 的注释。Pod 注释中包含有关日志记录功能是已启用还是已禁用状态以及对应原因的信息。kubectl describe pod
pod-name