19.6. 修剪镜像
要修剪系统因为年龄、状态或超过限值而不再需要的镜像,管理员可运行以下命令:
$ oc adm prune images [<options>]
除非使用了 --prune-registry=false
,否则修剪镜像会从集成 registry 中移除数据。要使此操作正常工作,请确保 registry 配置了 storage:delete:enabled
设置为 true。
使用 --namespace
标志修剪镜像时不移除镜像,只移除镜像流。镜像是没有命名空间的资源。因此,将修剪限制到特定的命名空间会导致无法计算其当前使用量。
默认情况下,集成 registry 会缓存 blob 元数据来减少对存储的请求数量,并提高处理请求的速度。修剪不会更新集成 registry 缓存。在修剪后推送的镜像如果含有修剪的层,它们会被破坏,因为不会推送在缓存中有元数据的已修剪层。因此,修剪之后需要清除缓存。这可以通过重新部署 registry 来完成:
$ oc rollout latest dc/docker-registry
如果集成 registry 使用 redis 缓存,则需要手动清理数据库。
如果无法在修剪后重新部署 registry,则必须永久禁用缓存。
选项 | 描述 |
---|---|
|
包括没有推送到 registry 但已通过 pullthrough 镜像的镜像。默认为开启。要将修剪限制为已被推送到集成 registry 的镜像,请传递 |
| 与 OpenShift Container Platform 管理的 registry 通信时使用的证书颁发机构文件的路径。默认为来自当前用户配置文件的证书颁发机构数据。如果提供,将启动安全连接。 |
|
指明应该执行修剪,而不是空运行。这需要具有指向集成容器镜像 registry 的有效路由。如果此命令在集群网络外运行,则需要使用 |
| 谨慎使用这个选项。允许与通过 HTTP 托管或具有无效 HTTPS 证书的 Docker 注册表进行不安全连接。如需更多信息 ,请参阅使用安全连接或 不安全连接。 |
|
对于每个镜像流,每个标签最多保留 N 个镜像修订。(默认值 |
|
不修剪相对于当前时间年龄不到 |
|
修剪超过同一项目中定义的最小 限值 的每个镜像。此标志不能与 |
|
联系 registry 时使用的地址。命令将尝试使用由受管镜像和镜像流决定的集群内部 URL。如果失败(registry 无法解析或访问),则需要使用此标志提供一个替代路由。registry 主机名可以加上前缀 |
| 此选项与其他选项规定的条件一起使用,用于控制是否修剪 registry 中与 OpenShift Container Platform 镜像 API 对象对应的数据。默认情况下,镜像修剪同时处理镜像 API 对象和 registry 中的对应数据。当您只关注移除 etcd 内容时(可能要减少镜像对象的数量,但并不关心清理 registry)或要通过 硬化 Pruning Registry 来单独进行此操作(可能在 registry 的适当维护窗口期间),此选项很有用处。 |
19.6.1. 镜像修剪条件
删除"由 OpenShift Container Platform 管理"的镜像(带有注解
openshift.io/image.managed
的镜像),该镜像至少在--keep-younger-than 分钟前创建
,且目前没有被以下对象引用:-
在
--keep-younger-than
指定的分钟内创建的所有 pod。 -
任何
--keep-younger-than 分钟前之后创建
的镜像流。 - 任何正在运行的容器集。
- 任何待处理的 pod。
- 任何复制控制器。
- 任何部署配置。
- 任何构建配置。
- 任何构建。
-
stream.status.tags
-revisions 个最新项。[].items 中的 --keep-tag
-
在
对于"由 OpenShift Container Platform 管理"的镜像(带有注解
openshift.io/image.managed
的镜像),请删除超过同一项目中定义的最小 限值 且目前没有被以下对象引用的镜像:- 任何正在运行的容器集。
- 任何待处理的 pod。
- 任何复制控制器。
- 任何部署配置。
- 任何构建配置。
- 任何构建。
- 不支持从外部 registry 进行修剪。
-
镜像被修剪后,会从在
status.tags
中引用镜像的所有镜像流中移除对该镜像的所有引用。 - 也移除不再被任何镜像引用的镜像层。
--prune-over-size-limit
无法与 --keep-tag-revisions 或
--keep-younger-than 标志结合使用
。这样做将返回不允许执行此操作的信息。
分离 OpenShift Container Platform 镜像 API 对象和 registry 中的镜像数据,方法是使用 --prune-registry=false
,然后再通过 硬修剪注册表 来缩小一些计时窗口,与尝试通过一个命令同时修剪这两者相比更为安全。但是,计时窗口不会完全剔除。
例如,您仍然可以创建一个引用镜像的 Pod,因为修剪会标识该镜像进行修剪。您仍然应该跟踪修剪操作期间创建的 API 对象,该对象可能会引用镜像,从而避免引用已删除的内容。
此外,请注意,如果重新执行修剪时不使用 --prune-registry
选项或 --prune-registry=true
选项,则不会修剪之前通过 --prune-registry=false
修剪的镜像的镜像 registry 中关联的存储。使用 --prune-registry=false
修剪的任何镜像只能通过 硬化 Pruning 从 registry 存储中删除。
查看修剪操作要删除的对象:
最多保留三个标签修订,并且保留年龄不足 60 分钟的资源(镜像、镜像流和 pod):
$ oc adm prune images --keep-tag-revisions=3 --keep-younger-than=60m
修剪超过定义的限值的所有镜像:
$ oc adm prune images --prune-over-size-limit
实际对上述选项执行修剪操作:
$ oc adm prune images --keep-tag-revisions=3 --keep-younger-than=60m --confirm $ oc adm prune images --prune-over-size-limit --confirm