2017-12-18 146 views
0

我的k8s群集的节点尝试删除容器使用的图像。Kubernetes&垃圾收集器:试图删除使用的图像

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

这里的日志:

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 

有什么建议? 手动删除Docker镜像并在节点上停止容器会导致此类问题?

预先感谢您。

回答

1

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

如果对象不属于任何所有者,则表示它是孤儿。 Kubernetes中有一种模式,在kubernetes中被称为所有权。

对于实例,如果应用部署对象,那么它将创建一个replicaSet对象,进一步ResplicaSet将创建pods对象。

所以,所有权流

部署< == RepicaSet < ===波德

现在,如果你删除部署对象,这意味着ReplicaSet没有所有者,然后垃圾收集器会尝试删除ReplicaSet现在荚没有拥有者,因此,GC会尝试删除豆荚。

有一个名为ownerReferences其描述了在所有这些对象诸如部署,ReplicaSet,豆荚等的关系字段

有3种方法中Kubernetes删除对象。

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

解决您的问题

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

如果你想检查ownerRererences状态:

kubectl get pod $PODNAME -o yaml 

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

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

garbage-collection

garbage-collection-k8s

1

您所遇到的不是普通Kubernetes垃圾回收已删除的孤立的API资源对象,但kubelet's Image collection

每当节点经历磁盘压力,Kubelet守护程序将拼命尝试通过删除(据推测)未使用的映像来回收磁盘空间。阅读source code表明,Kubelet将图像从上次用于创建Pod之后的时间进行排序 - 如果所有图像都在使用,Kubelet会尝试将其删除并失败(这可能是发生了什么事情给你)。

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