Kubernetes Kubelet 资源回收机制详解
一、镜像资源回收
Kubelet 的垃圾回收功能自动清理节点上的无用镜像和容器,以释放存储空间。默认情况下,Kubelet 每隔 5 分钟检查一次镜像占用情况,并执行清理操作。
1. 镜像回收概述
Kubernetes 提供了全面的镜像生命周期管理服务,涵盖所有镜像(包括用户手动拉取的镜像)。当磁盘使用率超过设定阈值时,Kubelet 根据 LRU 策略删除未被任何 Pod 容器使用的镜像,直到磁盘使用率降至设定的下限或无可清理的镜像。
以下是镜像回收的关键步骤:
- 读取节点上所有镜像及容器信息。
- 过滤出未被任何容器引用的镜像。
- 按最近使用时间排序,优先清理最久未使用的镜像。
- 逐个清理镜像,直至满足磁盘使用率要求。
注意:Kubelet 只会清理未被任何 Pod 容器(包括已终止容器)引用的镜像,用户通过 docker run 手动启动的容器不会影响镜像引用关系。
2. 实验验证
以下实验展示了如何调整配置参数触发镜像回收:
# 修改 kubelet 启动参数
vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --image-gc-high-threshold=2 --image-gc-low-threshold=1
systemctl daemon-reload && systemctl restart kubelet
运行一个 nginx 容器并观察镜像回收行为:
# 创建 nginx deployment
kubectl run nginx --image=nginx:1.14 --port=80 --replicas=3
# 删除 deployment 并等待回收
kubectl delete deploy nginx
查看回收日志:
journalctl -u kubelet -o cat | grep imageGCManager
二、容器资源回收
1. 容器回收概述
Kubelet 定期清理停止运行的容器及其相关文件,以优化磁盘空间和系统性能。容器回收主要涉及普通容器、sandbox 容器和日志目录。
- 普通容器:根据最大保留数量限制和 LRU 策略清理死亡容器。
- Sandbox 容器:每个 Pod 仅保留最新的 sandbox 容器。
- 日志目录:删除与已终止 Pod 关联的日志文件。
容器回收的关键参数如下:
# 修改 kubelet 参数
vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--minimum-container-ttl-duration=5m --maximum-dead-containers-per-container=2 --maximum-dead-containers=10"
systemctl daemon-reload && systemctl restart kubelet
2. 实验验证
创建一个 nginx 容器并模拟异常退出:
# 创建单实例 nginx deployment
kubectl run nginx --image=nginx:1.14 --port=80 --replicas=1
# 手动杀死容器实例
docker kill <container_id>
观察死亡容器清理行为:
# 查看容器列表
docker ps -a
# 修改参数禁用死亡容器保留
vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--maximum-dead-containers=0"
systemctl daemon-reload && systemctl restart kubelet
三、总结
Kubelet 通过定期清理无用镜像和容器来优化节点资源使用。镜像回收基于磁盘使用率和 LRU 策略,而容器回收则依赖于死亡容器数量限制和日志清理规则。这些机制确保 Kubernetes 集群高效稳定运行。