14.6. 修剪镜像
修剪自定义资源可为 OpenShift 镜像 registry 中的镜像启用自动镜像修剪。管理员可以使用 oc adm prune images <image_prune_option&
gt; 命令手动修剪镜像。例如:
oc adm prune images <image_prune_option>
$ oc adm prune images <image_prune_option>
- 1
- 有关可用修剪选项的更多信息,请参阅"手动镜像修剪命令选项"。
这个命令会删除系统不再需要的镜像。
根据您的需要,您可以根据它们的年龄和标签历史记录来修剪镜像,或者修剪导致项目超过其定义的存储限值的镜像。
14.6.1. 修剪镜像时的注意事项 复制链接链接已复制到粘贴板!
在手动修剪镜像前请考虑以下信息:
-
使用--
namespace
标志修剪不会删除镜像。它只移除镜像流,因为镜像是集群范围的资源。将修剪限制到特定的命名空间会导致无法计算当前使用量。 默认情况下,集成 registry 会缓存 blob 元数据来减少对存储的请求数量,并提高请求处理速度。修剪不会更新集成 registry 缓存。在修剪后推送的镜像如果含有修剪的层,它们会被破坏,因为不会推送在缓存中有元数据的已修剪层。因此,您必须重新部署 registry,以便在修剪后清除缓存:
oc rollout restart deployment/image-registry -n openshift-image-registry
$ oc rollout restart deployment/image-registry -n openshift-image-registry
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果集成 registry 使用 Redis 缓存,您必须手动清理数据库。
- 如果无法在修剪后重新部署 registry,那么您必须永久禁用缓存。
-
oc adm prune images
操作需要 registry 的路由。默认不创建 registry 路由。
14.6.2. 修剪镜像时的限制 复制链接链接已复制到粘贴板!
修剪镜像时会有以下限制:
- 不支持从外部 registry 修剪镜像。
-
镜像被修剪后,镜像的所有引用将从
status.tags
中包含该镜像的所有镜像流中删除。 - 移除不再被任何镜像引用的镜像层。
14.6.3. 镜像修剪条件 复制链接链接已复制到粘贴板!
OpenShift Container Platform 支持两个用于修剪镜像的方法:
- 按年龄和标签修剪
- 按大小限制修剪
这些方法相互排斥。您必须选择是按年龄和标签进行修剪,还是按大小限制。无论您选择什么方法,镜像修剪器都会检查以确保正在使用的镜像不会被删除。
只有满足主要条件 且没有 系统组件主动引用时,才会修剪镜像。
14.6.3.1. 通过年龄和标签修剪镜像 复制链接链接已复制到粘贴板!
通过年龄和标签修剪镜像是默认的修剪策略。它通过使用 --keep-younger-than 和-keep-
tag-revisions
标志来识别要删除的镜像。要按 age 和 tag 修剪镜像,镜像必须早于 --keep-younger-than
阈值,而不是最新标签修订之一,且不能被活跃工作负载使用。
要使镜像按 age 和 tag 修剪,必须满足以下所有条件:
-
镜像由 OpenShift Container Platform 管理,或者具有
openshift.io/image.managed
注解。 -
镜像比-
keep-younger-than 标志指定的时间
旧。 -
镜像不是其标签的最新镜像之一,如
--keep-tag-revisions 标志指定
。 该镜像 目前没有 被以下任何活跃或最新的 API 对象引用:
-
Pod 或镜像流最近创建超过
-keep-younger-than
持续时间。 - 运行中或待处理的 pod
- 部署、复制控制器、副本集或有状态的集合。
- 构建、构建配置、作业或 cronjobs。
-
Pod 或镜像流最近创建超过
只有镜像是旧的,而不是最新的标签修订,且确认没有系统组件的活跃引用,才会删除镜像。
14.6.3.2. 按大小限制修剪镜像 复制链接链接已复制到粘贴板!
根据大小限制修剪镜像使用 -prune-over-size-limit
标志。此方法用于将项目重新置于其定义的镜像存储限制下。
--prune-over-size-limit
标志无法与 --keep-tag-revisions
或 --keep-younger-than
标志结合使用。这样做会返回不允许操作的信息。
要使镜像使用此方法修剪,以下所有条件都必须为 true :
- 该镜像是目前超过其最小定义大小限制的项目的一部分。
- 镜像由修剪器选择,作为删除的候选者,以减少总大小。
镜像目前没有被以下活跃 API 对象引用:
-
处于
正在运行或
待处理状态
的 Pod。 - 部署、复制控制器、副本集或有状态的集合。
- 构建、构建配置、作业或 cronjobs。
-
处于
使用此方法时,主触发器是项目的大小,但确保镜像没有主动使用的安全检查。
14.6.4. 运行镜像修剪操作 复制链接链接已复制到粘贴板!
使用以下步骤运行镜像修剪操作
先决条件
- 您必须使用访问令牌登录到 CLI。
-
您必须具有
system:image-pruner
集群角色或更高级别的角色(如cluster-admin
)。 - 镜像 registry 必须公开。
- 您已参阅本文档的"手动修剪镜像"部分。
流程
可选: 要预览要修剪的镜像,请输入以下命令。此命令输出要删除的镜像、镜像流和 pod 的列表。请注意,在添加-
confirm
标志之前,不会删除任何内容。oc adm prune images <image_prune_option_one> <image_prune_option_two>
$ oc adm prune images <image_prune_option_one> <image_prune_option_two>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 有关可用修剪选项的更多信息,请参阅"手动镜像修剪命令选项"。
- 检查输出,以确认要删除的镜像、镜像流和 pod 列表。
使用适当的集群选项运行
oc adm prune images
命令。添加--confirm
标志以确认删除。例如:oc adm prune images <image_prune_option_one> <image_prune_option_two> --confirm
$ oc adm prune images <image_prune_option_one> <image_prune_option_two> --confirm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.6.5. 使用安全或不安全连接 复制链接链接已复制到粘贴板!
安全连接是首选和推荐的方法。它通过 HTTPS 协议来进行,并且会强制验证证书。若有可能,prune
命令始终会尝试使用这种连接。如果不可能,某些情况下会回退到不安全连接,而这存在危险。这时,会跳过证书验证或使用普通 HTTP 协议。
除非指定了 --certificate-authority
,否则以下情形中允许回退到不安全连接:
-
使用
--force-insecure
选项运行prune
命令。 -
提供的
registry-url
带有http://
架构前缀。 -
提供的
registry-url
是本地链路地址或localhost
。 -
当前用户的配置允许不安全连接。造成的原因可能是用户使用
--insecure-skip-tls-verify
登录或在提示时选择不安全连接。
如果 registry 使用有别于 OpenShift Container Platform 所用的证书颁发机构进行保护,则必须通过 --certificate-authority
标志来指定。否则,prune
命令会出错。
14.6.6. 镜像修剪 CLI 选项 复制链接链接已复制到粘贴板!
下表描述了您可以与 oc adm prune images <image_prune_option
> 命令一起使用的选项。
选项 | 描述 |
---|---|
|
包括没有推送到 registry 但已通过 pullthrough 镜像的镜像。默认为开启。要将修剪限制为已被推送到集成 registry 的镜像,请传递 |
| 与 OpenShift Container Platform 管理的 registry 通信时使用的证书颁发机构文件的路径。默认为来自当前用户配置文件的证书颁发机构数据。如果提供,则发起安全连接。 |
|
指明应该执行修剪,而不是空运行。这需要具有指向集成容器镜像 registry 的有效路由。如果此命令在集群网络外运行,则必须使用 |
| 谨慎使用这个选项。允许与通过 HTTP 托管或具有无效 HTTPS 证书的容器 registry 进行不安全连接。 |
|
对于每个镜像流,每个标签最多保留 |
|
不修剪相对于当前时间年龄不到 |
|
修剪超过同一项目中定义的最小限值的每个镜像。此标志不能与 |
|
联系 registry 时使用的地址。此命令尝试使用由受管镜像和镜像流决定的集群内部 URL。如果失败(registry 无法解析或访问),则需要使用此标志提供一个替代路由。可以在 registry 主机名中加上前缀 |
| 此选项与其他选项指定的条件结合,可以控制是否修剪 registry 中与 OpenShift Container Platform 镜像 API 对象对应的数据。默认情况下,镜像修剪同时处理镜像 API 对象和 registry 中对应的数据。 当您只关注移除 etcd 内容时(可能要减少镜像对象的数量,但并不关心清理 registry)或要通过硬修剪 registry 来单独进行操作(可能在 registry 的适当维护窗口期间),此选项很有用处。 |
14.6.6.1. 有关 --prune-registry 标志的附加信息 复制链接链接已复制到粘贴板!
您可以通过传递- prune-registry=false 标志,将 OpenShift Container Platform 镜像 API 对象从 registry
中删除镜像数据分开。例如,以下命令只修剪 API 对象,使 registry 存储保持不变:
oc adm prune images --keep-tag-revisions=3 --keep-younger-than=60m --confirm --prune-registry=false
$ oc adm prune images --keep-tag-revisions=3 --keep-younger-than=60m --confirm --prune-registry=false
然后,您可以对 registry 执行硬修剪,以删除关联的镜像数据。与在单个命令中修剪这两者相比,这种方法可以缩小竞争条件的计时窗口。
但是,计时窗口不会被完全消除。例如,在标识该镜像以进行修剪时,可能仍会创建 pod 来引用镜像。您应该跟踪在修剪过程中创建的任何 API 对象,以确保它们不引用已删除的内容。
在不使用-prune-registry 选项或 with -
选项的情况下重新运行修剪不会删除之前使用- prune-registry
=trueprune-registry=false 修剪的镜像的相关 registry
存储。这些镜像只能通过执行 registry 硬修剪来从 registry 存储中删除。如需更多信息,请参阅"修剪 registry"。
14.6.7. 镜像修剪问题 复制链接链接已复制到粘贴板!
14.6.7.1. 镜像没有被修剪 复制链接链接已复制到粘贴板!
如果您的镜像不断积累,且 prune
命令只移除您的预期的少许部分,请确保清楚镜像视为修剪候选者时必须要满足的镜像修剪条件。
确保您要移除的镜像在每个标签历史记录中所处的位置高于您选择的标签修订阈值。例如,有一个名为 sha256:abz
的陈旧镜像。在您的命名空间中运行以下命令,镜像会在其中标记,它会在一个名为 myapp
的镜像流中标记三次:
oc get is -n <namespace> -o go-template='{{range $isi, $is := .items}}{{range $ti, $tag := $is.status.tags}}'\ '{{range $ii, $item := $tag.items}}{{if eq $item.image "sha256:<hash>"}}{{$is.metadata.name}}:{{$tag.tag}} at position {{$ii}} out of {{len $tag.items}}\n'\ '{{end}}{{end}}{{end}}{{end}}'
$ oc get is -n <namespace> -o go-template='{{range $isi, $is := .items}}{{range $ti, $tag := $is.status.tags}}'\
'{{range $ii, $item := $tag.items}}{{if eq $item.image "sha256:<hash>"}}{{$is.metadata.name}}:{{$tag.tag}} at position {{$ii}} out of {{len $tag.items}}\n'\
'{{end}}{{end}}{{end}}{{end}}'
输出示例
myapp:v2 at position 4 out of 5 myapp:v2.1 at position 2 out of 2 myapp:v2.1-may-2016 at position 0 out of 1
myapp:v2 at position 4 out of 5
myapp:v2.1 at position 2 out of 2
myapp:v2.1-may-2016 at position 0 out of 1
使用默认选项时,不会修剪该镜像,因为它出现在 myapp:v2.1-may-2016
标签历史记录中的位置 0
上。要将镜像视为需要修剪,管理员必须:
在运行
oc adm prune images
命令时指定--keep-tag-revisions=0
。警告此操作从所有含有基础镜像的命名空间中移除所有标签,除非它们比指定阈值年轻,或者有比指定阈值年轻的对象引用它们。
-
删除所有位置低于修订阈值的
istag
,即myapp:v2.1
和myapp:v2.1-may-2016
。 -
在历史记录中进一步移动镜像,可以通过运行新构建并推送到同一
istag
,或者标记其他镜像。对于旧版标签,这可能并不是需要的结果。
应该避免在标签的名称中包含某个特定镜像的构建日期或时间,除非镜像必须保留不定的时长。这样的标签通常在历史记录中只有一个镜像,这会永久阻止它们被修剪。
14.6.7.2. 对不安全 registry 使用安全连接 复制链接链接已复制到粘贴板!
如果您在 oc adm prune images
命令的输出中看到类似于如下的消息,这表示您的 registry 未受保护,并且 oc adm prune images
客户端尝试使用安全连接:
error: error communicating with registry: Get https://172.30.30.30:5000/healthz: http: server gave HTTP response to HTTPS client
error: error communicating with registry: Get https://172.30.30.30:5000/healthz: http: server gave HTTP response to HTTPS client
-
建议的解决方案是保护 registry 的安全。或在,您可以强制客户端使用不安全连接,方法是在命令中附加
--force-insecure
,但并不建议这样做。
14.6.7.3. 对受保护 registry 使用不安全连接 复制链接链接已复制到粘贴板!
如果您在 oc adm prune images
命令中看到以下错误之一,这表示您的 registry 已设有保护,但签署其证书的证书颁发机构与 oc adm prune images
客户端用于连接验证的不同:
error: error communicating with registry: Get http://172.30.30.30:5000/healthz: malformed HTTP response "\x15\x03\x01\x00\x02\x02" error: error communicating with registry: [Get https://172.30.30.30:5000/healthz: x509: certificate signed by unknown authority, Get http://172.30.30.30:5000/healthz: malformed HTTP response "\x15\x03\x01\x00\x02\x02"]
error: error communicating with registry: Get http://172.30.30.30:5000/healthz: malformed HTTP response "\x15\x03\x01\x00\x02\x02"
error: error communicating with registry: [Get https://172.30.30.30:5000/healthz: x509: certificate signed by unknown authority, Get http://172.30.30.30:5000/healthz: malformed HTTP response "\x15\x03\x01\x00\x02\x02"]
默认情况下,使用存储在用户配置文件中的证书颁发机构数据;与主 API 通信时也是如此。
使用 --certificate-authority
选项为容器镜像 registry 服务器提供正确的证书颁发机构。
14.6.7.4. 使用错误的证书颁发机构 复制链接链接已复制到粘贴板!
以下错误表示,用来为受保护容器镜像 registry 的证书签名的证书颁发机构与客户端使用的不同:
error: error communicating with registry: Get https://172.30.30.30:5000/: x509: certificate signed by unknown authority
error: error communicating with registry: Get https://172.30.30.30:5000/: x509: certificate signed by unknown authority
务必通过 --certificate-authority
提供正确的证书颁发机构。
作为一种临时解决方案,您可以添加 --force-insecure
标签。不过,我们不建议这样做。