5.6. 在断开连接的环境中删除镜像
如果您之前使用 oc-mirror 插件 v2 部署镜像,您可以删除这些镜像来释放镜像 registry 中的空间。oc-mirror 插件 v2 不会自动修剪没有包括在 ImageSetConfiguration 文件中的镜像。这可防止在对 ImageSetConfig.yaml 文件进行更改时意外删除必要的或部署的镜像。
您必须创建一个 DeleteImageSetConfiguration 文件,以指定要删除的镜像。
在以下示例中,DeleteImageSetConfiguration 文件会删除以下镜像:
- OpenShift Container Platform 4.13.3 的所有发行镜像。
-
aws-load-balancer-operatorv0.0.1 捆绑包及其所有相关镜像。 -
ubi和ubi-minimal的额外镜像,通过它们对应的摘要引用。
DeleteImageSetConfiguration 文件示例
apiVersion: mirror.openshift.io/v2alpha1
kind: DeleteImageSetConfiguration
delete:
platform:
channels:
- name: stable-4.13
minVersion: 4.13.3
maxVersion: 4.13.3
operators:
- catalog: registry.redhat.io/redhat/redhat-operator-index:v4.12
packages:
- name: aws-load-balancer-operator
minVersion: 0.0.1
maxVersion: 0.0.1
additionalImages:
- name: registry.redhat.io/ubi8/ubi@sha256:bce7e9f69fb7d4533447232478fd825811c760288f87a35699f9c8f030f2c1a6
- name: registry.redhat.io/ubi8/ubi-minimal@sha256:8bedbe742f140108897fb3532068e8316900d9814f399d676ac78b46e740e34e
- 考虑使用 mirror-to-disk 和 disk-to-mirror 工作流来减少删除问题。
-
在 oc-mirror 插件 v2 中,您必须为
additionalImages下列出的所有镜像使用显式 registry 主机名。否则,镜像会被镜像到不正确的目标路径。
oc-mirror 插件 v2 只删除镜像的清单,这不会减少 registry 中占用的存储。
要从不必要的镜像(如带有删除的清单)中释放存储空间,您必须在容器 registry 上启用垃圾收集器。启用垃圾收集器后,registry 将删除不再引用任何清单的镜像 Blob,从而减少之前由已删除 Blob 占用的存储。启用垃圾收集器的过程因容器 registry 而异。
如需更多信息,请参阅"在分发 registry 中解决存储清理问题"。
要在删除 Operator 镜像时跳过删除 Operator 目录镜像,您必须在
DeleteImageSetConfiguration文件中列出 Operator 目录镜像下的特定 Operator。这样可确保只有指定的 Operator 被删除,而不是目录镜像。如果只指定 Operator 目录镜像,则该目录中的所有 Operator 以及目录镜像本身都将被删除。
oc-mirror 插件 v2 不会自动删除 Operator 目录镜像,因为其他 Operator 可能仍然被部署并依赖于这些镜像。
如果您不确定目录中的 Operator 没有保留在 registry 或集群中,您可以在
DeleteImageSetConfiguration中明确将目录镜像添加到additionalImages中以移除它。- 垃圾回收行为取决于 registry。有些 registry 不会自动删除已删除的镜像,需要系统管理员手动触发垃圾回收来释放空间。
5.6.1. 解决分发 registry 中的存储清理问题 复制链接链接已复制到粘贴板!
分发 registry 中的一个已知问题会阻止垃圾收集器按预期释放存储。使用 Red Hat Quay 时不会出现这个问题。
流程
选择发行 registry 中已知问题的适当方法:
要重启容器 registry,请运行以下命令:
$ podman restart <registry_container>要在 registry 配置中禁用缓存,请执行以下步骤:
要禁用
blobdescriptor缓存,请修改/etc/docker/registry/config.yml文件:version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: "" filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3要应用这些更改,请运行以下命令重启容器 registry:
$ podman restart <registry_container>
5.6.2. 从断开连接的环境中删除镜像 复制链接链接已复制到粘贴板!
要使用 oc-mirror 插件 v2 从断开连接的环境中删除镜像,请按照以下步骤操作。
先决条件
- 您已在环境中启用了垃圾回收,以删除不再引用清单的镜像。
流程
创建一个
delete-image-set-config.yaml文件,并包含以下内容:DeleteImageSetConfiguration文件apiVersion: mirror.openshift.io/v2alpha1 kind: DeleteImageSetConfiguration delete: platform: channels: - name: <channel_name>1 minVersion: <channel_min_version>2 maxVersion: <channel_max_version>3 operators: - catalog: <operator_catalog_name>4 packages: - name: <operator_name>5 minVersion: <operator_max_version>6 maxVersion: <operator_min_version>7 additionalImages: - name: <additional_images>- 1 1
- 指定要删除的 OpenShift Container Platform 频道的名称,如
stable-4.15。 - 2 3
- 指定要在频道中删除的镜像版本范围,例如,
4.15.0为最小版本,4.15.1为最大版本。要只删除一个版本的镜像,在minVersion和maxVersion字段中都使用要删除的版本号。 - 4
- 指定包含要删除的 Operator 的 Operator 目录镜像,如
registry.redhat.io/redhat/redhat-operator-index:v4.14。Operator 目录镜像不会被删除。对于集群中剩余的其他 Operator,可能需要在 registry 中存在。 - 5
- 指定要删除的特定 Operator,如
aws-load-balancer-operator。 - 6 7
- 指定为 Operator 删除的镜像版本范围,如最小版本为
0.0.1,最大版本为0.0.2。
运行以下命令,创建一个
delete-images.yaml文件:$ oc mirror delete --config delete-image-set-config.yaml --workspace file://<previously_mirrored_work_folder> --v2 --generate docker://<remote_registry>其中:
- <previously_mirrored_work_folder>
- 指定镜像以前被 mirror 到的或在 mirror 过程中存储镜像的目录。
- <remote_registry>
指定将从中删除镜像的远程容器 registry 的 URL 或地址。
重要在删除镜像时,指定正确的工作区目录。仅在从头开始镜像时修改或删除缓存目录,如设置一个新集群。如果对缓存目录的更改不正确,可能会破坏进一步的镜像操作。
-
进入创建的
<previously_mirrored_work_folder>/delete目录。 -
验证
delete-images.yaml文件是否已生成。 - 手工确保文件中列出的每个镜像不再被集群需要,可以安全地从 registry 中删除。
生成
delete-imagesYAML 文件后,运行以下命令来从远程 registry 中删除镜像:$ oc mirror delete --v2 --delete-yaml-file <previously_mirrored_work_folder>/working-dir/delete/delete-images.yaml docker://<remote_registry>其中:
- <previously_mirrored_work_folder>
- 指定镜像以前被 mirror 到的或在 mirror 过程中存储镜像的目录。
- <remote_registry>
指定将从中删除镜像的远程容器 registry 的 URL 或地址。
重要当使用 mirror-to-mirror 方法 mirror 镜像时,镜像不会在本地缓存,因此您无法从本地缓存中删除镜像。