本页面简要介绍 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 的审核日志无法停用。
系统日志包括来自以下来源的日志:
在命名空间
kube-system
、istio-system
、knative-serving
、gke-system
、config-management-system
中运行的所有 Pod。未容器化的关键服务,包括
docker
/containerd
运行时、kubelet
、kubelet-monitor
、node-problem-detector
、kube-container-runtime-monitor
。节点的串行端口输出(如果虚拟机实例元数据
serial-port-logging-enable
设置为 true)。 从 GKE 1.16-13-gke.400 开始,节点的串行端口输出由 Logging 代理收集。如需停用串行端口输出日志记录功能,请在创建集群期间设置--metadata serial-port-logging-enable=false
。串行端口输出对于排查 GKE 节点崩溃、启动失败、启动问题或关停问题非常有用。停用这些日志可能会使问题排查更加困难。
应用日志包含用户节点上运行的非系统容器生成的所有日志。
(可选)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 中。
从 GKE 版本 1.15.7 开始,您可以将标准集群配置为仅捕获系统日志,不收集应用日志。对于 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 的代理。根据 GKE 控制平面版本,使用 fluentd 或 fluentbit 来收集日志。从 GKE 1.17 开始,使用基于 fluentbit 的代理来收集日志。使用 GKE 1.17 之前版本的 GKE 集群使用基于 fluentd 的代理。如果您希望更改 fluentd
代理的默认行为,则可以运行自定义 fluentd
代理。
常见用例包括:
从日志中移除敏感数据
收集未写入
STDOUT
或STDERR
的其他日志使用与特定性能相关的设置
自定义日志格式
收集 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。
GKE Enterprise 中默认启用的日志
在 Google Cloud 上创建新的 GKE 集群时,默认情况下,工作负载日志对于所有 Autopilot 集群都处于启用状态,但可以停用。我们不建议停用工作负载日志,因为这会影响可支持性。
对于 GKE Enterprise 版项目,如果您在创建集群时注册到舰队,系统会默认启用其他有用的日志。
在下表中,对勾标记 () 表示在启用了 GKE Enterprise 的项目中创建和注册新集群时,系统会默认启用哪些日志:
日志名称 | Autopilot | 标准 |
---|---|---|
系统 | ||
工作负载 | - | |
API 服务器 | ||
调度器 | ||
控制器管理器 |
控制平面日志(API 服务器、调度器和控制器管理器)会产生 Cloud Logging 费用。
价格
GKE 控制平面日志会导出到 Cloud Logging。适用 Cloud Logging 价格。
配额
控制平面日志使用 Cloud Logging API 的“每分钟写入请求数”配额。在启用控制平面日志之前,请检查该配额的最近峰值用量。如果您在同一项目中有多个集群,或者已经达到该配额上限,则可以申请增加配额,然后才能启用控制平面日志。
访问权限控制
如果想要限制组织内部对 Kubernetes 控制平面日志的访问权限,您可以创建单独的日志存储桶并设置更具限制性的访问权限控制。
将日志存储在限访问权限受限的单独日志存储桶中之后,具有项目的 roles/logging.viewer
访问权限的任何人都不会自动获得日志存储桶中的控制平面日志的访问权限。此外,将控制平面日志存储在访问权限受限的单独日志存储桶中之后,如果您出于隐私或安全方面的顾虑而决定删除某些控制平面日志,便可以删除它们,同时不影响其他组件或服务的日志。