Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

19.6. 修剪镜像

要修剪系统因为年龄、状态或超过限值而不再需要的镜像,管理员可运行以下命令:

$ oc adm prune images [<options>]
注意

目前,若要修剪镜像,您必须先以具有访问令牌的用户身份登录到 CLI。用户还必须有 集群角色 system:image-pruner 或更高级别的角色 (如 cluster-admin)。

注意

除非使用了 --prune-registry=false,否则修剪镜像会从集成 registry 中移除数据。要使此操作正常工作,请确保 registry 配置了 storage:delete:enabled 设置为 true

注意

使用 --namespace 标志修剪镜像时不移除镜像,只移除镜像流。镜像是没有命名空间的资源。因此,将修剪限制到特定的命名空间会导致无法计算其当前使用量。

默认情况下,集成 registry 会缓存 blob 元数据来减少对存储的请求数量,并提高处理请求的速度。修剪不会更新集成 registry 缓存。在修剪后推送的镜像如果含有修剪的层,它们会被破坏,因为不会推送在缓存中有元数据的已修剪层。因此,修剪之后需要清除缓存。这可以通过重新部署 registry 来完成:

$ oc rollout latest dc/docker-registry

如果集成 registry 使用 redis 缓存,则需要手动清理数据库。

如果无法在修剪后重新部署 registry,则必须永久禁用缓存

表 19.4. 修剪镜像 CLI 配置选项

选项描述

--all

包括没有推送到 registry 但已通过 pullthrough 镜像的镜像。默认为开启。要将修剪限制为已被推送到集成 registry 的镜像,请传递 --all=false

--certificate-authority

与 OpenShift Container Platform 管理的 registry 通信时使用的证书颁发机构文件的路径。默认为来自当前用户配置文件的证书颁发机构数据。如果提供,将启动安全连接。

--confirm

指明应该执行修剪,而不是空运行。这需要具有指向集成容器镜像 registry 的有效路由。如果此命令在集群网络外运行,则需要使用 --registry-url 提供路由。

--force-insecure

谨慎使用这个选项。允许与通过 HTTP 托管或具有无效 HTTPS 证书的 Docker 注册表进行不安全连接。如需更多信息 ,请参阅使用安全连接或 不安全连接。

--keep-tag-revisions=<N>

对于每个镜像流,每个标签最多保留 N 个镜像修订。(默认值 3

--keep-younger-than=<duration>

不修剪相对于当前时间年龄不到 <duration> 的镜像。不修剪被相对于当前时间年龄不到 <duration> 的其他对象引用的镜像。(默认值 60m

--prune-over-size-limit

修剪超过同一项目中定义的最小 限值 的每个镜像。此标志不能与 --keep-tag-revisions--keep-younger-than 结合使用。

--registry-url

联系 registry 时使用的地址。命令将尝试使用由受管镜像和镜像流决定的集群内部 URL。如果失败(registry 无法解析或访问),则需要使用此标志提供一个替代路由。registry 主机名可以加上前缀 https://http:// 来强制执行特定的连接协议。

--prune-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 [].items 中的 --keep-tag -revisions 个最新项。
  • 对于"由 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 存储中删除。

查看修剪操作要删除的对象:

  1. 最多保留三个标签修订,并且保留年龄不足 60 分钟的资源(镜像、镜像流和 pod):

    $ oc adm prune images --keep-tag-revisions=3 --keep-younger-than=60m
  2. 修剪超过定义的限值的所有镜像:

    $ 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