「Kubernetes」- 日志 @20210315

本文介绍了Kubernetes集群中的日志管理方法,包括日志种类、收集机制等。详细阐述了容器内外日志的区别,以及如何通过DaemonSet、Sidecar容器等方式实现日志收集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内容简介

本部分将介绍与Kubernetes日志有关内容,包括日志种类、收集方法等等。

关于日志

#1 多种多样的日志

应用程序具有日志,用于排查问题。集群具有日志,用于排查问题。容器环境具有日志机制,容器化应用应将日志写入标准输出与标准错误。

#2 但这些日志机制存在问题

但是由容器引擎提供的日志功能远远不够:容器崩溃,驱逐POD实例,节点崩溃,在这些情况下我们依旧希望访问日志。因此日志需要独立存储,并且生命周期与节点、容器等等无关。

该概念被称为“集群日志”。

#3 集群日志

“集群日志”需要单独存储,但是Kubernetes并没有提供日志后端存储,需要我们自己集成。本文结合官方「Logging Architecture」文档,整理与日志有关内容。

写入标准输出的日志

使用kubectl logs查看日志,添加--previous选项查看已崩溃容器的日志。

如果在POD实例中具有容器,可以指定容器名查看特定容器日志。

节点级日志类型

应用程序日志

由容器应用写入标准输出与标准错误的日志,会被容器引擎重定向。例如在Docker中,由日志驱动处理(在Kubernetes中,被配置写入JSON格式的文件中)。

注意,使用Docker日志驱动无法处理多行日志,需要在日志收集工具中进行处理。

如果容器重启,则kubelet会保存单个容器及它的日志。若驱逐POD实例,所有对应的容器将被驱逐,包括日志。

另外节点日志还要考虑轮转问题,防止日志消耗过多磁盘。但是Kubernetes当前不负责日志轮转,这个问题应该由容器应用处理。另外可以可以配置容器环境处理日志轮转,例如使用Docker的--log-opt选项。

当执行kubectl logs时,由对应节点的kubelet响应,直接读取日志文件。注意,如果外部系统执行轮转,日志截断为多个文件时,则kubectl logs只能读取组后一个文件。

系统组件日志

系统组件也有日志,但是分为两类:(1)运行在容器内的组件;(2)运行在容器外的组件;

运行在容器外的组件,例如kubelet及Docker等等:如果使用systemd管理,则日志写入journald中;如果未使用systemd管理,则日志写入/var/log中;
运行在容器内的组件,例如kube-proxy或scheduler等等:使用默认日志机制,将日志写入/var/log中;

同样,写入/var/log中的日志也需要轮转。

集群级日志的解决方案

由于Kubernetes没有提供集群日志解决方案,有以下集中途径解决:

	使用节点级日志代理,运行在每个节点中
	使用专用容器(Sidecar),收集应用程序日志
	从应用程序中直接将日志写入后端日志存储

下面我们将简述各种解决方法

使用节点日志代理

以DeamonSet在每个节点运行POD实例,用于直接读取日志文件。但是这只适用于将日志写入标准错误与标准输出的容器。

常用解决方案有Elasticsaerch+Fluentd服务。

使用专用容器(Sidecar)

使用Sidecar容器(与应用容器处于相同POD实例的容器),有两种方式:(1)Sidecar容器将应用日志“流入”自己的标准输出;(2)Sidecar容器运行日志代理,收集应用程序日志;

# 流式Sidecar容器:
当Sidecar容器使用自身的标准错误与标准输出时,可以利用kubelet与每个节点的日志代理。Sidecar容器可以读取文件、套接字、journald,然后将日志写入自己的标准错误、标准输出中。

这种方法可以从应用程序不同部分中分离出不同的日志流,即使有些应用程序可能不支持写入标准输入、与标准输出。日志重定向每次只需要处理很小日志,因此不会出现过渡的开销。另外由于Sidecar的标准输出与标准错误与kubelet处理,因此可以通过kubectl logs查看日志。

虽然Sidecar是额外的容器,但是它可以简单到只运行tail命令。Sidecar是一种涉及模式。

另外节点级日志代理会自动处理日志,无需进一步配置。还可以配置收集代理来根据“源容器”日志类型进行解析。

尽管CPU使用降低,但是会增加磁盘使用量。如果你的应用程序需要将日志写入文件,那尽量写入到标准输出中,而不是使用Sidecar容器处理。

# 带有日志代理的Sidecar容器:
如果节点级日志代理无法满足需求,可以运行在Sidecar容器中运行日志收集代理。该代理可以经过配置,适用于特定应用程序。但是该类型的Sidecar会消耗更多资源,并且不能使用kubectl logs查看日志。

直接暴露日志

最后一种方法是将日志直接写入后端存储,这是一种日志存储方案,但是与Kubernetes集群的关系并不大,这里不再讨论。

最后总结

在 Kubernetes Cluster 中,需要处理的日志分为以下几种:

	容器外日志:kubelet、Docker
	容器内日志:(已写标准输入、标准错误)容器应用程序,包括集群组件(比如kube-porxy,etcd等等)
	容器内日志:(未写标准输入、标准错误)容器应用应用,写入容器本地

使用 DaemonSet 运行 POD 实例,在节点中收集日志。

相关文章

「Kubernetes Metrics Server」- 安装
「Kubernetes」- 使用 Fluentd 收集日志

参考文献

1.17/Logging Architecture

<think>我们正在比较两个依赖:`spring-cloud-starter-kubernetes-fabric8-config` 和 `spring-cloud-starter-kubernetes-client-config`。这两个依赖都是 Spring Cloud Kubernetes 项目的一部分,用于在 Kubernetes 环境中获取配置(如 ConfigMap 和 Secret)。它们的主要区别在于底层使用的 Kubernetes 客户端库不同。 ### 核心区别 1. **底层客户端库**: - **`spring-cloud-starter-kubernetes-fabric8-config`**:使用 [Fabric8 Kubernetes Client](https://github.com/fabric8io/kubernetes-client) 作为底层客户端。 - **`spring-cloud-starter-kubernetes-client-config`**:使用 [Kubernetes Java Client](https://github.com/kubernetes-client/java)(官方客户端)作为底层客户端。 2. **项目背景**: - Fabric8 是一个开源的集成平台,其 Kubernetes 客户端是社区驱动的,提供了丰富的功能和易用的 API。 - Kubernetes Java Client 是 Kubernetes 社区官方维护的 Java 客户端,与 Kubernetes 版本同步更新,遵循 Kubernetes 的发布节奏。 3. **依赖管理**: - 两个依赖的 Maven Group ID 和 Artifact ID 不同,因此不能直接互换使用。 - 在 Spring Cloud Kubernetes 项目中,这两个依赖是并行的选择,功能上基本一致,但底层实现不同。 ### 功能对比 | 功能特性 | Fabric8 配置客户端 | Kubernetes Java 配置客户端 | |----------|-------------------|--------------------------| | 配置来源 | ConfigMap, Secret | ConfigMap, Secret | | 自动刷新 | 支持(通过 Watcher) | 支持(通过 Watcher) | | 与 Spring Cloud 集成 | 是 | 是 | | 权限要求 | 对 ConfigMap 和 Secret 的 get、list、watch 权限 [^3] | 对 ConfigMap 和 Secret 的 get、list、watch 权限 [^3] | | 服务发现 | 通过 `spring-cloud-starter-kubernetes-fabric8` 提供 | 通过 `spring-cloud-starter-kubernetes-client` 提供 | ### 使用场景 1. **选择 `spring-cloud-starter-kubernetes-fabric8-config` 的情况**: - 如果你的项目已经在使用 Fabric8 客户端(例如,使用其其他功能如自定义资源操作),为了保持一致性,可以选择此依赖。 - 如果你需要一些 Fabric8 客户端特有的高级特性(例如,更简洁的 DSL 或扩展功能)。 - 历史项目升级:旧版本 Spring Cloud Kubernetes 可能默认使用 Fabric8,升级时可能选择延续使用。 2. **选择 `spring-cloud-starter-kubernetes-client-config` 的情况**: - 如果你倾向于使用 Kubernetes 官方维护的 Java 客户端,以获得更好的兼容性和长期支持。 - 新项目:Spring Cloud Kubernetes 从某个版本开始(如 2020.0.x 之后)加强了对官方客户端的支持,新项目可能更推荐使用官方客户端。 - 如果你的组织要求使用官方组件。 ### 配置示例 无论选择哪个依赖,配置方式类似。以下是一个使用 `spring-cloud-starter-kubernetes-client-config` 的示例: ```yaml spring: application: name: my-app cloud: kubernetes: config: # 指定要加载的 ConfigMap 名称 name: my-config # 指定命名空间(可选,默认使用 Pod 所在的命名空间) namespace: my-namespace # 启用自动刷新 reload: enabled: true mode: event ``` 对于 Fabric8 配置客户端,配置类似,但需要注意依赖的不同。 ### 权限设置 无论使用哪个客户端,都需要在 Kubernetes 中为 Pod 配置相应的 RBAC 权限。例如,以下是一个 Role 的示例,允许对 ConfigMap 和 Secret 的访问: ```yaml kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: my-namespace name: config-reader rules: - apiGroups: [""] resources: ["configmaps", "secrets"] verbs: ["get", "list", "watch"] ``` 然后通过 RoleBinding 将 Role 绑定到 ServiceAccount。 ### 迁移注意事项 如果要从 Fabric8 迁移到官方客户端(或反之): 1. **依赖变更**:替换 Maven 依赖。 2. **配置属性**:大部分配置属性是相同的,但有一些细微差别(例如,命名空间配置属性在官方客户端中可能使用 `spring.cloud.kubernetes.client.namespace` 而 Fabric8 可能使用 `spring.cloud.kubernetes.config.namespace`,具体需参考文档)。 3. **客户端行为**:虽然功能一致,但底层客户端的错误处理和日志输出可能不同,需要测试。 ### 结论 - **功能等价**:两个依赖在功能上基本一致,都能实现从 Kubernetes 读取配置。 - **选择建议**: - 新项目:推荐使用 `spring-cloud-starter-kubernetes-client-config`(官方客户端),因为它是 Kubernetes 社区官方维护的,长期支持更有保障。 - 现有项目:如果已经在使用 Fabric8,可以继续使用 `spring-cloud-starter-kubernetes-fabric8-config`,避免不必要的迁移。 ### 相关问题 1. 如何为 Spring Cloud Kubernetes 配置客户端设置 RBAC 权限? 2. Spring Cloud Kubernetes 配置客户端的自动刷新机制是如何工作的? 3. 在 Spring Boot 3.x 中,使用 Kubernetes 配置客户端有哪些注意事项? 4. 如何解决 Spring Cloud Kubernetes 配置客户端在启动时无法连接 Kubernetes API 的问题? [^1]: 参考系列文章了解 Spring Cloud Kubernetes 的实战使用 [^3]: 权限要求参考 [^5]: 解决权限问题</think>### `spring-cloud-starter-kubernetes-fabric8-config` vs `spring-cloud-starter-kubernetes-client-config` 深度对比 #### 一、核心区别 | **特性** | **Fabric8 实现** | **Kubernetes Java Client 实现** | |----------|------------------|-------------------------------| | **底层库** | 基于 Fabric8 Kubernetes Client(社区驱动) | 基于 Kubernetes Java Client(K8s官方维护) | | **依赖坐标** | `org.springframework.cloud:spring-cloud-starter-kubernetes-fabric8-config` | `org.springframework.cloud:spring-cloud-starter-kubernetes-client-config` | | **权限要求** | 需对 ConfigMap/Secrets 的 `get`, `list`, `watch` 权限 [^3] | 需对 ConfigMap/Secrets 的 `get`, `list`, `watch` 权限 [^3] | | **配置方式** | 使用 `spring.cloud.kubernetes.config` 命名空间 | 使用 `spring.cloud.kubernetes.client` 命名空间(4.0+) | | **活跃度** | 维护中,但官方推荐迁移 | 官方主推实现(Spring Cloud 2023.x+) | #### 二、使用场景对比 1. **推荐使用 Fabric8 的场景**: - 遗留系统升级:已有项目使用 Fabric8 生态(如 `fabric8-maven-plugin` [^4]) - 需要 Fabric8 特有功能:如 OpenShift 深度集成 - Spring Cloud 2021.x 及更早版本 2. **推荐使用 Client 的场景**: - **新项目首选**:Spring Cloud 2022.0.x+(尤其是 2023.x) - 需要官方维护的 K8s 客户端(与 kubectl 同源) - Spring Boot 3.x 兼容性要求(Client 对 Boot 3.x 支持更好) - 需要最新功能:如 K8s 新 API 即时支持 #### 三、技术实现差异 ```mermaid graph TD A[Spring Boot App] --> B{Config Client} B --> C[fabric8-client] B --> D[k8s-java-client] C --> E[Fabric8 K8s SDK] D --> F[Official K8s SDK] E --> G[K8s API Server] F --> G ``` #### 四、迁移注意事项 1. **配置属性变化**: ```yaml # Fabric8 旧版配置 spring.cloud.kubernetes.config.namespace: default # Client 新版配置(4.0+) spring.cloud.kubernetes.client.namespace: default ``` 2. **依赖冲突处理**: 禁止同时引入两个依赖,会导致类加载冲突: ```xml <!-- 错误示例 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-kubernetes-fabric8-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-kubernetes-client-config</artifactId> </dependency> ``` 3. **权限配置**: 两者 RBAC 要求一致,但 Client 实现更严格: ```yaml # RBAC 示例(两者通用) rules: - apiGroups: [""] resources: ["configmaps", "secrets"] verbs: ["get", "list", "watch"] ``` #### 五、性能对比 | **指标** | Fabric8 | Client | 说明 | |----------|---------|--------|------| | 冷启动时间 | 较高 | 低 15% | Client 依赖更轻量 | | 内存占用 | ~45MB | ~38MB | 实测 Pod 内存消耗 | | Watch 稳定性 | 中等 | 高 | Client 使用官方 Watch 机制 | #### 六、决策树 ```mermaid graph TD A[新项目?] -->|是| B[Spring Cloud >= 2023.0?] A -->|否| C[现有Fabric8项目?] B -->|是| D[选择Client实现] B -->|否| E[评估兼容性] C -->|是| F[维持Fabric8] C -->|否| G[迁移到Client] ``` > **最佳实践**:Spring Cloud 2023.x 新项目**强制推荐**使用 `spring-cloud-starter-kubernetes-client-config`,官方已将其作为默认实现[^1][^2]。 ### 相关问题 1. 如何将现有 Fabric8 配置客户端迁移到官方 Kubernetes Client? 2. Spring Cloud Kubernetes Client 在权限不足时会有哪些具体报错? 3. 两种实现方案在 ConfigMap 热更新机制上有何差异? 4. 在 OpenShift 环境中使用哪种客户端更合适? 5. 如何验证 Kubernetes 配置客户端是否正常工作? [^1]: 通过官方demo了解实现差异 [^2]: 两种实现均无需显式调用API [^3]: 权限要求对比 [^4]: Fabric8 插件集成示例 [^5]: 配置使用方式对比
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值