kubelet定义image清理策略
1. 查看当前 kubelet 配置
首先查看 kubelet 如何启动:
1 | ps -ef | grep kubelet |
或者:
1 | systemctl cat kubelet |
例如:
1 | ExecStart=/usr/bin/kubelet \ |
重点看:
1 | --config=/var/lib/kubelet/config.yaml |
这说明 kubelet 使用配置文件。
2. kubelet 配置文件
大多数 kubeadm 安装的集群:
1 | /var/lib/kubelet/config.yaml |
例如:
1 | apiVersion: kubelet.config.k8s.io/v1beta1 |
修改后:
1 | systemctl restart kubelet |
3. kubeadm 管理的配置
如果使用 kubeadm,真正的配置来源通常是 ConfigMap,而不是直接编辑本地文件。
查看:
1 | kubectl -n kube-system get cm kubelet-config -o yaml |
或者(不同版本名称可能带版本号):
1 | kubectl -n kube-system get cm | grep kubelet |
例如:
1 | kubelet-config-1.31 |
查看:
1 | kubectl -n kube-system edit cm kubelet-config-1.31 |
里面会有:
1 | imageGCHighThresholdPercent: 85 |
然后更新节点配置:
1 | kubeadm upgrade node phase kubelet-config |
注意:
如果直接修改
/var/lib/kubelet/config.yaml,后续执行kubeadm upgrade时可能会被 ConfigMap 中的配置覆盖。
4. 老版本(<1.11)启动参数
以前可以直接写:
1 | --image-gc-high-threshold=85 |
例如:
1 | ExecStart=/usr/bin/kubelet \ |
目前官方推荐使用 KubeletConfiguration 配置文件,不建议继续依赖命令行参数。
5. Image GC 工作机制
flowchart TD
A[Kubelet 定时检查 imagefs 使用率] --> B{imagefs > HighThreshold?}
B -- 否 --> C[结束]
B -- 是 --> D[删除未使用镜像]
D --> E{imagefs <= LowThreshold?}
E -- 否 --> D
E -- 是 --> F[停止 GC]
例如:
1 | imageGCHighThresholdPercent: 85 |
表示:
- 镜像目录(
imagefs)使用率达到 85% 时开始回收。 - 一直删除未被容器引用的镜像,直到使用率降到 80% 以下停止。
6. 如何确认 GC 是否生效
查看 kubelet 日志:
1 | journalctl -u kubelet -f |
可能看到类似日志:
1 | Image garbage collection succeeded |
也可以过滤:
1 | journalctl -u kubelet | grep -i image |
7. 查看当前生效配置
如果 kubelet 暴露了配置(部分发行版默认关闭),可以查看:
1 | curl http://127.0.0.1:10248/configz |
或启用了认证端口时:
1 | kubectl get --raw /api/v1/nodes/<node-name>/proxy/configz |
确认 imageGCHighThresholdPercent、imageGCLowThresholdPercent 等配置的实际值。
8. 生产环境推荐配置
对于 containerd + Kubernetes 的生产环境,可参考以下配置:
1 | imageGCHighThresholdPercent: 80 |
其中:
imageGCHighThresholdPercent:达到 80% 开始回收镜像。imageGCLowThresholdPercent:回收到 75% 即停止。imageMinimumGCAge:镜像至少保留 5 分钟后才允许参与 GC,避免刚拉取的镜像立即被回收。evictionHard.imagefs.available:镜像文件系统剩余空间低于 10% 时,触发节点驱逐(Eviction)机制,与 Image GC 配合使用,防止磁盘耗尽。
imageGCHighThresholdPercent 和 imageGCLowThresholdPercent 是 kubelet 的 Image Garbage Collection(Image GC) 配置项,由 kubelet 周期性执行,不需要 crictl 或 containerd 手工触发。