kubelet定义image清理策略

1. 查看当前 kubelet 配置

首先查看 kubelet 如何启动:

1
ps -ef | grep kubelet

或者:

1
systemctl cat kubelet

例如:

1
2
3
ExecStart=/usr/bin/kubelet \
--bootstrap-kubeconfig=... \
--config=/var/lib/kubelet/config.yaml

重点看:

1
--config=/var/lib/kubelet/config.yaml

这说明 kubelet 使用配置文件。


2. kubelet 配置文件

大多数 kubeadm 安装的集群:

1
/var/lib/kubelet/config.yaml

例如:

1
2
3
4
5
6
7
8
9
10
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration

imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80

imageMinimumGCAge: 2m

evictionHard:
imagefs.available: "15%"

修改后:

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
2
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80

然后更新节点配置:

1
2
kubeadm upgrade node phase kubelet-config
systemctl restart kubelet

注意:

如果直接修改 /var/lib/kubelet/config.yaml,后续执行 kubeadm upgrade 时可能会被 ConfigMap 中的配置覆盖。


4. 老版本(<1.11)启动参数

以前可以直接写:

1
2
--image-gc-high-threshold=85
--image-gc-low-threshold=80

例如:

1
2
3
ExecStart=/usr/bin/kubelet \
--image-gc-high-threshold=85 \
--image-gc-low-threshold=80

目前官方推荐使用 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
2
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80

表示:

  • 镜像目录(imagefs)使用率达到 85% 时开始回收。
  • 一直删除未被容器引用的镜像,直到使用率降到 80% 以下停止。

6. 如何确认 GC 是否生效

查看 kubelet 日志:

1
journalctl -u kubelet -f

可能看到类似日志:

1
2
3
Image garbage collection succeeded
Removing image sha256:...
ImageGCManager: Disk usage on image filesystem is over the high threshold

也可以过滤:

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

确认 imageGCHighThresholdPercentimageGCLowThresholdPercent 等配置的实际值。


8. 生产环境推荐配置

对于 containerd + Kubernetes 的生产环境,可参考以下配置:

1
2
3
4
5
6
7
8
imageGCHighThresholdPercent: 80
imageGCLowThresholdPercent: 75

imageMinimumGCAge: 5m

evictionHard:
imagefs.available: "10%"
nodefs.available: "10%"

其中:

  • imageGCHighThresholdPercent:达到 80% 开始回收镜像。
  • imageGCLowThresholdPercent:回收到 75% 即停止。
  • imageMinimumGCAge:镜像至少保留 5 分钟后才允许参与 GC,避免刚拉取的镜像立即被回收。
  • evictionHard.imagefs.available:镜像文件系统剩余空间低于 10% 时,触发节点驱逐(Eviction)机制,与 Image GC 配合使用,防止磁盘耗尽。

imageGCHighThresholdPercentimageGCLowThresholdPercentkubelet 的 Image Garbage Collection(Image GC) 配置项,由 kubelet 周期性执行,不需要 crictl 或 containerd 手工触发。