如何清理旧的未使用的 Kubernetes 镜像/标签?

问题描述 投票:0回答:6

为了简化 部署 和短期回滚,为要在 Kubernetes 上部署的每个新版本使用新的 Docker 镜像标签非常有用。如果不进行清理,这意味着旧图像:标签将永远保留。

我如何列出 Kubernetes 容器使用的所有 image:tag ,以便我可以找到所有旧的 image:tag 旧的且不使用的,并从 Docker 注册表中自动删除它们?

我的理想目标是让 Google Container Engine (GKE) 删除未使用的映像和 Google Container Registry

kubernetes docker-registry google-kubernetes-engine
6个回答
18
投票

作为替代方法,您可以考虑让 Kubernetes 为您处理旧映像的回收。

目前,ImageManager 处理候选图像的回收。请参阅:垃圾收集

垃圾收集是 kubelet 的一个有用的功能,可以清理垃圾 未引用的图像和未使用的容器。 kubelet 将执行 每分钟对容器进行垃圾收集和垃圾收集 每五分钟一次图像。

配置通过这两个 kublet cli 参数控制:

  --image-gc-high-threshold=90: The percent of disk usage after which image garbage collection is always run. Default: 90%
  --image-gc-low-threshold=80: The percent of disk usage before which image garbage collection is never run. Lowest disk usage to garbage collect to. Default: 80%

可以调整高/低阈值,以按照适合您的时间间隔强制收集。


4
投票

在最新版本的 kubelet 中,请使用以下选项,因为 --image-gc-high-threshold--image-gc-low-threshold 已被弃用:

--eviction-hard
--eviction-soft

更多详情请点击这里:


2
投票

要获取 Kubernetes 集群使用的所有镜像的列表,可以运行 shell 脚本:

for image in $(kubectl get pods --all-namespaces --output=jsonpath='{..image}')
do
    echo $image
done

但是,目前似乎无法简单地从 Google 容器注册表中删除映像(请参阅如何删除 Google 容器注册表中推送的映像


1
投票

您可以使用在 DaemonSet 中运行的 docker-cleanup 容器。这将清除集群中每个节点上所有未使用的图像。


0
投票

我不确定是否有记录的方法来进行此类维护。然而,Openshift Origin 确实尝试通过修剪 docker 镜像并与注册表交互来删除旧的 blob 来解决问题

我们已经在原始环境中实现了它。 github 上的源代码


0
投票

@Ryan Cox 的答案已经过时,Kubelet 自动清理(即垃圾收集)的现代等效方法是两个 Kubelet 配置选项:

imageMaximumGCAge: <max_unused_time>
imageMinimumGCAge: <min_unused_time>

来源:

© www.soinside.com 2019 - 2024. All rights reserved.