第 10 章 日志收集和转发
10.1. 关于日志收集和转发
Red Hat OpenShift Logging Operator 根据 ClusterLogForwarder
资源规格部署一个收集器。此 Operator 支持两个收集器选项:旧的 Fluentd 收集器和 Vector 收集器。
Fluentd 已被弃用,计划在以后的发行版本中删除。红帽将在当前发行生命周期中将提供对这个功能的 bug 修复和支持,但此功能将不再获得改进。作为 Fluentd 的替代选择,您可以使用 Vector。
10.1.1. 日志集合
日志收集器是一个守护进程集,它将 Pod 部署到每个 OpenShift Container Platform 节点,以收集容器和节点日志。
默认情况下,日志收集器使用以下源:
- 由来自操作系统、容器运行时和 OpenShift Container Platform 的 journald 日志消息生成的系统和基础架构日志。
-
/var/log/containers/*.log
用于所有容器日志
如果您将日志收集器配置为收集审计日志,它会从 /var/log/audit/audit.log
收集它们。
日志收集器从这些源收集日志,并根据日志记录配置在内部或外部转发它们。
10.1.1.1. 日志收集器类型
Vector 是一个日志收集器,作为日志记录的 Fluentd 的一个替代方案。
您可以通过修改 ClusterLogging
自定义资源(CR) collection
规格来配置集群使用的日志记录收集器类型:
将 Vector 配置为收集器的 ClusterLogging CR 示例
apiVersion: logging.openshift.io/v1 kind: ClusterLogging metadata: name: instance namespace: openshift-logging spec: collection: logs: type: vector vector: {} # ...
10.1.1.2. 日志收集限制
容器运行时提供少许信息来标识日志消息的来源,如项目、容器名称和容器 ID。这些信息不足以区分日志的来源。如果在日志收集器开始处理日志之前删除了具有指定名称和项目的 Pod,则来自 API 服务器的信息(如标签和注解)可能会不可用。可能没有办法区分来自名称相似的 Pod 和项目的日志消息,也无法追溯日志的来源。这种限制意味着日志收集和规范化被视为 最佳工作。
可用的容器运行时提供少许信息来标识日志消息来源,无法确保唯一的个别日志消息,也不能保证可以追溯这些消息的来源。
10.1.1.3. 按类型划分的日志收集器功能
功能 | Fluentd | Vector |
---|---|---|
应用程序容器日志 | ✓ | ✓ |
特定于应用程序的路由 | ✓ | ✓ |
命名空间划分应用程序特定路由 | ✓ | ✓ |
Infra 容器日志 | ✓ | ✓ |
Infra 日志 | ✓ | ✓ |
kube API 审计日志 | ✓ | ✓ |
OpenShift API 审计日志 | ✓ | ✓ |
打开虚拟网络 (OVN) 审计日志 | ✓ | ✓ |
功能 | Fluentd | Vector |
---|---|---|
Elasticsearch 证书 | ✓ | ✓ |
Elasticsearch 用户名/密码 | ✓ | ✓ |
Amazon Cloudwatch 密钥 | ✓ | ✓ |
Amazon Cloudwatch STS | ✓ | ✓ |
Kafka 证书 | ✓ | ✓ |
Kafka 用户名/密码 | ✓ | ✓ |
Kafka SASL | ✓ | ✓ |
Loki bearer 令牌 | ✓ | ✓ |
功能 | Fluentd | Vector |
---|---|---|
ViaQ 数据模型 - 应用程序 | ✓ | ✓ |
ViaQ 数据模型 - infra | ✓ | ✓ |
ViaQ 数据模型 - infra(journal) | ✓ | ✓ |
ViaQ 数据模型 - Linux 审计 | ✓ | ✓ |
ViaQ 数据模型 - kube-apiserver 审计 | ✓ | ✓ |
ViaQ 数据模型 - OpenShift API 审计 | ✓ | ✓ |
ViaQ 数据模型 - OVN | ✓ | ✓ |
loglevel Normalization | ✓ | ✓ |
JSON 解析 | ✓ | ✓ |
结构化索引 | ✓ | ✓ |
多行错误检测 | ✓ | ✓ |
multicontainer/ split 索引 | ✓ | ✓ |
Flatten 标签 | ✓ | ✓ |
CLF 静态标签 | ✓ | ✓ |
功能 | Fluentd | Vector |
---|---|---|
Fluentd readlinelimit | ✓ | |
Fluentd 缓冲 | ✓ | |
- chunklimitsize | ✓ | |
- totallimitsize | ✓ | |
- overflowaction | ✓ | |
- flushthreadcount | ✓ | |
- flushmode | ✓ | |
- flushinterval | ✓ | |
- retrywait | ✓ | |
- retrytype | ✓ | |
- retrymaxinterval | ✓ | |
- retrytimeout | ✓ |
功能 | Fluentd | Vector |
---|---|---|
指标 | ✓ | ✓ |
Dashboard | ✓ | ✓ |
警报 | ✓ | ✓ |
功能 | Fluentd | Vector |
---|---|---|
全局代理支持 | ✓ | ✓ |
x86 支持 | ✓ | ✓ |
ARM 支持 | ✓ | ✓ |
IBM Power® 支持 | ✓ | ✓ |
IBM Z® 支持 | ✓ | ✓ |
IPv6 支持 | ✓ | ✓ |
日志事件缓冲 | ✓ | |
断开连接的集群 | ✓ | ✓ |
10.1.1.4. 收集器输出
支持以下收集器输出:
功能 | Fluentd | Vector |
---|---|---|
Elasticsearch v6-v8 | ✓ | ✓ |
Fluent 转发 | ✓ | |
Syslog RFC3164 | ✓ | ✓ (Logging 5.7+) |
Syslog RFC5424 | ✓ | ✓ (Logging 5.7+) |
Kafka | ✓ | ✓ |
Amazon Cloudwatch | ✓ | ✓ |
Amazon Cloudwatch STS | ✓ | ✓ |
Loki | ✓ | ✓ |
HTTP | ✓ | ✓ (Logging 5.7+) |
Google Cloud Logging | ✓ | ✓ |
Splunk | ✓ (Logging 5.6+) |
10.1.2. 日志转发
管理员可以创建 ClusterLogForwarder
资源,以指定要收集哪些日志、它们的转换方式以及它们被转发到的位置。
ClusterLogForwarder
资源可用于将容器、基础架构和审计日志转发到集群内部或外部的特定端点。支持传输层安全性(TLS),以便可以配置日志转发来安全地发送日志。
管理员也可以授权 RBAC 权限来定义哪些服务帐户和用户可以访问和转发哪些日志类型。
10.1.2.1. 日志转发实现
可用的日志转发实现有两个:旧的实现和多日志转发器功能。
仅支持 Vector 收集器与多日志转发器功能一起使用。Fluentd 收集器只能用于旧的实现。
10.1.2.1.1. 旧实施
在旧的实现中,集群中只能使用一个日志转发器。此模式的 ClusterLogForwarder
资源必须命名为 instance
,且必须在 openshift-logging
命名空间中创建。ClusterLogForwarder
资源还需要 openshift-logging
命名空间中名为 instance
的对应 ClusterLogging
资源。
10.1.2.1.2. 多日志转发器功能
日志记录 5.8 及更高版本中提供了多日志转发器功能,并提供以下功能:
- 管理员可以控制哪些用户被允许定义日志收集以及允许收集哪些日志。
- 具有所需权限的用户可以指定额外的日志收集配置。
- 从已弃用的 Fluentd 收集器迁移到 Vector 收集器的管理员可以独立于现有部署部署新的日志转发程序。在迁移工作负载时,现有和新的日志转发程序可以同时运行。
在多日志转发器实现中,您不需要为 ClusterLogForwarder
资源创建对应的 ClusterLogging
资源。您可以使用任何命名空间中的任何名称创建多个 ClusterLogForwarder
资源,但以下例外:
-
您无法在
openshift-logging
命名空间中创建一个名为instance
的ClusterLogForwarder
资源,因为它为支持使用 Fluentd 收集器的传统工作流的日志转发器保留。 -
您无法在
openshift-logging
命名空间中创建一个名为collector
的ClusterLogForwarder
资源,因为这为收集器保留。
10.1.2.2. 为集群启用多日志转发器功能
要使用多日志转发器功能,您必须为该服务帐户创建服务帐户和集群角色绑定。然后,您可以在 ClusterLogForwarder
资源中引用服务帐户来控制访问权限。
要在 openshift-logging
命名空间以外的额外命名空间中支持多日志转发功能,您必须更新 Red Hat OpenShift Logging Operator 以监视所有命名空间。在新的 Red Hat OpenShift Logging Operator 版本 5.8 版本中默认支持此功能。
10.1.2.2.1. 授权日志收集 RBAC 权限
在日志记录 5.8 及更高版本中,Red Hat OpenShift Logging Operator 提供了 collect-audit-logs
、collect-application-logs
和 collect-infrastructure-logs
集群角色,该角色可让收集器分别收集审计日志、应用程序日志和基础架构日志。
您可以通过将所需的集群角色绑定到服务帐户来授权日志收集的 RBAC 权限。
先决条件
-
Red Hat OpenShift Logging Operator 安装在
openshift-logging
命名空间中。 - 有管理员权限。
流程
- 为收集器创建服务帐户。如果要将日志写入需要令牌进行身份验证的存储,则必须在服务帐户中包含令牌。
将适当的集群角色绑定到服务帐户:
绑定命令示例
$ oc adm policy add-cluster-role-to-user <cluster_role_name> system:serviceaccount:<namespace_name>:<service_account_name>