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.

  1. Vérifiez que vous utilisez le nom et l'étiquette d'image corrects dans votre fichier YAML de déploiement.

    ibmcloud cr images
    
  2. 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
    
  3. Obtenez le fichier de configuration d'un pod à l'état d'échec et recherchez la section imagePullSecrets.

    oc get pod <pod_name> -o yaml
    

    Exemple de sortie

    ...
    imagePullSecrets:
    - name: all-icr-io
    ...
    
  4. Si aucun secret d'extraction d'image n'est répertorié, configurez-en un dans votre projet.

    1. Vérifiez que le projet default comporte des secrets d'extraction d'image icr-io pour chaque registre régional que vous souhaitez utiliser. Si aucun secret icr-io n'est répertorié dans le projet, Utiliser la commande ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID> pour créer les secrets d'extraction d'image dans le projet default.
      oc get secrets -n default | grep "icr-io"
      
    2. Copiez le secret d'extraction d'image all-icr-io du projet default Red Hat OpenShift dans le projet où vous voulez déployer votre charge de travail.
    3. 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.
  5. 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.

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.

  1. 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 projet default Red 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-ids
    

    Exemple 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
    
  2. 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>
    
  3. Vérifiez si les données d'identification du secret d'extraction d'image sont valides.

    1. 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>]
      
    2. Dans la sortie, copiez la valeur codée en base64 de la zone .dockerconfigjson.

      apiVersion: v1
      kind: Secret
      data:
        .dockerconfigjson: eyJyZWdp...==
      ...
      
    3. Décodez la chaîne en base64. Par exemple, sous OS X, vous pouvez exécuter la commande suivante.

      echo -n "<base64_string>" | base64 --decode
      

      Exemple de sortie

      {"auths":{"<region>.icr.io":{"username":"iamapikey","password":"<password_string>","email":"<name@abc.com>","auth":"<auth_string>"}}}
      
    4. 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 default Red 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.

    5. 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
      
      1. 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 default Red Hat OpenShift.
        ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>
        
      2. Créez à nouveau votre déploiement dans le projet default Red 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.
    6. 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>
      
    7. 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.