Pourquoi l'extraction d'images du registre échoue-t-elle avec le statut ImagePullBackOff ou des erreurs d'autorisation ?
Cloud privé virtuel Infrastructure classique
Lorsque vous déployez une charge de travail qui extrait une image d'IBM Cloud Container Registry, vos pods échouent avec le statut ImagePullBackOff.
oc get pods
NAME READY STATUS RESTARTS AGE
<pod_name> 0/1 ImagePullBackOff 0 2m
Lorsque vous décrivez le pod, vous voyez des erreurs d'authentification de ce type :
oc describe pod <pod_name>
Failed to pull image "<region>.icr.io/<namespace>/<image>:<tag>" ... unauthorized: authentication required
Failed to pull image "<region>.icr.io/<namespace>/<image>:<tag>" ... 401 Unauthorized
...
Failed to pull image "<image>:<tag>" ... Manifest for <image>:<tag> not found
Votre cluster utilise une clé API stockée dans un secret d'extraction d'images pour autoriser le cluster à extraire des images de IBM Cloud Container Registry, ou l'image avec la balise spécifique n'existe pas dans le référentiel.
Par défaut, les nouveaux clusters ont des secrets d'extraction d'image qui utilisent des clés d'API pour que le cluster puisse extraire des images d'un registre icr.io régional pour les conteneurs déployés dans le projet default Red Hat OpenShift.
-
Vérifiez que vous utilisez le nom et l'étiquette d'image corrects dans votre fichier YAML de déploiement.
ibmcloud cr images -
Vérifiez votre trafic d'extraction et quota de stockage. Si la limite est atteinte, libérez de l'espace de stockage utilisé ou demandez à votre administrateur de registre d'augmenter le quota.
ibmcloud cr quota -
Obtenez le fichier de configuration d'un pod à l'état d'échec et recherchez la section
imagePullSecrets.oc get pod <pod_name> -o yamlExemple de sortie
... imagePullSecrets: - name: all-icr-io ... -
Si aucun secret d'extraction d'image n'est répertorié, configurez-en un dans votre projet.
- Vérifiez que le projet
defaultcomporte des secrets d'extraction d'imageicr-iopour chaque registre régional que vous souhaitez utiliser. Si aucun secreticr-ion'est répertorié dans le projet, Utiliser la commandeibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>pour créer les secrets d'extraction d'image dans le projetdefault.oc get secrets -n default | grep "icr-io" - Copiez le secret d'extraction d'image
all-icr-iodu projetdefaultRed Hat OpenShift dans le projet où vous voulez déployer votre charge de travail. - Ajoutez le secret d'extraction d'image dans le compte de service pour ce projet Red Hat OpenShift pour que tous les pods du projet puissent utiliser les données d'identification de ce secret.
- Vérifiez que le projet
-
Si des secrets d'extraction d'image sont répertoriés, déterminez le type de données d'identification que vous utilisez pour accéder à IBM Cloud Container Registry.
- Si le secret comporte
icrdans le nom, vous utilisez une clé d'API pour l'authentification avec les noms de domaineicr.io. Passez à la section Traitement des incidents liés aux secrets d'extraction d'image utilisant des clés d'API. - Si vous disposez de ces deux types de secret, vous utilisez les deux méthodes d'authentification. Utilisez désormais les noms de domaine
icr.iodans vos fichiers YAML de déploiement correspondant à l'image de conteneur. Passez à la section Traitement des incidents liés aux secrets d'extraction d'image utilisant des clés d'API.
- Si le secret comporte
Traitement des incidents liés aux secrets d'extraction d'image utilisant des clés d'API
Si votre configuration de pod contient un secret d'extraction d'image qui utilise une clé d'API, vérifiez que les données d'identification de la clé d'API sont configurées correctement.
Les étapes suivantes considèrent que la clé d'API stocke les données d'identification d'un ID de service. Si vous avez configuré votre secret d'extraction d'image pour l'utilisation de la clé d'API d'un utilisateur individuel, vous devez vérifier les droits IBM Cloud IAM et les données d'identification de cet utilisateur.
-
Recherchez l'ID de service utilisé par la clé d'API pour le secret d'extraction d'image en examinant la section Description. L'ID de service créé avec le cluster est nommé
cluster-<cluster_ID>et est utilisé dans le projetdefaultRed Hat OpenShift. Si vous avez créé un autre ID de service par exemple pour accéder à un autre projet Red Hat OpenShift ou pour modifier des droits IBM Cloud IAM, vous avez personnalisé la description.ibmcloud iam service-idsExemple de sortie
UUID Name Created At Last Updated Description Locked ServiceId-aa11... <service_ID_name> 2019-02-01T19:01+0000 2019-02-01T19:01+0000 ID for <cluster_name> false ServiceId-bb22... <service_ID_name> 2019-02-01T19:01+0000 2019-02-01T19:01+0000 Service ID for IBM Cloud Container Registry in Kubernetes cluster <cluster_name> namespace <project> false -
Vérifiez que l'ID de service bénéficie au moins d'une **règle de rôle d'accès au service IBM Cloud IAM **Lecteur pour IBM Cloud Container Registry. Si l'ID de service ne dispose pas du rôle d'accès au service Lecteur, modifiez les règles IAM. Si les règles sont correctes, passez à l'étape suivante pour voir si les données d'identification sont valides.
ibmcloud iam service-policies <service_ID_name>Exemple de sortie
Policy ID: a111a111-b22b-333c-d4dd-e555555555e5 Roles: Reader Resources: Service Name container-registry Service Instance Region Resource Type namespace Resource <registry_namespace> -
Vérifiez si les données d'identification du secret d'extraction d'image sont valides.
-
Obtenez la configuration du secret d'extraction d'image. Si le pod ne fait pas partie du projet «
default», ajoutez l'option «-n».oc get secret <image_pull_secret_name> -o yaml [-n <project>] -
Dans la sortie, copiez la valeur codée en base64 de la zone
.dockerconfigjson.apiVersion: v1 kind: Secret data: .dockerconfigjson: eyJyZWdp...== ... -
Décodez la chaîne en base64. Par exemple, sous OS X, vous pouvez exécuter la commande suivante.
echo -n "<base64_string>" | base64 --decodeExemple de sortie
{"auths":{"<region>.icr.io":{"username":"iamapikey","password":"<password_string>","email":"<name@abc.com>","auth":"<auth_string>"}}} -
Comparez le nom de domaine du registre régional du secret d'extraction d'image au nom de domaine que vous avez spécifié dans l'image de conteneur. Par défaut, les nouveaux clusters ont des secrets d'extraction d'image pour chaque nom de domaine de registre régional pour les conteneurs qui s'exécutent dans le projet
defaultRed Hat OpenShift. Cependant, si vous avez modifié les paramètres par défaut ou si vous utilisez un autre projet Red Hat OpenShift, vous ne disposez pas forcément d'un secret d'extraction d'image pour le registre régional. Copiez un secret d'extraction d'image pour le nom de domaine du registre régional. -
Connectez-vous au registre sur votre machine locale en utilisant le nom d'utilisateur (
username) et le mot de passe (password) de votre secret d'extraction d'image. Si vous ne pouvez pas vous connecter, il peut être nécessaire de corriger l'ID de service.docker login -u iamapikey -p <password_string> <region>.icr.io- Créez à nouveau l'ID de service du cluster, les règles IBM Cloud IAM, la clé d'API et des secrets d'extraction d'image pour les conteneurs qui s'exécutent dans le projet
defaultRed Hat OpenShift.ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID> - Créez à nouveau votre déploiement dans le projet
defaultRed Hat OpenShift. Si vous voyez encore le message d'erreur d'autorisation, répétez les étapes 1 à 5 avec les nouveaux secrets d'extraction d'image. Si vous ne pouvez toujours pas vous connecter, ouvrez un dossier de support IBM Cloud.
- Créez à nouveau l'ID de service du cluster, les règles IBM Cloud IAM, la clé d'API et des secrets d'extraction d'image pour les conteneurs qui s'exécutent dans le projet
-
Si la connexion est établie, extrayez une image en local. Si la commande échoue avec une erreur de type
access denied, le compte du registre se trouve dans un autre compte IBM Cloud que celui dans lequel réside votre cluster. Créez un secret d'extraction d'image pour accéder aux images dans l'autre compte. Si vous parvenez à télécharger une image sur votre ordinateur local, cela signifie que votre clé API dispose des autorisations nécessaires, mais que la configuration de l'API dans votre cluster n'est pas correcte.docker pull <region>icr.io/<namespace>/<image>:<tag> -
Vérifiez que le secret d'extraction est référencé directement à partir du déploiement ou depuis le compte de service utilisé par le déploiement. Si vous ne parvenez toujours pas à résoudre le problème, contactez le support.
-