Kubernetes&垃圾收集器:试图删除使用的图像

我的k8s群集的一个节点有GC尝试删除容器使用的图像。

这种行为对我来说似乎很陌生。

这里的日志:

kubelet: I1218 12:44:19.925831 11177 image_gc_manager.go:334] [imageGCManager]: Removing image "sha256:99e59f495ffaa222bfeb67580213e8c28c1e885f1d245ab2bbe3b1b1ec3bd0b2" to free 746888 bytes kubelet: E1218 12:44:19.928742 11177 remote_image.go:130] RemoveImage "sha256:99e59f495ffaa222bfeb67580213e8c28c1e885f1d245ab2bbe3b1b1ec3bd0b2" from image service failed: rpc error: code = Unknown desc = Error response from daemon: conflict: unable to delete 99e59f495ffa (cannot be forced) - image is being used by running container 6f236a385a8e kubelet: E1218 12:44:19.928793 11177 kuberuntime_image.go:126] Remove image "sha256:99e59f495ffaa222bfeb67580213e8c28c1e885f1d245ab2bbe3b1b1ec3bd0b2" failed: rpc error: code = Unknown desc = Error response from daemon: conflict: unable to delete 99e59f495ffa (cannot be forced) - image is being used by running container 6f236a385a8e kubelet: W1218 12:44:19.928821 11177 eviction_manager.go:435] eviction manager: unexpected error when attempting to reduce nodefs pressure: wanted to free 9223372036854775807 bytes, but freed 0 bytes space with errors in image deletion: rpc error: code = Unknown desc = Error response from daemon: conflict: unable to delete 99e59f495ffa (cannot be forced) - image is being used by running container 6f236a385a8e 

有什么build议么? 可能手动删除泊坞窗图像并停止节点上的容器导致这样的问题?

先谢谢你。

据我所知,Kubelet有一个垃圾收集器,目的是为了利用资源去除不必要的K8s对象。

如果物体不属于任何拥有者,则意味着其成为孤儿。 在Kubernetes中有一种被称为所有权的模式

对于Instance,如果应用了部署对象,那么它将创build一个replicaSet对象,进一步ResplicaSet将创buildpods对象。

所以所有权stream

部署<== RepicaSet <=== Pod

现在,如果您删除了部署对象,这意味着ReplicaSet没有所有者,那么垃圾收集器将尝试删除ReplicaSet,现在Pod没有所有者,因此GC将尝试删除Pod。

有一个叫做ownerReferences的字段,描述了所有这些对象之间的关系,比如Deployment,ReplicaSet,Pods等

有三种方法可以删除Kubernetes中的对象。

  • 前景:如果您尝试删除部署,那么在删除部署后,将删除第一个数据块,然后复制数据库。
  • 背景:如果您尝试删除部署,则首先部署将被删除。现在,GC将删除复制品和Pod。
  • 孤儿:如果您删除部署,则Repicaset将成为孤立,GC将删除所有这些孤立的对象。

解决您的问题

在我看来,你的荚(容器)是孤立的,因此,GC确保将它从群集中移除。

如果你想检查ownerRererences状态:

 kubectl get pod $PODNAME -o yaml 

在元数据部分,会有足够的信息。

我附上了进一步研究的参考资料。

垃圾收集

垃圾收集,K8S

你遇到的不是常规的Kubernetes垃圾收集,它删除了孤立的API资源对象,而是Kubelet的Image集合

每当节点遇到“ 磁盘压力”时 ,Kubelet守护进程将拼命尝试删除(假定)未使用的映像来回收磁盘空间。 阅读源代码显示,Kubelet按照上次用于创buildPod的时间对图像进行sorting – 如果所有图像都在使用中,Kubelet将尝试将其删除并失败(这可能是什么原因发生在你身上)。

您可以使用Kubelet的--minimum-image-ttl-duration标志来指定图像在Kubelet尝试将其删除之前需要具有的最小年龄(尽pipe这不会阻止Kubelet尝试全部删除已使用的图像)。 或者,看看您是否可以为您的节点提供更多磁盘空间用于映像(或构build更小的映像)。