Kubernetes控制平面组件:Kubelet详解(二):核心功能层
云原生学习路线导航页(持续更新中)
- kubernetes学习系列快捷链接
- Kubernetes架构原则和对象设计(一)
- Kubernetes架构原则和对象设计(二)
- Kubernetes架构原则和对象设计(三)
- Kubernetes控制平面组件:etcd(一)
- Kubernetes控制平面组件:etcd(二)
- Kubernetes控制平面组件:API Server详解(一)
- Kubernetes控制平面组件:API Server详解(二)
- Kubernetes控制平面组件:调度器Scheduler(一)
- Kubernetes控制平面组件:调度器Scheduler(二)
- Kubernetes控制平面组件:Controller Manager详解
- Kubernetes控制平面组件:Controller Manager 之 内置Controller详解
- Kubernetes控制平面组件:Controller Manager 之 NamespaceController 全方位讲解
- Kubernetes控制平面组件:Kubelet详解(一):API接口层介绍
本文是 kubernetes 的控制面组件 kubelet 系列文章第二篇,主要讲解了 kubelet 架构中的核心功能层,包括核心管理模块的 PLEG、cAdvisor、GPUManager、OOMWatcher、ProbeManager、DiskSpaceManager、EvictionManager;运行时协调模块的 syncLoop、PodWorker,以及容器生命周期管理模块的 StatusManager、VolumeManager、ImageGC、ContainerGC、ImageManager、CertificateManager,对每个组件都做了详细讲解
- 希望大家多多 点赞 关注 评论 收藏,作者会更有动力继续编写技术文章
- 在 Kubernetes控制平面组件:Kubelet详解(一):API接口层介绍 中,我们对 kubelet 做了简要介绍,给出了kubelet架构,并对API接口层做了介绍,本文将对 kubelet 的 核心功能层 做详细讲解
- API 接口层
- kubelet API
- cAdvisor API
- 只读API
- 健康检查 API
- 核心功能层,可分为3个模块:
- 核心管理模块:PLEG、cAdvisor、GPUManager、OOMWatcher、ProbeManager、DiskSpaceManager、EvictionManager
- 运行时协调模块:syncLoop、PodWorker
- 容器生命周期管理模块:StatusManager、VolumeManager、ImageGC、ContainerGC、ImageManager、CertificateManager
- CRI 接口层
- 容器执行引擎接口,作为grpc client 与真正的容器运行时(Dockershim/rkt/containerd)交互
1.核心管理模块
1.1.PLEG(Pod Lifecycle Event Generator,Pod 生命周期事件生成器)
1.1.1.PLEG 是什么?
- PLEG(Pod Lifecycle Event Generator)是 kubelet 的核心子模块,负责监控节点上容器的状态变化,并将这些变化转换为 Pod 生命周期事件(如
ContainerStarted
、ContainerDied
等),驱动 Pod 状态同步和更新。 - PLEG(Pod Lifecycle Event Generator)生成的事件完全来源于节点本地的容器运行时(如 containerd、CRI-O 等)的状态变化
- PLEG设计目标
- 替代旧版 kubelet 的 同步轮询机制,提升容器状态检测效率。
- 通过 事件驱动模型 减少资源消耗,加快 Pod 状态更新。
1.1.2.PLEG 的核心功能
-
容器状态监控
- 定期通过 容器运行时接口(CRI) 查询节点上所有容器的状态(如
Running
、Exited
、Unknown
) - 检测容器状态变化(如崩溃、重启、OOMKilled)
- 定期通过 容器运行时接口(CRI) 查询节点上所有容器的状态(如
-
事件生成
- 将容器状态变化转换为 Pod 生命周期事件,例如:
ContainerStarted
:容器启动。ContainerDied
:容器终止。ContainerChanged
:容器配置变更(如资源限制更新)。
- 将容器状态变化转换为 Pod 生命周期事件,例如:
-
状态同步
- 将事件传递给 kubelet 的 状态管理器(Status Manager),触发 Pod 状态的更新。
- 确保 API Server 中 Pod 状态与节点实际状态一致。
1.1.3.PLEG 的实现原理
- 定期 Relist 操作:
- PLEG 通过一个定时器(默认间隔 1秒)触发
relist
过程。 - 调用 CRI(如 containerd、Docker)的
ListPodSandboxes
和ListContainers
接口,获取所有 Pod 和容器的当前状态。
- PLEG 通过一个定时器(默认间隔 1秒)触发
- 状态对比:
- 将当前容器状态与上一次
relist
的结果进行对比,识别状态变化。
- 将当前容器状态与上一次
- 事件生成:
- 根据状态差异生成事件(如容器从
Running
变为Exited
生成ContainerDied
)。
- 根据状态差异生成事件(如容器从
- 事件分发:
- 将事件写入 kubelet 的 事件通道(EventChannel),由状态管理器处理。
1.1.4.PLEG 的性能影响
-
性能瓶颈
- 容器数量:节点上运行的 Pod/容器越多,
relist
耗时越长。 - 运行时性能:容器运行时响应
ListPodSandboxes
和ListContainers
的速度影响 PLEG 效率。
- 容器数量:节点上运行的 Pod/容器越多,
-
网络延迟:
- 如果容器运行时通过远程服务(如 Docker Daemon)访问,可能引入延迟。
-
监控指标
kubelet_pleg_relist_interval_seconds
:记录每次relist
的耗时。kubelet_pleg_relist_latency_microseconds
:历史分位数统计。kubelet_pleg_last_seen_seconds
:容器状态最后一次被记录的时间戳。
1.1.5.PLEG 的健康检查
- PLEG Health Check
- kubelet 会监控 PLEG 的
relist
是否按时完成。 - 若
relist
耗时超过 3分钟(默认阈值),kubelet 会报告 PLEG is not healthy 事件,并标记节点为NotReady
。
- kubelet 会监控 PLEG 的
- 常见故障原因
- 容器运行时无响应:Docker/containerd 卡死或负载过高。
- 节点资源耗尽:CPU、内存或文件描述符不足。
- 内核问题:如磁盘 I/O 卡顿、内核死锁。
1.2.cAdvisor(资源监控代理)
1.2.1.cAdvisor 是什么?
- cAdvisor(Container Advisor)是一个开源的 容器资源监控与性能分析工具,由 Google 开发并集成到 Kubernetes 的 kubelet 中。
- 它专注于实时收集、聚合和暴露容器级别的资源使用数据,帮助用户了解容器化应用的行为和性能瓶颈。
- cAdvisor核心定位
- 轻量级:作为 kubelet 的嵌入式模块,无额外依赖。
- 全容器支持:兼容 Docker、containerd、CRI-O 等主流容器运行时。
- 实时性:提供秒级粒度的监控数据。
1.2.2.cAdvisor 的核心功能
-
资源监控
- 基础资源:
- CPU 使用率(用户态、内核态)
- 内存使用量(RSS、缓存、Swap)
- 磁盘 I/O(读写速率、吞吐量)
- 网络流量(接收/发送字节数、丢包率)
- 容器层级:
- 每个容器的资源消耗。
- Pod 级别的聚合指标(通过 Kubernetes 标签关联)。
- 基础资源:
-
数据暴露
- Prometheus 格式:通过 HTTP 端点
/metrics/cadvisor
提供标准的 Prometheus 指标。 - REST API:提供 JSON 格式的容器详情(如
/api/v1.3/containers
)。
- Prometheus 格式:通过 HTTP 端点
-
多运行时支持
- 通过 容器运行时接口(CRI) 兼容 Docker、containerd、CRI-O 等。
- 支持 非容器化进程 的监控(通过 cgroups 追踪)。
1.2.3.cAdvisor 的实现原理
1.2.3.1.cAdvisor数据采集机制
- cgroups 文件系统解析:
- cAdvisor 通过读取 Linux 内核的 cgroups(控制组) 文件系统(如
/sys/fs/cgroup
)获取资源使用数据。 - 例如:CPU 使用时间从
cpuacct.stat
读取,内存使用从memory.usage_in_bytes
读取。
- cAdvisor 通过读取 Linux 内核的 cgroups(控制组) 文件系统(如
- 容器运行时交互:
- 调用容器运行时的 API(如 Docker Engine 的
/containers/json
)获取容器元数据(ID、名称、标签)。
- 调用容器运行时的 API(如 Docker Engine 的
- 事件监听:
- 通过 inotify 监听容器状态变化(如创建、销毁)以触发数据更新。
1.2.3.2.cAdvisor架构设计
cAdvisor 的架构分为以下核心模块
- Manager:
- 管理所有容器的监控周期。
- 维护容器树结构(容器 -> Pod -> 节点)。
- Storage Driver:
- 存储历史监控数据(默认使用内存存储,可扩展为 BigQuery、InfluxDB 等)。
- Metrics Collector:
- 负责从 cgroups、procfs、sysfs 等收集原始数据。
- Event Handler:
- 处理容器生命周期事件(如启动、停止)。
1.2.3.3.cAdvisor集成到 kubelet
- 内置模块:kubelet 启动时自动初始化 cAdvisor,无需独立部署。
- 数据暴露路径:
- 旧版本(Kubernetes <1.12):通过独立端口 4194 暴露数据。
- 新版本(Kubernetes ≥1.12):通过 kubelet 主端口 10250 的
/metrics/cadvisor
端点暴露。
1.2.4.cAdvisor 的数据采集细节
- 指标类型
指标类别 | 示例指标名 | 说明 |
---|---|---|
CPU | container_cpu_usage_seconds_total | 容器累计 CPU 使用时间(秒) |
内存 | container_memory_working_set_bytes | 容器工作集内存(常驻内存) |
磁盘 I/O | container_fs_reads_bytes_total | 容器累计读取字节数 |
网络 | container_network_receive_bytes_total | 容器累计接收的网络字节数 |
进程 | container_processes | 容器内运行的进程数 |
1.3.GPUManager(GPU设备管理)
1.3.1.GPUManager 是什么?
- GPUManager 是 kubelet 中用于管理和调度 GPU(Graphics Processing Unit)资源 的核心模块,属于 Kubernetes 设备插件框架(Device Plugin Framework) 的一部分。
- 它通过集成设备插件(如 NVIDIA GPU 插件),将 GPU 资源抽象为 Kubernetes 可识别的资源类型,实现 GPU 的自动化发现、分配和调度
1.3.2.GPUManager 的核心功能
- GPU 资源发现与上报
- 设备注册:GPUManager 通过设备插件(如
nvidia-device-plugin
)与 kubelet 通信,注册节点上的 GPU 设备信息(如 GPU 数量、型号等)。 - 资源上报:将 GPU 资源信息(如
nvidia.com/gpu: 4
)上报至 Kubernetes API Server,供调度器使用。
- 设备注册:GPUManager 通过设备插件(如
- GPU 资源分配与调度
- 资源分配:当 Pod 请求 GPU 资源时,GPUManager 通过
Allocate
接口分配具体 GPU 设备,并生成容器启动所需的配置(如环境变量、设备挂载路径)。 - 调度协调:与 Kubernetes 调度器协同,确保 Pod 被调度到具有足够 GPU 资源的节点。
- 资源分配:当 Pod 请求 GPU 资源时,GPUManager 通过
- 容器运行时协作
- 驱动与库注入:通过
nvidia-container-runtime
或CDI(Container Device Interface)
,将 GPU 驱动和 CUDA 库注入容器,确保容器内应用可访问 GPU。 - 设备隔离:支持多租户场景下的 GPU 隔离(如 MIG 技术)。
- 驱动与库注入:通过
1.4.OOMWatcher(内存溢出监控)
1.4.1.OOMWatcher 基本功能
- OOMWatcher(通常指 OSWatcher,Oracle 官方工具)是一种用于实时监控操作系统资源使用情况的开源工具,核心功能在于通过采集关键指标帮助用户诊断内存溢出(OOM)等性能问题。
- Kubelet 通过与 OOMWatcher 模块的深度集成,实现了对系统内存溢出(Out-Of-Memory, OOM)事件的实时监控与响应,保障节点及容器的稳定性。
1.4.2.Kubelet 对 OOMWatcher 的集成机制
- 集成架构与协作组件
- 数据源依赖:
- OOMWatcher 依赖 cAdvisor(集成于 Kubelet 中)提供容器和节点的资源监控数据。cAdvisor 通过内核接口(如
cgroups
)实时采集内存使用情况,并在检测到 OOM 事件时推送信号至 OOMWatcher。
- OOMWatcher 依赖 cAdvisor(集成于 Kubelet 中)提供容器和节点的资源监控数据。cAdvisor 通过内核接口(如
- 事件通道机制:
- OOMWatcher 通过 Watch 机制 监听 cAdvisor 的 OOM 事件流,并生成
PodLifecycleEvent
事件,通过eventChannel
发送至 Kubelet 的syncLoop
主控制循环。
- OOMWatcher 通过 Watch 机制 监听 cAdvisor 的 OOM 事件流,并生成
- 数据源依赖:
- OOM 事件处理流程
- 事件检测:
- 系统级 OOM:当节点全局内存耗尽触发内核 OOM-Killer 时,cAdvisor 捕获
/var/log/messages
中的 OOM-Kill 日志,并通知 OOMWatcher。 - 容器级 OOM:若容器因内存超限被终止(如
State.OOMKilled
状态),cAdvisor 通过容器运行时接口(CRI)获取状态变更并触发事件。
- 系统级 OOM:当节点全局内存耗尽触发内核 OOM-Killer 时,cAdvisor 捕获
- 事件传递:
- OOMWatcher 将事件封装为 Kubernetes 标准事件(
Event
对象),通过StatusManager
上报至 API Server,同时触发syncLoop
同步状态。
- OOMWatcher 将事件封装为 Kubernetes 标准事件(
- 响应处理:
- 容器重启:若 Pod 配置了重启策略(如
Always
),Kubelet 调用容器运行时重启容器。 - 资源回收:驱逐低优先级 Pod(通过
EvictionManager
),释放节点内存资源。 - 日志记录:在 Pod 事件中记录 OOM 详情,便于运维排查。
- 容器重启:若 Pod 配置了重启策略(如
- 事件检测:
1.4.3.配置与调优
- 通过 Kubelet 的
--eviction-hard
设置内存驱逐阈值(如memory.available<1Gi
),提前触发资源回收。 - 调整
--container-runtime
和--runtime-request-timeout
优化容器响应速度。 - 安全策略:关闭匿名访问(
--anonymous-auth=false
),防止未授权用户通过 Kubelet API 获取敏感 OOM 事件信息。默认true
1.5.DiskSpaceManager(存储资源管理)
1.5.1.DiskSpaceManager 是什么
- DiskSpaceManager 是 Kubernetes kubelet 的核心子系统之一,主要负责 节点磁盘空间管理,通过预设阈值防止节点因磁盘资源耗尽导致服务异常。
- 其核心功能是监控关键文件系统(如 Docker 镜像存储路径和根文件系统),当可用空间低于阈值时触发保护机制,拒绝新 Pod 的创建。
1.5.2.DiskSpaceManager 核心功能
- 磁盘空间阈值保护
- 当节点上 Docker 镜像存储路径或根文件系统的可用空间低于预设阈值时,DiskSpaceManager 会阻止新 Pod 的创建,避免因磁盘耗尽引发系统崩溃。
- 动态资源监控
- 通过集成 cAdvisor 实时采集磁盘使用数据,结合缓存机制优化性能,避免频繁的磁盘检查操作。
- 与驱逐机制协同
- 当磁盘空间持续不足时,与 EvictionManager 协作,触发 Pod 驱逐策略以释放资源。
1.6.EvictionManager(资源驱逐决策)
1.6.1.EvictionManager 是什么?
- EvictionManager 是 Kubernetes kubelet 的核心组件之一,负责在 节点资源不足时主动驱逐 Pod 以保障节点稳定性。
- 它通过预设的资源阈值(如内存、磁盘空间等)监控节点状态,当资源压力达到临界点时,按优先级策略终止部分 Pod 以释放资源。
- 与 Linux OOM Killer 的被动响应不同,EvictionManager 是 主动预防机制,避免了资源耗尽导致的节点崩溃。
1.6.2.EvictionManager核心功能
- (1)资源监控与阈值触发
- 监控关键资源指标(Eviction Signals),包括:
memory.available
(可用内存)nodefs.available
(根文件系统可用空间)imagefs.available
(容器运行时存储镜像的磁盘空间)pid.available
(可用进程数)
- 通过 cAdvisor 实时采集资源使用数据,结合 硬驱逐阈值(Hard Eviction) 和 软驱逐阈值(Soft Eviction) 触发驱逐动作。
- 监控关键资源指标(Eviction Signals),包括:
- (2)Pod 驱逐策略
- 优先级排序:根据 Pod 的 QoS 类别(BestEffort > Burstable > Guaranteed)和资源使用量(超过请求值的 Pod 优先)选择驱逐目标。
- 优雅终止:为被驱逐的 Pod 设置终止宽限期(Grace Period),避免服务中断。
- (3)节点状态同步
- 将资源压力状态映射到节点条件(Node Conditions),如
MemoryPressure
或DiskPressure
,并通过 kube-apiserver 同步至集群调度器,阻止新 Pod 调度到问题节点。
- 将资源压力状态映射到节点条件(Node Conditions),如
1.6.3.EvictionManager实现原理
- 驱逐流程
- 触发条件:
- 硬驱逐:资源使用达到阈值后立即终止 Pod,无宽限期。
- 软驱逐:达到阈值后等待
eviction-soft-grace-period
(默认 1m30s),再终止 Pod。
- 资源回收
- 每次驱逐需保证至少释放
--eviction-minimum-reclaim
指定的资源量(如 500Mi 内存),避免频繁触发驱逐。
- 每次驱逐需保证至少释放
- 触发条件:
- 策略执行细节
- QoS 优先级:优先驱逐 BestEffort Pod,其次为超出资源请求值的 Burstable Pod,最后是 Guaranteed Pod。
- 防止状态震荡:通过
eviction-pressure-transition-period
(默认 5m)延迟节点压力状态的解除,避免调度器频繁调整。
1.6.4.与其他组件的协作
- 与 cAdvisor 联动
- 依赖 cAdvisor 提供容器和节点的资源使用指标,如文件系统挂载点检测、内存工作集计算。
- 与 VolumeManager 协同
- 驱逐时卸载相关存储卷,释放
nodefs
空间。
- 驱逐时卸载相关存储卷,释放
- 与 Scheduler 交互
- 通过
MemoryPressure
或DiskPressure
状态阻止新 Pod 调度,例如:MemoryPressure
时拒绝 BestEffort PodDiskPressure
时拒绝所有 Pod
- 通过
1.6.5.配置与调优建议
- 关键参数
--eviction-hard
:硬驱逐阈值(需谨慎设置,避免过度驱逐)。--eviction-soft-grace-period
:软驱逐宽限期(平衡服务可用性与资源压力)。--eviction-max-pod-grace-period
:Pod 终止最大宽限期(覆盖 Pod 自身配置)。
- 监控与调试
- 通过
kubectl describe node
查看节点压力事件。 - 启用 kubelet 调试日志(
--v=4
)观察驱逐决策过程。
- 通过
2.kubelet 运行时协调层
2.1.syncLoop(状态同步核心循环)
2.1.1.syncLoop 是什么?
syncLoop
是 kubelet 的核心事件驱动循环,负责 监听多种事件源 并协调 Pod 的实际状态与期望状态一致。- 它是 kubelet 实现 Pod 生命周期管理(如创建、更新、删除)的中枢逻辑,通过持续监听事件并触发同步操作,确保节点上的 Pod 始终符合 API Server 中声明的期望状态。
2.1.2.syncLoop 的核心功能
- 事件聚合与分发
- 监听多种事件源(如 API Server 的配置变更、容器状态变化、定时任务等)。
- 统一调度处理逻辑,将事件分发给对应的处理模块(如
PodWorker
、StatusManager
)。
- 状态同步
- 根据事件触发 Pod 的创建、更新、删除操作。
- 确保容器运行时(如 containerd)中的容器状态与 Kubernetes API 中记录的 Pod 状态一致。
- 容错与重试
- 处理同步失败的情况(如容器启动失败),触发自动重试或错误上报。
- 资源清理
- 定期清理孤儿 Pod、残留的卷和网络资源。
2.1.3.syncLoop 的实现原理
2.1.3.1.事件驱动架构
syncLoop
通过 多路复用(Multiplexing) 监听多个事件通道,使用select
语句等待任意一个通道的事件到达,然后分发给对应的处理逻辑。- 其核心代码结构如下(简化版):
func (kl *Kubelet) syncLoop() {for {if !kl.syncLoopIteration(...) {break}}
}func (kl *Kubelet) syncLoopIteration(...) bool {select {case <-configCh: // 处理配置变更(如 Pod 的增删改)case <-plegCh: // 处理容器状态变化事件case <-syncCh: // 定时强制同步case <-housekeepingCh: // 定期清理资源case update := <-kl.livenessManager.Updates():case update := <-kl.readinessManager.Updates():case update := <-kl.startupManager.Updates():case update := <-kl.containerManager.Updates():}return true
}
2.1.3.2.事件来源与处理逻辑
事件来源 | 触发条件 | 处理逻辑 |
---|---|---|
configCh | API Server 或静态 Pod 的配置变更 | 处理pod的增删改查、重新调谐 |
plegCh | PLEG 检测到容器状态变化(如崩溃、重启) | 定期 relist 环境中所有pod,对比变化后调用 HandlePodSyncs 重新同步受影响的 Pod,还负责清理终止的容器。 |
syncCh | 定时器触发(默认 1秒) | 强制同步所有标记为需要同步的 Pod。 |
housekeepingCh | 定时器触发(默认 2秒) | 调用 HandlePodCleanups 清理孤儿 Pod、残留的卷和网络资源。 |
liveness/readiness | 存活/就绪探针状态变更 | 更新容器状态,触发容器重启(存活探针失败)或服务端点更新(就绪探针变更)。 |
containerManager | 设备资源变更(如 GPU 分配) | 重新同步涉及设备资源的 Pod。 |
- 注:我们前面讲的 pod事件来源:api Server、本地静态 Pod、HTTP Server 或 HTTP Endpoint(URL)的 Pod 配置变更,最终都会被统一到 Pod 级别的事件通道 configCh 中处理。
2.1.3.3.状态同步流程
- 事件触发:某个事件(如 Pod 新增、容器崩溃)到达事件通道。
- 生成同步请求:将需要同步的 Pod 加入待处理队列。
- PodWorker 处理:异步执行 Pod 的创建、更新或删除操作。
- 状态上报:将最终状态通过
StatusManager
上报到 API Server。
2.1.4.与相关模块的协作
模块 | 协作方式 |
---|---|
PLEG | 通过 plegCh 提供容器状态变化事件,触发 Pod 同步。 |
PodWorker | 异步执行具体的 Pod 同步操作(如创建容器、挂载卷)。 |
StatusManager | 将 Pod 的最新状态上报到 API Server。 |
VolumeManager | 管理卷的挂载/卸载操作,确保 Pod 启动前卷已就绪。 |
ContainerRuntime | 调用容器运行时接口(CRI)执行容器生命周期操作。 |
2.1.5.kubelet 如何区分pod为 static pod?
- static pod 会包含多个 mirror annotation
metadata:annotations:kubernetes.io/config.source: file # 标识来源为本地文件kubernetes.io/config.hash: <hash> # 文件内容哈希值kubernetes.io/config.mirror: <hash> # 标识为镜像 Pod
- 具体的请见:Kubernetes控制平面组件:Kubelet 之 Static 静态 Pod
2.2.PodWorker(Pod 操作执行单元)
2.2.1.podWorker 是什么?
podWorker
是 kubelet 中用于 管理单个 Pod 生命周期操作的核心工作单元。每个 Pod 对应一个独立的podWorker
,负责执行该 Pod 的创建、更新、删除等同步操作,确保 Pod 的实际状态与期望状态一致。它是 kubelet 实现 Pod 异步化、并行化管理的核心机制。
2.2.2.podWorker 的核心功能
- 生命周期操作执行
- Pod 创建:根据配置启动容器、挂载卷、配置网络等。
- Pod 更新:处理配置变更(如镜像版本更新、资源限制调整)。
- Pod 删除:优雅终止容器、卸载卷、清理资源。
- 状态同步
- 调用容器运行时接口(CRI)执行容器操作(如
CreateContainer
、StartContainer
)。 - 与
VolumeManager
协作挂载/卸载存储卷。 - 与
StatusManager
协作上报 Pod 状态到 API Server。
- 调用容器运行时接口(CRI)执行容器操作(如
- 容错与重试
- 自动重试失败的操作(如容器启动失败)。
- 处理操作超时,避免长时间阻塞。
- 并发控制
- 每个 Pod 的同步操作在独立的 goroutine 中执行,避免资源竞争。
- 通过通道(Channel)和锁(Mutex)管理操作顺序。
2.2.3.podWorker 的实现原理
2.2.3.1.工作模型
- 每个 Pod 对应一个 worker:通过
podUpdates
通道接收同步请求。 - 事件驱动:由
syncLoop
分发的同步事件触发操作。 - 状态机管理:维护 Pod 的同步状态(如
SyncPod
、Terminating
)。
2.2.3.2.关键数据结构
- Pod 配置缓存:保存当前 Pod 的期望状态(来自 API Server 或静态配置)。
- 操作队列:按顺序处理同步请求,确保最终一致性。
- 同步上下文(SyncContext):包含执行同步操作所需的运行时状态(如容器 ID、卷挂载点)。
2.2.3.3.同步流程
- 接收同步请求:
- 从
syncLoop
接收事件(如ADD
、UPDATE
、DELETE
)。
- 从
- 生成同步操作:
- 对比当前状态与期望状态,生成差异化的操作指令(如重启容器、更新卷)。
- 执行操作:
- 容器运行时交互:调用 CRI 接口管理容器生命周期。
- 卷管理:等待
VolumeManager
完成卷挂载。 - 网络配置:调用 CNI 插件设置容器网络。
- 状态上报:
- 通过
StatusManager
将最终状态上报到 API Server。
- 通过
2.2.4.podWorker 的并发与顺序控制
-
操作顺序性
- 串行化处理:同一 Pod 的同步操作严格按顺序执行,避免竞态条件。
- 最新配置优先:若在同步过程中收到新事件,旧操作可能被中止,直接处理最新配置。
-
同步模式
模式 触发条件 行为特性 增量同步 Pod 配置发生部分变更(如环境变量更新) 仅执行必要的变更操作(如重启容器)。 全量同步 Pod 配置发生重大变更(如镜像版本变更) 销毁旧容器并重新创建。 强制同步 定时触发或手动干预(如 kubectl replace
)忽略状态缓存,全量重新同步。
2.2.5.错误处理与重试机制
- 错误分类
- 瞬时错误(如网络波动):自动重试,重试间隔指数退避。
- 持久错误(如镜像拉取失败):记录事件并停止重试,等待外部干预。
- 重试策略
- 最大重试次数:默认 5 次,超过后标记 Pod 为失败状态。
- 退避策略:初始延迟 200ms,每次翻倍,上限 7s。
- 错误日志与事件
- 日志标记:通过
klog
输出错误详情(如容器启动失败原因)。 - Kubernetes 事件:生成
Warning
类型事件供用户查看(如FailedCreateContainer
)。
- 日志标记:通过
3.容器生命周期管理
3.1.Image GC(Image Garbage Collection,镜像垃圾回收)
3.1.1.ImageGC 是什么?
- ImageGC 是 kubelet 中负责 自动清理节点上未使用的容器镜像 的模块。它的核心目标是防止节点磁盘被冗余的镜像占满,确保系统有足够空间运行新的容器。
- ImageGC 通过周期性扫描和策略性删除镜像,平衡存储资源的使用效率。
3.1.2.为什么需要 ImageGC?
- 磁盘空间管理:容器镜像通常体积较大,频繁拉取新镜像可能导致磁盘耗尽。
- 自动化运维:手动清理镜像不现实,尤其在大型集群中。
- 稳定性保障:磁盘空间不足会导致容器启动失败、节点不可用等问题。
3.1.3.ImageGC 的工作原理
3.1.3.1.触发条件
- ImageGC 的执行由以下两个阈值控制(基于节点磁盘使用率):
- 高水位阈值(
--image-gc-high-threshold
):- 默认值
85%
。当磁盘使用率超过此阈值时,触发镜像清理。
- 默认值
- 低水位阈值(
--image-gc-low-threshold
):- 默认值
80%
。清理镜像直到磁盘使用率降至此阈值以下。
- 默认值
- 高水位阈值(
3.1.3.2.清理策略
- 筛选候选镜像:
- 扫描所有镜像,排除 被正在运行的容器引用的镜像。
- 剩余镜像按 最后使用时间(LRU) 排序,优先删除最久未使用的镜像。
- 删除镜像:
- 依次删除候选镜像,直到磁盘使用率低于低水位阈值。
- 每次删除操作调用容器运行时 ImageManager 的接口(如 Docker 的
docker rmi
或 containerd 的ctr images rm
)。
3.1.3.3.执行流程
+---------------------+
| 周期性检查磁盘使用率 |
+----------+----------+|v
+----------+----------+
| 使用率 > 高水位阈值? +--否--> 等待下一周期
+----------+----------+|是v
+----------+----------+
| 列出所有未使用的镜像 |
+----------+----------+|v
+----------+----------+
| 按 LRU 排序镜像 |
+----------+----------+|v
+----------+----------+
| 依次删除镜像直到使用率 ≤ 低水位阈值 |
+---------------------+
3.1.4.关键配置参数
参数 | 说明 | 默认值 |
---|---|---|
--image-gc-high-threshold | 触发镜像清理的磁盘使用率阈值(百分比)。 | 85 |
--image-gc-low-threshold | 清理后磁盘使用率的目标阈值(百分比)。 | 80 |
--minimum-image-ttl-duration | 镜像的最小存活时间,短于此时间的镜像即使未使用也不会被删除(例如 2h )。 | 0 (禁用) |
3.1.5.与其他模块的协作
- 容器运行时接口(CRI):
- 通过 CRI 获取镜像列表、删除镜像(如
ListImages
和RemoveImage
接口)。
- 通过 CRI 获取镜像列表、删除镜像(如
- 容器GC(ContainerGC):
- ImageGC 与容器垃圾回收协同工作,先清理已终止的容器,再清理其关联的镜像。
- Kubelet 磁盘压力处理:
当节点触发磁盘压力(Disk Pressure)时,ImageGC 是关键的回收手段之一。
3.1.6.生产环境调优建议
- 合理设置阈值:
- 根据节点磁盘大小调整高低水位阈值(如大容量磁盘可适当提高阈值)。
- 示例:若磁盘为 1TB,设置
--image-gc-high-threshold=90
、--image-gc-low-threshold=85
。
- 避免频繁清理:
- 增大
--image-gc-period
(如15m
),减少对性能的影响。
- 增大
- 保护关键镜像:
- 对于频繁使用的公共镜像(如
pause
镜像),确保它们被至少一个 Pod 引用。
- 对于频繁使用的公共镜像(如
- 结合容器运行时策略:
- 某些容器运行时(如 Docker)支持自身的镜像清理策略(如
docker system prune
),需与 ImageGC 协调配置。
- 某些容器运行时(如 Docker)支持自身的镜像清理策略(如
3.2.Container GC(容器垃圾回收)
以下是关于 kubelet 的 Container Garbage Collection(容器垃圾回收模块,ContainerGC) 的详细介绍:
3.2.1.ContainerGC 是什么?
- ContainerGC 是 kubelet 中负责 自动清理节点上已终止或孤立的容器 的模块。
- 核心目标是防止节点因残留容器占用过多资源(如磁盘空间、内存),确保节点资源的高效利用和稳定性。
3.2.2.ContainerGC 的核心功能
- 清理已终止的容器:
- 删除已完成运行(Exited)的容器(如
Completed
或Error
状态的容器)。
- 删除已完成运行(Exited)的容器(如
- 清理孤立的容器:
- 删除未被任何 Pod 引用的容器(如 Pod 被删除后残留的容器)。
- 资源回收:
- 释放容器占用的磁盘空间(如日志文件、临时存储)。
3.2.3.ContainerGC 的工作原理
3.2.3.1.触发条件
- 周期性扫描:默认每隔 1分钟 触发一次扫描。
- 主动触发:当节点资源(如磁盘空间)不足时,kubelet 的 驱逐机制(Eviction Manager) 会主动调用 ContainerGC 清理容器。
3.2.3.2.清理策略
- 确定待清理容器:
- 已终止的容器:容器运行结束(状态为
Exited
)。 - 孤立的容器:容器未被任何活跃 Pod 引用(如 Pod 被删除但容器未被清理)。
- 已终止的容器:容器运行结束(状态为
- 保留策略:
- 按数量保留:默认保留最近 1个 终止的容器。
- 按时间保留:默认保留终止时间不超过 0秒,即立即删除。
3.2.3.3.执行流程
+---------------------+
| 周期性扫描容器列表 |
+----------+----------+|v
+----------+----------+
| 筛选已终止或孤立容器 |
+----------+----------+|v
+----------+----------+
| 应用保留策略 |
| - 保留最近的N个容器 |
| - 保留时间超过阈值 |
+----------+----------+|v
+----------+----------+
| 调用容器运行时删除容器 |
+---------------------+
3.3.ImageManager(镜像生命周期)
3.3.1.ImageManager 是什么?
- ImageManager 是 kubelet 中负责 管理节点上的容器镜像生命周期 的核心模块,核心职责包括镜像的拉取、缓存管理、状态同步以及与垃圾回收的协作。它确保 Pod 所需的镜像在节点上存在且可用,同时优化存储资源的使用。
3.3.2.ImageManager 的核心功能
3.3.2.1.镜像拉取(Image Pulling)
- 按需拉取:当 Pod 被调度到节点时,ImageManager 检查本地是否存在所需镜像。若不存在,则通过容器运行时(如 Docker、containerd)从镜像仓库拉取。
- 并发控制:支持并行拉取多个镜像,提升效率(通过
--serialize-image-pulls
参数配置是否串行拉取)。
3.3.2.2.镜像缓存管理
- 缓存状态维护:记录本地已存在的镜像及其元数据(如镜像大小、拉取时间)。
- 镜像有效性检查:定期验证缓存的镜像是否完整可用(如通过摘要校验)。
3.3.2.3.镜像状态同步
- 报告镜像状态:向 kubelet 提供镜像信息,供调度决策和容器启动使用。
- 更新镜像列表:与容器运行时同步镜像列表,确保缓存状态与实际一致。
3.3.2.4.与垃圾回收的协作
- 标记镜像使用情况:记录哪些镜像被活跃的 Pod 引用,为 ImageGC(镜像垃圾回收)提供清理依据。
- 响应资源压力:当节点触发磁盘压力时,优先清理未被引用的镜像。
3.3.3.ImageManager 的实现原理
3.3.3.1.镜像拉取流程
- Pod 调度到节点:kubelet 接收到 Pod 的创建请求。
- 镜像检查:ImageManager 检查本地是否存在该 Pod 所有容器的镜像。
- 拉取缺失镜像:通过 CRI(容器运行时接口)调用容器运行时的
PullImage
方法。 - 镜像验证:校验镜像的完整性(如使用镜像摘要)。
- 更新缓存:将新拉取的镜像加入本地缓存。
3.3.3.2.镜像缓存管理机制
- 缓存数据结构:
- 使用键值对存储镜像信息,键为镜像名称(如
nginx:latest
),值为镜像的元数据(如大小、拉取时间、引用计数)。
- 使用键值对存储镜像信息,键为镜像名称(如
- 引用计数:
- 跟踪哪些 Pod 正在使用某个镜像,当引用计数归零时,该镜像可能被 ImageGC 清理。
3.3.3.3.与容器运行时的交互
- CRI 接口调用,ImageManager 通过 CRI 的以下接口操作镜像:
ListImages
:获取本地镜像列表。PullImage
:拉取远程镜像。ImageStatus
:检查镜像的详细信息。RemoveImage
:删除镜像(通常由 ImageGC 触发)。
3.3.4.关键配置参数
参数 | 说明 | 默认值 |
---|---|---|
--serialize-image-pulls | 是否串行拉取镜像(设为 false 允许并行拉取,提升效率)。 | true (Kubernetes ≤1.17)false (Kubernetes ≥1.18) |
--image-pull-progress-deadline | 镜像拉取的超时时间(超过此时间未完成则标记为失败)。 | 1m |
--registry-qps | 访问镜像仓库的每秒查询次数(QPS)限制。 | 5 |
--registry-burst | 访问镜像仓库的突发请求数限制(Burst)。 | 10 |
3.3.5.与其他模块的协作
3.3.5.1.PodWorker
- 协作流程:
- PodWorker 在启动容器前,调用 ImageManager 确保镜像已存在。若镜像缺失,PodWorker 会等待拉取完成。
3.3.5.2.ImageGC(镜像垃圾回收)
- 数据共享:
- ImageManager 提供镜像的引用计数和最后使用时间,ImageGC 根据这些数据清理未被引用的镜像。
3.3.5.3.容器运行时(CRI)
- 操作代理:
- ImageManager 通过 CRI 接口实际执行镜像的拉取、删除和状态查询。
3.4.Certificate Manager(证书管理)
3.4.1.Certificate Manager 是什么
- Certificate Manager 是 kubelet 中负责管理 TLS 证书生命周期 的核心模块,用于自动轮换和更新 kubelet 与 Kubernetes API Server 通信所需的客户端证书。
- 设计目标是确保 kubelet 始终使用有效的证书进行安全通信,避免因证书过期导致的服务中断。
3.4.2.Certificate Manager 的核心功能
3.4.2.1.证书自动轮换
- 监控证书有效期:定期检查当前证书的到期时间。
- 自动申请新证书:在证书即将过期时,生成新的私钥和证书签名请求(CSR),提交到 Kubernetes API。
- 替换旧证书:获取新签名证书后,替换本地存储的旧证书。
3.4.2.2.证书签名请求(CSR)管理
- 生成 CSR:基于当前节点的身份信息(如节点名称、组信息)生成 CSR。
- 提交 CSR:通过 Kubernetes 的
certificates.k8s.io
API 提交 CSR。 - 监控 CSR 状态:等待集群的 CA(Certificate Authority)签名并获取签名后的证书。
3.4.2.3.证书存储与加载
- 安全存储证书和私钥:将证书和私钥存储在节点的安全目录(如
/var/lib/kubelet/pki
)。 - 动态加载证书:支持在不重启 kubelet 的情况下重新加载新证书。
3.4.2.4.TLS Bootstrapping 支持
- 初始证书获取:在节点首次加入集群时,自动完成 TLS 证书的初始化(需配合 Bootstrap Token 或手动批准机制)。
3.4.3.证书生命周期管理流程
3.4.3.1.初始证书申请(TLS Bootstrapping)
- 生成 Bootstrap Token:集群管理员创建 Bootstrap Token,允许节点临时访问 API。
- kubelet 启动:使用 Bootstrap Token 向 API Server 发送首次 CSR。
- CSR 批准:管理员或自动审批控制器(如
csrapprover
)批准 CSR。 - 证书下发:kubelet 获取签名后的证书,存储到本地。
3.4.3.2.证书轮换流程
- 检测证书有效期:Certificate Manager 定期检查当前证书的剩余有效期(默认提前 30% 有效期触发轮换)。
- 生成新私钥和 CSR:使用相同身份信息生成新的 CSR。
- 提交并批准 CSR:新 CSR 提交到 API Server,等待批准。
- 替换证书:获取新证书后,替换旧证书并重新加载。
3.4.4.与 Kubernetes 证书 API 的交互
3.4.4.1.CSR 的生成与提交
- CSR 内容:
apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata:name: kubelet-node1 spec:request: <base64-encoded-csr>signerName: kubernetes.io/kube-apiserver-client-kubeletusages:- digital signature- key encipherment- client auth
- 提交 CSR:
kubectl apply -f kubelet-csr.yaml
3.4.4.2.CSR 的自动批准
- 条件:CSR 需满足以下条件之一:
- 节点身份已验证(如
system:nodes
组)。 - 使用预定义的 SignerName(如
kubernetes.io/kube-apiserver-client-kubelet
)。
- 节点身份已验证(如
- 自动批准控制器:
csrapprover
控制器自动批准合法的 kubelet CSR。
3.4.5.证书存储与动态加载
3.4.5.1.默认存储路径
- 证书文件:
/var/lib/kubelet/pki/kubelet-client-current.pem
- 私钥文件:
/var/lib/kubelet/pki/kubelet-client-current.pem
- 符号链接机制:kubelet 使用符号链接指向当前有效的证书文件(如
kubelet-client-current.pem
指向实际证书文件)。
3.4.5.2.动态加载
- 证书更新后:kubelet 自动检测新证书文件并重新加载,无需重启进程。
- 兼容性:需容器运行时(如 containerd)支持动态证书加载。
3.4.6.安全性与配置
3.4.6.1.安全实践
- 私钥保护:私钥文件权限设置为
0600
,仅允许 kubelet 用户访问。 - 证书最小权限:kubelet 证书的用途限制为
client auth
,避免权限过度分配。
3.4.6.2.关键配置参数
参数 | 说明 | 默认值 |
---|---|---|
--rotate-certificates | 是否启用自动证书轮换。 | true |
--cert-dir | 证书存储目录。 | /var/lib/kubelet/pki |
--tls-cert-file | kubelet 服务端证书文件路径(若 kubelet 作为服务器)。 | 空(客户端模式无需配置) |
--tls-private-key-file | kubelet 服务端私钥文件路径。 | 空 |
--feature-gates=RotateKubeletServerCertificate | 启用服务端证书轮换(Kubernetes ≥1.8)。 | true (默认启用) |
3.4.7.故障排查与常见问题
3.4.7.1.证书轮换失败
- 现象:kubelet 日志中出现
certificate rotation error
。 - 排查步骤:
- 检查 CSR 是否已提交并批准:
kubectl get csr
。 - 检查 kubelet 日志:
journalctl -u kubelet | grep certificate
。 - 验证 CA 证书是否有效:
openssl x509 -in /etc/kubernetes/pki/ca.crt -text
。
- 检查 CSR 是否已提交并批准:
3.4.7.2.证书权限问题
- 现象:kubelet 无法读取证书文件。
- 解决:确保证书目录权限为
700
,文件权限为600
:chmod 700 /var/lib/kubelet/pki chmod 600 /var/lib/kubelet/pki/kubelet-client-current.pem
3.4.7.3.自动批准未生效
- 现象:CSR 处于
Pending
状态。 - 解决:
- 确认集群的 CSR Approver 已启用。
- 检查 CSR 的
spec.signerName
和spec.groups
是否符合自动批准策略。
3.5.StatusManager
3.5.1.StatusManager是什么
- StatusManager 是 kubelet 中负责 同步 Pod 状态到 Kubernetes API Server 的核心模块。
- 用于确保 API Server 中记录的 Pod 状态(如
Running
、Failed
)与节点上实际运行的 Pod 状态一致,是 kubelet 与集群控制平面通信的关键组件。
3.5.2.StatusManager 的核心功能
3.5.2.1.状态同步
- Pod 状态上报:将 Pod 的当前状态(包括容器状态、Pod 阶段、条件等)更新到 API Server。
- 最终一致性保障:确保即使存在网络波动或 API Server 不可用,最终状态仍会同步。
3.5.2.2.状态合并
- 冲突解决:当本地状态与 API Server 中记录的状态不一致时,合并状态并选择最新版本提交。
- 版本控制:基于
ResourceVersion
处理乐观锁冲突。
3.5.2.3.事件触发
- 容器状态变更:当容器启动、终止或探针状态变化时,触发状态更新。
- Pod 生命周期事件:如 Pod 被删除、节点资源不足导致驱逐等。
3.5.3.状态同步流程
3.5.3.1.状态收集
- 数据来源:
- 容器运行时(CRI):获取容器状态(如
Running
、Exited
)。 - ProbeManager:获取存活/就绪探针的结果。
- PodWorker:接收 Pod 的操作结果(如创建、删除成功与否)。
- 容器运行时(CRI):获取容器状态(如
3.5.3.2.状态更新触发
- 主动触发:
- 容器状态变化(如崩溃)。
- 探针结果变更(如就绪探针失败)。
- Pod 的元数据变更(如标签更新)。
- 周期性触发:默认每隔 10秒同步一次状态。
3.5.3.3.状态同步到 API Server
- 生成 Pod 状态对象:
根据收集的数据生成v1.PodStatus
对象。 - 对比新旧状态:
若本地状态与 API Server 中的状态不一致,生成更新请求。 - 提交更新:
调用 Kubernetes API 的UpdateStatus
方法提交状态变更。 - 错误处理:
若提交失败(如网络问题),重试直到成功(采用指数退避策略)。
3.5.4.与其他模块的协作
模块 | 协作方式 |
---|---|
PodWorker | 接收 Pod 操作结果(如容器启动成功/失败),触发状态更新。 |
ProbeManager | 获取容器探针(Liveness/Readiness)的结果,更新 Pod 的 Ready 条件。 |
ContainerRuntime | 获取容器实际状态(如 Running 、Exited )。 |
EvictionManager | 当 Pod 被驱逐时,更新 Pod 状态为 Failed 并添加 Evicted 条件。 |
VolumeManager | 当卷挂载失败时,更新 Pod 状态为 Pending 并记录错误信息。 |
3.6.VolumeManager
3.6.1.VolumeManager是什么
- VolumeManager 是 kubelet 中负责 管理 Pod 存储卷(Volume)生命周期 的核心模块。它确保在容器启动前完成存储卷的挂载(Mount),并在容器终止后安全卸载(Unmount)存储卷,同时处理卷的扩容、快照等操作。
- 其设计目标是保证 Pod 对持久化存储的可靠访问,并与容器运行时、CSI(Container Storage Interface)插件协同工作。
3.6.2.VolumeManager 的核心功能
3.6.2.1.卷的生命周期管理
- 挂载(Mount):
在容器启动前,将存储卷挂载到节点的指定路径(如/var/lib/kubelet/pods/<pod-id>/volumes
)。 - 卸载(Unmount):
在 Pod 终止或卷不再被使用时,卸载存储卷并清理资源。 - 扩容(Resize):
支持动态调整持久卷(PVC)的容量(需存储后端支持)。
3.6.2.2.卷的配额管理
- 容量监控:确保卷的可用空间满足 Pod 需求,触发驱逐(Eviction)或告警。
- 配额感知:对于支持配额的存储类型(如本地磁盘),限制 Pod 对卷的使用。
3.6.2.3.卷的状态同步
- 维护卷的挂载状态,确保与 API Server 中记录的卷状态一致。
- 处理卷的挂载失败、重试和错误上报。
3.6.3.卷类型与支持
- VolumeManager 支持 Kubernetes 中所有类型的存储卷,包括但不限于:
- 临时卷:
emptyDir
、configMap
、secret
。 - 持久卷:
persistentVolumeClaim
(PVC)、hostPath
。 - 外部存储:通过 CSI 插件接入的云存储(如 AWS EBS、Google Persistent Disk)。
- 特殊卷:
downwardAPI
、projected
。
- 临时卷:
3.6.4.VolumeManager 的工作原理
3.6.4.1.卷挂载流程
- Pod 调度到节点:kubelet 接收到 Pod 的创建请求。
- 卷预处理:
- 为
emptyDir
卷创建临时目录。 - 为
configMap
/secret
卷生成配置文件。 - 为 PVC 卷调用 CSI 插件完成卷的绑定(Binding)和挂载。
- 为
- 挂载到节点路径:
- 将卷挂载到节点的本地路径(如
/var/lib/kubelet/pods/<pod-id>/volumes/...
)。
- 将卷挂载到节点的本地路径(如
- 容器挂载:
- 将节点路径通过容器运行时挂载到容器内部(如
/data
)。
- 将节点路径通过容器运行时挂载到容器内部(如
3.6.4.2.卷卸载流程
- Pod 终止:kubelet 接收到 Pod 的删除请求。
- 容器停止:停止所有关联容器。
- 卷卸载:
- 卸载容器挂载点。
- 卸载节点路径上的卷(如调用
umount
或 CSI 插件的Unmount
接口)。
- 清理资源:删除临时文件或释放存储后端资源。
3.6.4.3.状态机管理
VolumeManager 为每个卷维护一个状态机,包括以下状态:
- VolumeNotMounted:卷未挂载。
- VolumeMounted:卷已挂载到节点。
- VolumeInUse:卷被容器使用。
- VolumeFailed:挂载失败(需重试或报错)。
3.6.5.与其他模块的协作
模块 | 协作方式 |
---|---|
PodWorker | 在启动容器前等待 VolumeManager 完成卷挂载。 |
CSI 插件 | 调用 CSI 接口完成存储卷的挂载、卸载和扩容操作。 |
API Server | 同步 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)的状态。 |
EvictionManager | 当卷空间不足时触发 Pod 驱逐。 |
ProbeManager | 若卷挂载失败,可能触发容器健康检查失败。 |
相关文章:
Kubernetes控制平面组件:Kubelet详解(二):核心功能层
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
【android bluetooth 框架分析 02】【Module详解 13】【CounterMetrics 模块介绍】
1. CounterMetrics 介绍 CounterMetrics 模块代码很少, 我简单介绍一下。 // system/gd/metrics/counter_metrics.cc #define LOG_TAG "BluetoothCounterMetrics"#include "metrics/counter_metrics.h"#include "common/bind.h" #i…...
Matlab自学笔记五十四:符号数学工具箱和符号运算、符号求解、绘图
1.什么是符号数学工具箱? 符号数学工具箱是Matlab针对符号对象的运算功能,它引入了一种特殊的数据类型 - 符号对象; 该数据类型包括符号数字,符号变量,符号表达式和符号函数,还包含符号矩阵,以…...
Matlab 模糊控制平行侧边自动泊车
1、内容简介 Matlab 233-模糊控制平行侧边自动泊车 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
新书速览|纯血鸿蒙HarmonyOS NEXT原生开发之旅
《纯血鸿蒙HarmonyOS NEXT原生开发之旅》 本书内容 《纯血鸿蒙HarmonyOS NEXT原生开发之旅》全面系统地介绍了基于HarmonyOS NEXT系统进行原生应用开发的实用技巧。全书共12章,内容涵盖从基础工具使用到高级功能实现的各个方面。第1章详细介绍了开发环境的搭建、Ar…...
tinyint(3)数据类型讲解
TINYINT(3) 是数据库中用于定义字段数据类型的一种写法,常见于 MySQL 等数据库系统。下面来详细了解其含义和作用: 数据类型本质 TINYINT 属于整数类型,在不同的数据库系统中,它所占用的存储空间和表示范围通常是固定的。以 MyS…...
manjaro系统详解
1. Manjaro 概述 Manjaro 是一款基于 Arch Linux 的滚动更新发行版,以 用户友好、易用性 和 硬件兼容性 为核心设计理念。它继承了 Arch 的灵活性和软件丰富性,同时通过图形化工具和稳定的更新策略降低了使用门槛,适合从新手到高级用户的广泛…...
# 实时英文 OCR 文字识别:从摄像头到 PyQt5 界面的实现
实时英文 OCR 文字识别:从摄像头到 PyQt5 界面的实现 引言 在数字化时代,文字识别技术(OCR)在众多领域中发挥着重要作用。无论是文档扫描、车牌识别还是实时视频流中的文字提取,OCR 技术都能提供高效且准确的解决方案…...
9.3.云原生架构模式
目录 一、云原生架构核心概念 云原生定义与核心原则 • 四大核心要素:容器化、微服务、DevOps、持续交付 • 核心原则:弹性、可观测性、自动化、不可变基础设施 云原生技术矩阵 • 容器与编排:Docker、Kubernetes、CRI-O • 服务治理&#…...
现代化水库运行管理矩阵平台如何建设?
政策背景 2023年8月24日,水利部发布的水利部关于加快构建现代化水库运行管理矩阵的指导意见中指出,在全面推进水库工程标准化管理的基础上,强化数字赋能,加快构建以推进全覆盖、全要素、全天候、全周期“四全”管理,完…...
木马查杀引擎—关键流程图
记录下近日研究的木马查杀引擎,将关键的实现流程图画下来 PHP AST通道实现 木马查杀调用逻辑 模型训练流程...
基于libevent的异步事件驱动型线程池实现
----------------------| IFoxThread | ← 抽象线程接口|----------------------|| dispatch() || start() || stop() || ... |----------^-----------|--------------------|----------------------| …...
ArcGIS+InVEST+RUSLE:水土流失模拟与流域管理的高效解决方案;水土保持专题地图制作
在全球生态与环境面临严峻挑战的当下,水土流失问题已然成为制约可持续发展的重要因素之一。水土流失不仅影响土地资源的可持续利用,还对生态环境、农业生产以及区域经济发展带来深远影响。因此,科学、精准地模拟与评估水土流失状况࿰…...
#S4U2SELF#S4U2Proxy#CVE-2021-42278/42287
#S4U2SELF Win08创建普通用户 s4u2 xwj456 可以看到普通用户是没用委托属性的 Win08手动赋予委托服务属性 setspn -A wsw/wsw.com s4u2 Win10身份验证 s4u2 xwj456 AS请求 两个勾 两个勾和include-pac记得按上(蓝色) ,发包之前把wiresh…...
利用基于LLM的概念提取和FakeCTI数据集提升网络威胁情报对抗虚假信息活动的能力
摘要 虚假新闻和虚假信息宣传活动的迅速蔓延对公众信任、政治稳定和网络安全构成了重大威胁。传统的网络威胁情报(CTI)方法依赖于域名和社交媒体账号等低级指标,很容易被频繁修改其在线基础设施的对手规避。为了解决这些局限性,我…...
uniapp|实现手机通讯录、首字母快捷导航功能、多端兼容(H5、微信小程序、APP)
基于uniapp实现带首字母快捷导航的通讯录功能,通过拼音转换库实现汉字姓名首字母提取与分类,结合uniapp的scroll-view组件与pageScrollTo API完成滚动定位交互,并引入uni-indexed-list插件优化索引栏性能。 目录 核心功能实现动态索引栏生成联系人列表渲染滚动定位联动性…...
使用PhpStudy搭建Web测试服务器
一、安装PhpStudy 从以下目录下载PhpStudy安装文件 Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn) 安装成功之后打开如下界面 点击启动Apache 查看网站地址 在浏览器中输入localhost:88,出现如下页面就ok了 二、与Unity交互 1.配置下载文件路径,点击…...
Qt/C++面试【速通笔记九】—视图框架机制
在Qt中,QGraphicsView和QGraphicsScene是用于构建二维图形界面的核心组件。它们的设计使得开发者能够高效地管理和渲染图形项,支持丰富的用户交互,例如缩放、旋转、平移等。 1. QGraphicsScene和QGraphicsView的基本概念 QGraphicsScene QG…...
react-diff-viewer 如何实现语法高亮
前言 react-diff-viewer 是一个很好的 diff 展示库,但是也有一些坑点和不完善的地方,本文旨在描述如何在这个库中实现自定义语法高亮。 Syntax highlighting is a bit tricky when combined with diff. Here, React Diff Viewer provides a simple rend…...
Python实例题:Django搭建简易博客
目录 Python实例题 题目 1. 创建 Django 项目和应用 2. 配置项目 3. 设计模型 blog_app templates blog_app post_list.html admin.py models.py urls.py views.py blog_project urls.py 代码解释 models.py: admin.py: urls.py&…...
Kotlin 异步初始化值
在一个类初始化的时候或者方法执行的时候,总有一些值是需要的但是不是立即需要的,并且在需要的时候需要阻塞流程来等待值的计算,这时候异步的形式创建这个值是毋庸置疑最好的选择。 为了更好的创建值需要使用 Kotlin 的协程来创建࿰…...
扩展:React 项目执行 yarn eject 后的 config 目录结构详解
扩展:React 项目执行 yarn eject 后的 config 目录结构详解 什么是 yarn eject?React 项目执行 yarn eject 后的 config 目录结构详解📁 config 目录结构各文件作用详解env.jsgetHttpsConfig.jsmodules.jspaths.jswebpack.config.jswebpackDe…...
(自用)Java学习-5.8(总结,springboot)
一、MySQL 数据库 表关系 一对一、一对多、多对多关系设计外键约束与级联操作 DML 操作 INSERT INTO table VALUES(...) DELETE FROM table WHERE... UPDATE table SET colval WHERE...DQL 查询 基础查询:SELECT * FROM table WHERE...聚合函数:COUNT()…...
cursor 如何在项目内自动创建规则
在对话框内 / Generate。cursor rules 就会自动根据项目进行创建规则 文档来自:https://www.kdocs.cn/l/cp5GpLHAWc0p...
C++ 迭代器
1.用途: 像我们之前学习的容器map,vector等,如果需要遍历该怎么做呢?这些容器大部分对下标式遍历,无法像数组灵活使用,也包括增删改查,因为它们的特性,所以需要一种其他的方法。 那么迭代器就…...
基于微信小程序的城市特色旅游推荐应用的设计与实现
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
最大m子段和
问题描述解题思路伪代码代码实现复杂度分析 问题描述 给定一个有n(n>0)个整数的序列,要求其m个互不相交的子段,使得这m个子段和最大。 输入:整数序列{nums},m。 输出:最大m子段和。 对于m1的情况,即求最…...
4.MySQL全量、增量备份与恢复
1.数据备份的重要性 在企业中数据的价值至关重要,数据保障了企业业务的正常运行。因此,数据的安全性及数据的可靠性是运维的重中之重,任何数据的丢失都可能对企业产生严重的后果。通常情况下造成数据丢失的原因有如下几种: a.程…...
每日算法刷题Day4 5.12:leetcode数组4道题,用时1h
7. 704.二分查找 704. 二分查找 - 力扣(LeetCode) 思想 二分模版题 代码 c: class Solution { public:int search(vector<int>& nums, int target) {int nnums.size();int left0,rightn-1;int res-1;while(left<right){int midleft((…...
Day 15
目录 1.chika和蜜柑1.1 解析1.2 代码 2.对称之美2.1 解析2.2 代码 3.添加字符3.1 解析3.2 代码 1.chika和蜜柑 chika和蜜柑 TopK、堆、排序 1.1 解析 1.2 代码 #include <iostream> #include <vector> #include <algorithm> using namespace std; struct …...
脑机接口重点产品发展路径分析:以四川省脑机接口及人机交互产业攻坚突破行动计划(2025-2030年)为例
引言 随着人工智能和生物技术的飞速发展,脑机接口技术作为连接人类大脑与智能设备的桥梁,正在成为全球科技竞争的新焦点。2025年5月12日,四川省经济和信息化厅等8部门联合印发了《四川省脑机接口及人机交互产业攻坚突破行动计划(2025-2030年)》,为四川省在这一前沿领域的…...
leetcode 18. 四数之和
题目描述 和leetcode 15. 三数之和用同样的方法。有两个注意点。 一是剪枝的逻辑 这是和15. 三数之和 - 力扣(LeetCode)问题不同的地方。 无法通过这种情况: 二是整数溢出 最终答案 class Solution { public:vector<vector<int>…...
CentOS部署Collabora Online
1.安装Docker CentOS7安装Docker(超详细)-CSDN博客 2.拉取镜像 docker pull collabora/code:latest 3. 启动容器(直接暴露HTTP端口) docker run -d --name collabora -p 9980:9980 -e "usernameadmin" -e "password123456" -e …...
《Spring Boot 4.0新特性深度解析》
Spring Boot 4.0的发布标志着Java生态向云原生与开发效能革命的全面迈进。作为企业级应用开发的事实标准框架,此次升级在运行时性能、云原生支持、开发者体验及生态兼容性四大维度实现突破性创新。本文深度解析其核心技术特性,涵盖GraalVM原生镜像支持、…...
FFmpeg 与 C++ 构建音视频处理全链路实战(一)—— 环境配置与视频解封装
在数字媒体的浩瀚宇宙中,FFmpeg 就像一艘功能强大的星际战舰,承载着处理音视频数据的重任。而 C 作为一门高效、灵活的编程语言,犹如一位技艺精湛的星际工程师,能够精准操控 FFmpeg 战舰,完成各类复杂的音视频处理任务…...
什么是 NoSQL 数据库?它与关系型数据库 (RDBMS) 的主要区别是什么?
我们来详细分析一下 NoSQL 数据库与关系型数据库 (RDBMS) 的主要区别。 什么是 NoSQL 数据库? NoSQL (通常指 “Not Only SQL” 而不仅仅是 “No SQL”) 是一类数据库管理系统的总称。它们的设计目标是解决传统关系型数据库 (RDBMS) 在某些场景下的局限性…...
AI需求分析话术 | DeepSeek R1
运行环境:jupyter notebook (python 3.12.7) Dash 场景: 收集了小程序的问题点和优化建议,一键AI分析,快速排优先级 指令话术: 对收集的小程序问题点和建议,做需求分析并总结形成报告,报告结构…...
【Redis】键值对数据库实现
目录 1、背景2、五种基本数据类型对应底层实现3、redis数据结构 1、背景 redis是一个(key-value)键值对数据库,其中value可以是五大基本数据类型:string、list、hash、set、zset,这五大基本数据类型对应着不同的底层结…...
MySQL 8.0 OCP 英文题库解析(三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题16~25 试题16:…...
互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-1
互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-1 在一间简洁明亮的会议室里,郑薪苦正面对着一位技术总监级别的面试官,这位面试官拥有超过十年的大型互联网企业经验,以技术全面性与落地能力著称。 第一轮面试…...
object的常用方法
在面向对象编程中,Object 类是所有类的根类,它提供了一些基本的方法,这些方法可以被所有对象继承和使用。以下是一些在 Java 中 Object 类的常用方法,以及它们的作用和使用示例: 1. equals(Object obj) 作用ÿ…...
解决vue create 创建项目,不能使用上下键选择模板的问题
使用 git bash 创建vue项目时候,无法使用上下键盘按键选择创建模板 处理: 1.当前界面,按CTR C终止创建命令; 2.使用 alias vuewinpty vue.cmd,更新命令环境; 3.再次使用 vue create demo创建项目…...
AI Agent开发第64课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent(上)
开篇 我们之前花了将近10个篇章讲Dify的一些基础应用,包括在讲Dify之前我们讲到了几十个AI Agent的开发例子,我不知道大家发觉了没有,在AI Agent开发过程中我们经常会伴随着这样的一些问题: 需要经常改猫娘;需要经常改调用LLM的参数,甚至在一个流程中有3个节点,每个节点…...
3.Redis-set集合类型
1.用集合做差集、并集(共同关注)、交集...
软考 系统架构设计师系列知识点之杂项集萃(57)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(56) 第93题 美国著名的卡内基梅隆大学软件工程学研究所针对软件工程的工程管理能力与水平进行了充分研究,提出了5级管理能力的模式,包括临时凑合阶段、简单模仿…...
Cabot:开源免费的 PagerDuty 替代品,让系统监控更简单高效
在当今复杂的IT环境中,及时发现并解决系统问题至关重要。而Cabot作为一款开源免费的监控工具,为开发和运维团队提供了强大而简单的解决方案。本文将详细介绍Cabot的核心功能、优势以及快速部署方法,帮助你更好地保障系统稳定性。 Cabot简介 Cabot是一个功能类似PagerDuty的开…...
AI中的MCP是什么?MCP的作用及未来方向预测 (使用go-zero 快速搭建MCP服务器)
AI是当下最热的风。在当今AI技术飞速发展的时代,AI的应用已经渗透到我们日常生活的方方面面。然而,随着AI系统的复杂性不断增加,如何让AI具备更强的自主性和灵活性成为了业界关注的焦点。这就引出了Model Context Protocol(MCP&am…...
字节开源FlowGram与n8n 技术选型
字节跳动开源的 FlowGram 和 n8n 是两款功能强大但定位不同的工作流编排工具,以下是两者的技术选型对比分析,结合其核心特性、适用场景和优劣势: 一、核心特性对比 维度FlowGram(字节开源)n8n定位面向AI场景的可视化工…...
面试专栏-03-Git的常用命令
二、Git常用命令学习 git本质上,就是一个 git类型的文件夹 1、基础配置信息 git -v:查看 git 版本信息 git config --global user.name "dz.cn":配置用户名,注意,这里配置的用户名在进行版本提交时…...
使用 Syncthing 在两台电脑之间同步文件:简单教程
🧩 什么是 Syncthing? Syncthing 是一个开源、跨平台、点对点的文件同步工具,类似于 Dropbox,但不依赖第三方服务器。它直接在你的设备之间同步文件,更加安全、可控,非常适合个人或团队内部使用。 支持操…...