This documentation is for a release that is no longer maintained
See documentation for the latest supported version 3 or the latest supported version 4.8.6. 硬修剪 registry
OpenShift Container Registry 可能会积累未被 OpenShift Container Platform 集群的 etcd 引用的 Blob。因此,基本镜像修剪过程对它们无用。它们称为孤立的 Blob。
以下情形中可能会出现孤立的 Blob:
-
使用
oc delete image <sha256:image-id>
命令手动删除镜像,该命令仅从 etcd 中移除镜像,而不从 registry 存储中移除。 - 守护进程失败引发的推送到 registry 的行为,会造成只上传一些 blob,但不上传其镜像清单(这作为最后一个组件上传)。所有唯一镜像 Blob 变成孤立的 Blob。
- OpenShift Container Platform 因为配额限制而拒绝某一镜像。
- 标准镜像修剪器删除镜像清单,但在删除相关 Blob 前中断。
- registry 修剪器中有一个程序错误,无法移除预定的 Blob,从而导致引用它们的镜像对象被移除,并且 Blob 变成孤立的 Blob。
硬修剪registry 是独立于基本镜像修剪的流程,能够让集群管理员移除孤立的 Blob。如果 OpenShift Container registry 的存储空间不足,并且您认为有孤立的 Blob,则应该执行硬修剪。
这应该是罕见的操作,只有在有证据表明创建了大量新的孤立项时才需要。否则,您可以定期执行标准镜像修剪,例如一天一次(取决于要创建的镜像数量)。
流程
从 registry 中硬修剪孤立的 Blob:
登录。
使用 CLI,以
kubeadmin
或可访问openshift-image-registry
命名空间的其他特权用户身份登录集群 。运行基本镜像修剪。
基本镜像修剪会移除了不再需要的额外镜像。硬修剪不移除自己的镜像,只移除保存在 registry 存储中的 Blob。因此,您应该在硬修剪之前运行此操作。
将 registry 切换成只读模式。
如果 registry 不以只读模式运行,任何在修剪的同时发生的推送将会:
- 失败,并导致出现新的孤立项;或者
- 成功,但镜像无法拉取(因为删除了一些引用的 Blob)。
只有 registry 切回到读写模式后,推送才会成功。因此,必须仔细地调度硬修剪。
将 registry 切换成只读模式:
在
configs.imageregistry.operator.openshift.io/cluster
中,把spec.readOnly
设置为true
:oc patch configs.imageregistry.operator.openshift.io/cluster -p '{"spec":{"readOnly":true}}' --type=merge
$ oc patch configs.imageregistry.operator.openshift.io/cluster -p '{"spec":{"readOnly":true}}' --type=merge
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
添加
system:image-pruner
角色。用来运行 registry 实例的服务帐户需要额外的权限才能列出某些资源。
获取服务帐户名称:
service_account=$(oc get -n openshift-image-registry \ -o jsonpath='{.spec.template.spec.serviceAccountName}' deploy/image-registry)
$ service_account=$(oc get -n openshift-image-registry \ -o jsonpath='{.spec.template.spec.serviceAccountName}' deploy/image-registry)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
system:image-pruner
集群角色添加到服务帐户:oc adm policy add-cluster-role-to-user \ system:image-pruner -z \ ${service_account} -n openshift-image-registry
$ oc adm policy add-cluster-role-to-user \ system:image-pruner -z \ ${service_account} -n openshift-image-registry
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
(可选)在空运行模式下运行修剪器。
若要查看会移除多少 Blob,请以空运行模式运行硬修剪器。不会实际进行任何更改:
oc -n openshift-image-registry \ rsh deploy/image-registry \ /usr/bin/dockerregistry -prune=check
$ oc -n openshift-image-registry \ rsh deploy/image-registry \ /usr/bin/dockerregistry -prune=check
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,若要获得修剪候选者的准确路径,可提高日志级别:
oc -n openshift-image-registry \ rsh deploy/image-registry env REGISTRY_LOG_LEVEL=info \ /usr/bin/dockerregistry -prune=check
$ oc -n openshift-image-registry \ rsh deploy/image-registry env REGISTRY_LOG_LEVEL=info \ /usr/bin/dockerregistry -prune=check
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 已截断的输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行硬修剪。
在
docker-registry
pod 的一个正在运行的实例中执行以下命令进行硬修剪:oc -n openshift-image-registry \ rsh deploy/image-registry \ /usr/bin/dockerregistry -prune=delete
$ oc -n openshift-image-registry \ rsh deploy/image-registry \ /usr/bin/dockerregistry -prune=delete
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
oc exec image-registry-3-vhndw \ -- /usr/bin/dockerregistry -prune=delete
$ oc exec image-registry-3-vhndw \ -- /usr/bin/dockerregistry -prune=delete Deleted 13374 blobs Freed up 2.835 GiB of disk space
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 registry 切回到读写模式。
在修剪完成后,registry 可以被切换到读写模式:在
configs.imageregistry.operator.openshift.io/cluster
中,把spec.readOnly
设置为false
:oc patch configs.imageregistry.operator.openshift.io/cluster -p '{"spec":{"readOnly":false}}' --type=merge
$ oc patch configs.imageregistry.operator.openshift.io/cluster -p '{"spec":{"readOnly":false}}' --type=merge
Copy to Clipboard Copied! Toggle word wrap Toggle overflow