我有一个单节点 Kubernetes 集群。通过 GUI,用户可以订阅和取消订阅各种镜像,订阅和取消订阅会从所选镜像中实例化和取消实例化容器。
我被要求自动删除未使用的图像。
我的问题是,当我尝试删除图像时(例如通过定期运行“docker system prune”),重新订阅我尝试删除的图像的用户与删除之间存在竞争。
我已经考虑使用kubelet 垃圾收集但这些标志已被弃用,我考虑采取激进的资源处理不足政策,但我想我最终会驱逐最终用户 pod正在使用。
我尝试在运行“docker system prune”之前封锁节点,因为我认为这可以避免竞争,但它似乎没有帮助。
答案1
您可以尝试的一个解决方案是通过执行以下命令停止 kubelet:systemctl stop kubelet
然后docker system prune
(删除未使用的数据)。之后,您再次启动 kubelet。
通过这样做,您可以停止节点上的任何更改,同时保留任何 pod 或服务的操作。因此,如果有人尝试使用应该删除的映像启动 pod,它将不会启动,直到您再次启动 kubelet。它只会停留在特定节点的待处理状态。
这些操作应该可以解决您与 docker 镜像竞争条件的问题。
但请记住,这样做您可能会遇到一些指标收集问题,因为 cAdvisor 是集成到 kubelet 二进制文件中的代理。