Kubelet是Kubernetes节点上的主要组件,负责管理Pod和容器的生命周期。当节点资源不足时,kubelet会采取一系列措施来清理资源。以下是kubelet如何清理资源的几个关键步骤:
1. 镜像垃圾回收(Image Garbage Collection)
- 触发条件:当节点的磁盘使用率超过设定的阈值时,kubelet会触发镜像垃圾回收。正常触发:定时执行,以保证节点资源充足;强制触发:在节点资源不足时,Kubelet在驱逐Pod前会先强制执行一次垃圾回收,如果清理后资源充足则不会驱逐Pod。
- 镜像清理过程:kubelet会识别不再被任何容器引用的镜像(未使用镜像),并按照最近使用时间排序,优先删除最旧的镜像,对于新拉取的镜像,会存活一定时间(默认2分钟)后才执行清理,以防止刚拉取的镜像就被清理掉。
-
镜像垃圾回收频率:Kubelet默认每5分钟执行一次镜像垃圾回收。
- 关键参数:
--image-gc-high-threshold
:磁盘使用率的上限阈值,默认为85%。--image-gc-low-threshold
:磁盘使用率的下限阈值,默认为80%。--minimum-image-ttl-duration
:镜像最短生存时间,默认2分钟。
-
镜像垃圾回收流程:Kubelet会识别不再被任何Pod引用的镜像,并按照最近使用时间(LRU)策略逐个清理,直到磁盘使用率降到设定的下限或没有空闲镜像可以清理。
2. 容器垃圾回收(Container Garbage Collection)
- 触发条件:kubelet定期执行容器垃圾回收,以清理不再需要的容器,主要针对普通容器、sandbox容器以及容器日志目录。对于普通容器,Kubelet会根据
MaxPerPodContainer
与MaxContainers
的设置,按照LRU策略,从Pod的死亡容器列表删除一定数量的容器,直到满足配置需求;对于sandbox容器,Kubelet按照每个Pod保留一个的原则清理多余的死亡sandbox;对于日志目录,只要没有Pod与之关联了就将其删除。 - 清理过程:kubelet会删除已经终止的容器,特别是那些已经超出保留时间的容器。
- 容器垃圾回收频率:Kubelet默认每分钟执行一次容器垃圾回收,
- 容器垃圾回收参数:
--maximum-dead-containers-per-container
:每个Pod可以保留的死亡容器的最大数量,默认为1。--maximum-dead-containers
:节点上可以保留的死亡容器的最大数量,默认为-1,表示没有限制。--minimum-container-ttl-duration
:容器可被回收的最小生存时间,默认为0分钟,即死亡容器可以立即被回收。
-
容器垃圾回收流程:Kubelet会清理可以驱逐的容器,包括那些状态不是RUNNING且在本轮GC前创建的容器。Kubelet在到达GC时间点时,会遍历所有Pod,使其满足
--maximum-dead-containers-per-container
的设置,如果不满足--maximum-dead-containers
,则计算值X=(--maximum-dead-containers
)/(Pod总数),再遍历所有Pod,使其满足已停止运行的容器集个数不大于X且至少为1,如果还不满足--maximum-dead-containers
,则对所有已停止的容器(普通容器 + sandbox容器)排序,优先删除创建时间最早的容器直到满足--maximum-dead-containers
为止。执行清理直到满足以下条件之一:- 每个Pod中存在的已挂掉的容器数满足阈值。
- 所有Pod中存在的已挂掉的容器数满足阈值。
3. 未使用的Volume清理
- 触发条件:当节点磁盘空间不足时,kubelet会尝试清理未使用的Volumes。
- 清理过程:kubelet会识别并删除那些不再被任何Pod引用的Volumes。
-
Kubelet自动清理未使用的Volume主要涉及以下几个方面:
-
PersistentVolumeClaim (PVC) 和 PersistentVolume (PV) 的回收策略:
- Kubernetes中的PVC对象可以设置
reclaimPolicy
属性,该属性有两个值:Retain
和Delete
。当PVC与PV绑定后,如果Pod被删除,根据reclaimPolicy
的设置,Volume可以被保留或自动删除。
- Kubernetes中的PVC对象可以设置
-
StorageClass的reclaimPolicy:
- 在StorageClass对象中,可以设置
reclaimPolicy
,这将决定PV的默认回收策略。当设置为Delete
时,PV和绑定的存储资源在PVC删除时将被自动清理。
- 在StorageClass对象中,可以设置
-
Kubelet垃圾回收机制:
- Kubelet定期进行垃圾收集,包括容器和镜像。Kubelet每分钟对未使用的容器执行一次垃圾收集,每五分钟对未使用的镜像执行一次垃圾收集。
-
Volume插件目录清理:
- Kubelet可以通过配置
--volume-plugin-dir
参数来指定卷插件目录,并定期清理其中的数据。
- Kubelet可以通过配置
-
日志文件管理:
- Kubelet会定期清理旧的日志文件,或者配置日志轮转工具(如logrotate)来管理日志文件的大小和生命周期,以释放磁盘空间。
-
手动清理命令:
- 可以使用
kubectl
命令清理未使用的PV和PVC,例如查找未被使用的PVC并删除它们,进而可能触发关联Volume的清理。
- 可以使用
-
定期审计和清理:
- 定期检查集群中的Volume使用情况,手动清理未被自动回收的Volume。
-
4. 驱逐机制(Eviction)
- 触发条件:当节点资源(如内存、磁盘空间)低于硬驱逐阈值时,kubelet会触发驱逐机制。
- 驱逐过程:kubelet会根据配置的驱逐策略,选择并终止某些Pod以释放资源。例如,当节点的可用内存低于100Mi时,kubelet可能会开始驱逐Pod。详细的驱逐机制见:Kubernetes基础(六)-常见 Kubernetes Pod 驱逐场景_drainresource资源cpu 内存消耗-CSDN博客
5. 日志文件管理
- 触发条件:日志文件占用大量磁盘空间时。
- 管理过程:kubelet会定期清理旧的日志文件,或者配置日志轮转工具(如logrotate)来管理日志文件的大小和生命周期。
- Kubelet 日志文件管理主要涉及以下几个方面:
-
日志文件路径规则:
- Kubelet将容器日志默认写入
/var/log/pods
目录下,每个Pod的日志存放在以其命名空间、名称和UID为名的子目录中。容器日志文件以容器重启次数命名,格式为<容器重启次数>.log
。
- Kubelet将容器日志默认写入
-
日志文件软链接规则:
- 容器日志目录下的日志文件实际上是软链接类型文件,指向实际的日志文件。
-
日志文件清理:
- Kubelet每1分钟执行一次容器清理,包括清理死亡容器的日志目录。如果一个Pod已经不再占用其日志目录,Kubelet会清理这些日志目录。
-
日志文件大小和文件数限制:
- Kubelet配置选项
containerLogMaxSize
和containerLogMaxFiles
分别允许配置每个日志文件大小的最大值和每个容器允许的最大文件数,默认分别为10Mi和5。
- Kubelet配置选项
-
日志轮换机制:
- Kubelet提供了基于可以执行多少并发日志轮换以及监控和轮换日志所需要的间隔来调整日志的轮换方式的机制。可以通过配置
containerLogMaxWorkers
和containerLogMonitorInterval
来调整。
- Kubelet提供了基于可以执行多少并发日志轮换以及监控和轮换日志所需要的间隔来调整日志的轮换方式的机制。可以通过配置
-
系统组件日志位置:
- 在使用systemd的Linux节点上,kubelet和容器运行时默认写入journald。如果systemd不存在,kubelet和容器运行时将写入到
/var/log
目录中的.log
文件。
- 在使用systemd的Linux节点上,kubelet和容器运行时默认写入journald。如果systemd不存在,kubelet和容器运行时将写入到
-
自定义日志目录:
- Kubelet允许将Pod日志目录从默认的
/var/log/pods
更改为自定义路径,通过在kubelet的配置文件中配置podLogsDir
参数来进行此调整。
- Kubelet允许将Pod日志目录从默认的
-
6. 配置参数调整
- 参数调整:管理员可以通过调整kubelet的配置参数来优化资源清理行为,例如调整垃圾回收的阈值和频率。
注意事项
- Kubelet的资源清理行为可能会影响正在运行的Pod和服务,因此需要谨慎配置。
- 在执行资源清理之前,确保重要数据已经备份,以防止数据丢失。
- 监控和报警机制可以帮助及时发现资源不足的问题,并在问题发生前采取措施。
- 不建议使用外部垃圾回收工具,因为这些工具可能会错误地清理掉Kubelet认为本应保留的镜像或容器,从而可能造成不可预知的问题。
- 有些服务可能需要Kubelet启动后才会运行,调整垃圾回收策略可以避免这部分镜像被意外清理。
- Kubelet的容器垃圾回收只针对Pod容器,非Kubelet Pod容器(比如通过
docker run
启动的容器)不会被主动清理。
通过这些机制,kubelet能够有效地管理节点资源,确保Kubernetes集群的稳定性和性能。