本页面简要介绍 Google Kubernetes Engine (GKE) 中提供的日志记录选项。
概览
发送到 Cloud Logging 的 GKE 日志存储在专用的永久性数据存储区中。虽然 GKE 本身可以存储日志,但这些日志不会永久存储。例如,系统会在以下几种情况下移除 GKE 容器日志:当其主机 pod 被移除时;存储日志的磁盘空间不足时;或原有日志被更新的日志替换时。系统会定期移除系统日志,释放空间以供存储新日志。集群事件则会在一小时后删除。
GKE Logging 代理
对于容器和系统日志,默认情况下,GKE 会部署每个节点的日志记录代理,该代理会读取容器日志、添加有用的元数据,然后将它们存储在 Cloud Logging ���。GKE Logging 代理检查以下来源中的容器日志:
容器化进程的标准输出和标准错误日志
kubelet 和容器运行时日志
系统组件日志,例如虚拟机启动脚本
对于事件,GKE 使用 kube-system 命名空间中的 Deployment,它会自动收集事件并将其发送到 Logging。
收集哪些日志
默认情况下,GKE 会从集群中收集多种类型的日志并将其存储在 Cloud Logging 中:
审核日志包括管理员活动日志、数据访问日志和事件日志。如需详细了解 GKE 审核日志,请参阅 GKE 审核日志文档。GKE 的审核日志无法停用。
系统日志(包括可用日志中列出的日志)。
应用日志包含用户节点上运行的非系统容器生成的所有日志。
以下限制可能会导致应用日志无法发送到 Cloud Logging:
- 对于 JSON 日志,不支持重复的 JSON 键。
stream
是 GKE 日志记录流水线中的预留键。应用 JSON 日志中的stream
键可能会导致意外行为和日志被丢弃。- Cloud Logging 对每个 LogEntry 都有大小限制。对于 jsonPayload 日志,任何超出大小限制的 LogEntry 都会被丢弃;对于 textPayload 日志,任何超出大小限制的 LogEntry 都会被截断。
(可选)GKE 可以从某些 Kubernetes 控制平面组件收集其他类型的日志并存储在 Cloud Logging 中:
API 服务器日志包含 Kubernetes API 服务器 (
kube-apiserver
) 生成的所有日志。调度器日志包含 Kubernetes 调度器 (
kube-scheduler
) 生成的所有日志。控制器管理器日志包含 Kubernetes 控制器管理器 (
kube-controller-manager
) 生成的所有日志。
如需详细了解每个控制平面组件,请参阅 GKE 集群架构。
收集日志
创建新的 GKE 集群时,默认情况下会启用与 Cloud Logging 的集成。
系统和应用日志会传送到 Cloud Logging 中的日志路由器。
从那里,日志可以被注入到 Cloud Logging 中、排除或者导出到 BigQuery、Pub/Sub 或 Cloud Storage 中。
您还可以将 Standard 集群配置为仅捕获系统日志,��不收集应用日志。对于 Autopilot 集群和 Standard 集群,排除项过滤条件都可让您减少发送到 Cloud Logging 的日志量。
日志记录吞吐量
启用系统日志记录后,系统会自动部署和管理专用的 Cloud Logging 代理。它在集群中的所有 GKE 节点上运行,以收集日志,添加有关容器、pod 和集群的有用元数据,然后使用基于 fluentbit 的代理将日志发送到 Cloud Logging。
如果任何 GKE 节点需要超出默认日志吞吐量,并且您的 GKE Standard 集群使用控制平面 1.23.13-gke.1000 或更高版本,则您可以配置 GKE 以部署 Logging 代理的替代配置,旨在最大限度地提高日志记录吞吐量。
如需了解详情,请参阅调整日志吞吐量。
使用自定义 fluentd 或 flubit 来收集日志
GKE 的默认日志记录代理提供了一个代管式解决方案,可用于部署和管理将集群日志发送到 Cloud Logging 的代理。使用基于 fluentbit 的代理来收集日志。
收集 GKE 节点的 Linux auditd
日志
您可以在运行 Container-Optimized OS 的 GKE 节点上启用详细的操作系统审核日志。节点上的操作系统日志提供有关集群和工作负载的状态的重要信息,例如错误消息、登录尝试和二进制文件执行情况。您可以使用这些信息排查问题或调查安全突发事件。
如需了解详情,请参阅在 GKE 节点上启用 Linux 审核日志。
GKE 审核日志
如需详细了解适用于 Kubernetes 集群和 GKE 集群操作资源类型的日志条目,请参阅审核日志记录。
Logging 访问权限控制
日志记录访问权限控制涉及两个方面:应用访问权限和用户访问权限。Cloud Logging 提供可用于授予适当访问权限的 Identity and Access Management (IAM) 角色。
应用访问权限
应用需要将日志写入 Cloud Logging 的权限,该权限通过将 IAM 角色 roles/logging.logWriter
分配给关联到底层节点池的服务账号来授予。
用户查看权限
您需要具有 roles/logging.viewer
角色才能查看项目中的日志。如果您需要访问数据访问日志,则需要具有 logging.privateLogViewer
IAM 权限。
如需详细了解权限和角色,请参阅访问权限控制指南。您还可以查看 Cloud Audit Logs 最佳实践,这些最佳实践也适用于常规用途的 Cloud Logging。
用户管理员权限
IAM 角色 roles/logging.configWriter
和 roles/logging.admin
提供管理功能。需要 roles/logging.configWriter
角色才能创建日志记录接收器,日志记录接收器通常用于将日志定向到一个特定或集中的项目。例如,您可能希望结合使用日志记录接收器和日志记录过滤器,将某个命名空间的所有日志定向到一个中心化日志存储桶。
如需了解详情,请参阅 Cloud Logging 的访问权限控制指南。
最佳做法
- 结构化日志记录:与 GKE 集成的 Logging 代理会读取已序列化为单行字符串并写入标准输出或标准错误的 JSON 文档,并且将其以结构化日志条目的形式发送到 Google Cloud Observability。
- 严重性:默认情况下,写入标准输出的日志属于
INFO
级别,写入标准错误的日志属于ERROR
级别。结构化日志可以包含severity
字段,该字段定义日志的严重性。 - 导出到 BigQuery:如需进行其他分析,您可以将日志导出到外部服务,例如 BigQuery 或 Pub/Sub。导出到 BigQuery 的日志会保留其格式和结构。 如需了解详情,请参阅路由和存储概览。
提醒:当 Logging 记录意外行为时,您可以使用基于日志的指标来设置提醒政策。如需查看示例,请参阅创建关于计数器指标的提醒政策。如需详细了解基于日志的指标,请参阅基于日志的指标概览。
错误报告:如需从集群上运行的应用收集错误,您可以使用 Error Reporting。
可用日志
如果您选择将日志发送到 Cloud Logging,则必须发送系统日志,并且可以选择性地发送其他来源的日志。
下表列出了 create 和 update 命令的 --logging
标志支持的值。
日志源 | --logging 值 |
收集的日志 |
---|---|---|
无 | NONE |
未向 Cloud Logging 发送任何日志;集群中未安装任何日志收集代理。Autopilot 集群不支持此值。 |
系统 | SYSTEM |
从以下来源收集日志:
还会收集 Kubernetes 事件。此值对于所有集群类型都是必需的。 |
工作负载 | WORKLOAD |
由用户节点上运行的非系统容器生成的所有日志。 此值默认情况下处于启用状态,但对于所有集群类型都是可选的。 |
API 服务器 | API_SERVER |
由 kube-apiserver 生成的所有日志。 此值对于所有集群类型都是可选的。
|
调度器 | SCHEDULER |
由 kube-scheduler 生成的所有日志。 此值对于所有集群类型都是可选的。
|
控制器管理器 | CONTROLLER_MANAGER |
由 kube-controller-manager 生成的所有日志。 此值对于所有集群类型都是可选的。
|
水平 Pod 自动扩缩器 | KCP_HPA |
导出 GKE 集群中每个 HPA 对象的原子建议和最终建议决策日志。 如需了解详情,请参阅查看 Pod 横向自动扩缩器事件。 |
控制平面网络连接 | KCP_CONNECTION |
仅适用于 GKE control plane authority GKE 控制平面实例的入站网络连接日志。如需了解详情,请参阅验证 Google 与集群控制平面的连接。 |
控制平面 SSH 事件 | KCP_SSHD |
仅适用于 GKE control plane authority 针对 Google 人员在支持请求期间或进行其他管理员访问而连接到集群控制平面实例时发生的所有 SSH 事件(例如公钥接受和会话关闭)生成日志。 如需了解详情,请参阅验证 Google 与集群控制平面的连接。 |
GKE Enterprise 中默认启用的日志
在 Google Cloud上创建新的 GKE 集群时,默认情况下,系统会为所有 Autopilot 集群启用工作负载日志,但可以将其停用。
对于 GKE Enterprise 版项目,如果您在创建集群时注册到舰队,系统会默认启用其他有用的日志。
在下表中,对勾标记 () 表示在启用了 GKE Enterprise 的项目中创建和注册新集群时,系统会默认启用哪些日志:
日志名称 | Autopilot | Standard |
---|---|---|
系统 | ||
工作负载 | ||
API 服务器 | ||
调度器 | ||
控制器管理器 | ||
控制平面网络连接 | ||
控制平面 SSH 事件 |
系统日志和控制平面日志(API 服务器、调度器、控制器管理器)会产生 Cloud Logging 费用。
价格
GKE 日志会导出到 Cloud Logging。 适用 Cloud Logging 价格。
将日志导出到其他 Google Cloud 服务(例如 BigQuery)时,您需要支付产生的存储费用。如需查看与 Cloud Logging 关联的费用,请参阅价格。
配额
控制平面日志使用 Cloud Logging API 的“每分钟写入请求数”配额。在启用控制平面日志之前,请检查该配额的最近峰值用量。如果您在同一项目中有多个集群,或者已经达到该配额上限,则可以申请增加配额,然后才能启用控制平面日志。
访问权限控制
如果想要限制组织内部对 Kubernetes 控制平面日志的访问权限,您可以创建单独的日志存储桶并设置更具限制性的访问权限控制。
将日志存储在限访问权限受限的单独日志存储桶中之后,具有项目的 roles/logging.viewer
访问权限的任何人都不会自动获得日志存储桶中的控制平面日志的访问权限。此外,将控制平面日志存储在访问权限受限的单独日志存储桶中之后,如果您出于隐私或安全方面的顾虑而决定删除某些控制平面日志,便可以删除它们,同时不影响其他组件或服务的日志。