14.7. L'élagage du registre
Le registre OpenShift Container Registry peut accumuler des blobs qui ne sont pas référencés par le etcd du cluster OpenShift Container Platform. La procédure de base d'élagage des images ne peut donc pas les traiter. Ces images sont appelées orphaned blobs.
Les blobs orphelins peuvent se produire dans les cas suivants :
-
Suppression manuelle d'une image avec la commande
oc delete image <sha256:image-id>
, qui supprime uniquement l'image de etcd, mais pas du registre. - La poussée vers le registre est initiée par des défaillances du démon, ce qui fait que certains blobs sont téléchargés, mais pas le manifeste de l'image (qui est téléchargé en tant que tout dernier composant). Toutes les images uniques deviennent orphelines.
- OpenShift Container Platform refuse une image en raison de restrictions de quotas.
- L'élagueur d'images standard supprime un manifeste d'image, mais il est interrompu avant de supprimer les blocs correspondants.
- Un bogue dans l'élagueur de registre, qui ne parvient pas à supprimer les blobs prévus, ce qui entraîne la suppression des objets images qui y font référence et rend les blobs orphelins.
Hard pruning le registre, une procédure distincte de l'élagage de l'image de base, permet aux administrateurs de cluster de supprimer les blobs orphelins. Vous devriez procéder à un hard prune si vous manquez d'espace de stockage dans votre OpenShift Container Registry et que vous pensez avoir des blobs orphelins.
Cette opération doit être peu fréquente et n'est nécessaire que si vous avez la preuve qu'un nombre important de nouveaux orphelins a été créé. Sinon, vous pouvez procéder à un élagage standard des images à intervalles réguliers, par exemple une fois par jour (en fonction du nombre d'images créées).
Procédure
Pour éliminer les blobs orphelins du registre :
Log in.
Connectez-vous au cluster avec le CLI en tant que
kubeadmin
ou un autre utilisateur privilégié ayant accès à l'espace de nomsopenshift-image-registry
.Run a basic image prune.
L'élagage de base des images supprime les images supplémentaires qui ne sont plus nécessaires. L'élagage dur ne supprime pas les images en soi. Il ne supprime que les blobs stockés dans le registre. Par conséquent, vous devez exécuter cette opération juste avant l'élagage en profondeur.
Switch the registry to read-only mode.
Si le registre n'est pas en mode lecture seule, les poussées qui se produisent en même temps que l'élagage ne le seront pas non plus :
- échouer et provoquer de nouveaux orphelins, ou
- réussit bien que les images ne puissent pas être extraites (parce que certains des blobs référencés ont été supprimés).
Les poussées n'aboutiront pas tant que le registre ne sera pas repassé en mode lecture-écriture. Par conséquent, l'élagage doit être programmé avec soin.
Pour passer le registre en mode lecture seule :
Sur le site
configs.imageregistry.operator.openshift.io/cluster
, l'adressespec.readOnly
est remplacée par l'adressetrue
:$ oc patch configs.imageregistry.operator.openshift.io/cluster -p '{"spec":{"readOnly":true}}' --type=merge
Add the
system:image-pruner
role.Le compte de service utilisé pour exécuter les instances du registre nécessite des autorisations supplémentaires pour répertorier certaines ressources.
Obtenir le nom du compte de service :
$ service_account=$(oc get -n openshift-image-registry \ -o jsonpath='{.spec.template.spec.serviceAccountName}' deploy/image-registry)
Ajoutez le rôle de cluster
system:image-pruner
au compte de service :$ oc adm policy add-cluster-role-to-user \ system:image-pruner -z \ ${service_account} -n openshift-image-registry
Optional: Run the pruner in dry-run mode.
Pour voir combien de blobs seraient supprimés, exécutez l'élagueur en mode "dry-run". Aucune modification n'est alors effectuée. L'exemple suivant fait référence à un pod de registre d'images appelé
image-registry-3-vhndw
:$ oc -n openshift-image-registry exec pod/image-registry-3-vhndw -- /bin/sh -c '/usr/bin/dockerregistry -prune=check'
Pour obtenir les chemins exacts des candidats à l'élagage, vous pouvez également augmenter le niveau de journalisation :
$ oc -n openshift-image-registry exec pod/image-registry-3-vhndw -- /bin/sh -c 'REGISTRY_LOG_LEVEL=info /usr/bin/dockerregistry -prune=check'
Exemple de sortie
time="2017-06-22T11:50:25.066156047Z" level=info msg="start prune (dry-run mode)" distribution_version="v2.4.1+unknown" kubernetes_version=v1.6.1+$Format:%h$ openshift_version=unknown time="2017-06-22T11:50:25.092257421Z" level=info msg="Would delete blob: sha256:00043a2a5e384f6b59ab17e2c3d3a3d0a7de01b2cabeb606243e468acc663fa5" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 time="2017-06-22T11:50:25.092395621Z" level=info msg="Would delete blob: sha256:0022d49612807cb348cabc562c072ef34d756adfe0100a61952cbcb87ee6578a" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 time="2017-06-22T11:50:25.092492183Z" level=info msg="Would delete blob: sha256:0029dd4228961086707e53b881e25eba0564fa80033fbbb2e27847a28d16a37c" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 time="2017-06-22T11:50:26.673946639Z" level=info msg="Would delete blob: sha256:ff7664dfc213d6cc60fd5c5f5bb00a7bf4a687e18e1df12d349a1d07b2cf7663" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 time="2017-06-22T11:50:26.674024531Z" level=info msg="Would delete blob: sha256:ff7a933178ccd931f4b5f40f9f19a65be5eeeec207e4fad2a5bafd28afbef57e" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 time="2017-06-22T11:50:26.674675469Z" level=info msg="Would delete blob: sha256:ff9b8956794b426cc80bb49a604a0b24a1553aae96b930c6919a6675db3d5e06" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 ... Would delete 13374 blobs Would free up 2.835 GiB of disk space Use -prune=delete to actually delete the data
Run the hard prune.
Exécutez la commande suivante à l'intérieur d'une instance en cours d'exécution d'un pod
image-registry
pour exécuter le hard prune. L'exemple suivant fait référence à un module de registre d'images appeléimage-registry-3-vhndw
:$ oc -n openshift-image-registry exec pod/image-registry-3-vhndw -- /bin/sh -c '/usr/bin/dockerregistry -prune=delete'
Exemple de sortie
Deleted 13374 blobs Freed up 2.835 GiB of disk space
Switch the registry back to read-write mode.
Une fois l'élagage terminé, le registre peut être remis en mode lecture-écriture. Dans
configs.imageregistry.operator.openshift.io/cluster
, définissezspec.readOnly
surfalse
:$ oc patch configs.imageregistry.operator.openshift.io/cluster -p '{"spec":{"readOnly":false}}' --type=merge