¿Por qué las imágenes no se pueden extraer del registro con ImagePullBackOff o errores de autorización?

Nube privada virtual Infraestructura clásica

Cuando despliega una carga de trabajo que extrae una imagen de IBM Cloud Container Registry, sus pods fallan con el estado ImagePullBackOff.

oc get pods
NAME         READY     STATUS             RESTARTS   AGE
<pod_name>   0/1       ImagePullBackOff   0          2m

Cuando se describe el pod, se ven errores de autenticación similares a los siguientes.

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

Su clúster utiliza una clave API que se almacena en un secreto de extracción de imágenes para autorizar al clúster a extraer imágenes de IBM Cloud Container Registry, o la imagen con la etiqueta específica no existe en el repositorio.

De forma predeterminada, los nuevos clústeres tienen secretos de extracción de imágenes que utilizan claves de API para que el clúster pueda extraer imágenes de cualquier registro regional icr.io para contenedores desplegados en el proyecto default de Red Hat OpenShift.

  1. Verifique que utiliza el nombre y el código correctos de la imagen en el archivo YAML de despliegue.

    ibmcloud cr images
    
  2. Compruebe su tráfico de extracciones y cuota de almacenamiento. Si se alcanza el límite, libera almacenamiento utilizado o solicite al administrador del registro que aumente la cuota.

    ibmcloud cr quota
    
  3. Obtenga el archivo de configuración de pod de un pod que falla y busque la sección imagePullSecrets.

    oc get pod <pod_name> -o yaml
    

    Salida de ejemplo

    ...
    imagePullSecrets:
    - name: all-icr-io
    ...
    
  4. Si no se muestra ningún secreto de extracción de imágenes en la lista, configure el secreto de extracción de imágenes en el proyecto.

    1. Compruebe que el proyecto predeterminado default tiene secretos de extracción de imagen icr-io para cada registro regional que quiera utilizar. Si no se listan secretos de icr-io en el proyecto, utilice el mandato ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID> para crear los secretos de extracción de imágenes en el proyecto default.
      oc get secrets -n default | grep "icr-io"
      
    2. Copie el secreto de extracción de imágenes all-icr-io del proyecto default de Red Hat OpenShift en el proyecto en el que desea desplegar su carga de trabajo.
    3. Añada el secreto de extracción de imágenes a la cuenta de servicio de este proyecto Red Hat OpenShift para que todos los pods del proyecto puedan usar las credenciales de dicho secreto.
  5. Si los secretos de extracción de imágenes se listan en el pod, determine el tipo de credenciales que utiliza para acceder a IBM Cloud Container Registry.

Resolución de problemas de secretos de extracción de imágenes que utilizan claves de API

Si la configuración de pod tiene un secreto de extracción de imágenes que utiliza una clave de API, compruebe que las credenciales de clave de API se han configurado correctamente.

En los pasos siguientes se presupone que la clave de API almacena las credenciales de un ID de servicio. Si configura el secreto de extracción de imágenes de modo que utilice una clave de API de un usuario individual, debe verificar los permisos y las credenciales de IBM Cloud IAM de dicho usuario.

  1. Localice el ID de servicio que utiliza la clave de API para el secreto de extracción de imágenes en la Descripción. El ID de servicio que se crea con el clúster se denomina cluster-<cluster_ID> y se utiliza en el proyecto default Red Hat OpenShift. Si ha creado otro ID de servicio, como por ejemplo para acceder a otro proyecto de Red Hat OpenShift o para modificar los permisos de IBM Cloud IAM, ha personalizado la descripción.

    ibmcloud iam service-ids
    

    Salida de ejemplo

    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. Asegúrese de que el ID de servicio tenga asignado al menos una política de rol de acceso al servicio para IBM Cloud de IBM Cloud Container Registry IAM de Lector. Si el ID de servicio no tiene el rol de acceso al servicio de Lector, edite las políticas de IAM. Si las políticas son correctas, continúe con el paso siguiente para ver si las credenciales son válidas.

    ibmcloud iam service-policies <service_ID_name>
    

    Salida de ejemplo

    Policy ID:   a111a111-b22b-333c-d4dd-e555555555e5
    Roles:       Reader
    Resources:
                  Service Name       container-registry
                  Service Instance
                  Region
                  Resource Type      namespace
                  Resource           <registry_namespace>
    
  3. Compruebe si las credenciales del secreto de extracción de imágenes son válidas.

    1. Obtenga la configuración del secreto de extracción de imágenes. Si el pod no se encuentra en el proyecto « default », incluye la opción « -n ».

      oc get secret <image_pull_secret_name> -o yaml [-n <project>]
      
    2. En la salida, copie el valor codificado en base64 del campo .dockerconfigjson.

      apiVersion: v1
      kind: Secret
      data:
        .dockerconfigjson: eyJyZWdp...==
      ...
      
    3. Decodifique la serie base64. Por ejemplo, en OS X puede ejecutar el mandato siguiente.

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

      Salida de ejemplo

      {"auths":{"<region>.icr.io":{"username":"iamapikey","password":"<password_string>","email":"<name@abc.com>","auth":"<auth_string>"}}}
      
    4. Compare el nombre de dominio de registro regional del secreto de extracción de imágenes con el nombre de dominio que ha especificado en la imagen del contenedor. De forma predeterminada, los clústeres nuevos tienen secretos de extracción de imágenes para cada nombre de dominio de registro regional para los contenedores que se ejecutan en el proyecto default de Red Hat OpenShift. Sin embargo, si ha modificado los valores predeterminados o si está utilizando un proyecto de Red Hat OpenShift distinto, es posible que no tenga un secreto de extracción de imágenes para el registro regional. Copie un secreto de extracción de imágenes para el nombre de dominio de registro regional.

    5. Inicie una sesión en el registro desde la máquina local utilizando los valores de username y password del secreto de extracción de imágenes. Si no puede iniciar una sesión, es posible que tenga que arreglar el ID de servicio.

      docker login -u iamapikey -p <password_string> <region>.icr.io
      
      1. Vuelva a crear el ID de servicio de clúster, las políticas de IBM Cloud IAM, la clave de API y los secretos de extracción de imágenes para contenedores que se ejecuten en el proyecto default de Red Hat OpenShift.
        ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>
        
      2. Vuelva a crear el despliegue en el proyecto default de Red Hat OpenShift. Si sigue viendo un mensaje de error de autorización, repita los pasos 1-5 con los nuevos secretos de extracción de imágenes. Si todavía no puede iniciar una sesión, abra un caso de soporte de IBM Cloud.
    6. Si inicia la sesión correctamente, extraiga una imagen localmente. Si el mandato falla con un error de access denied, la cuenta de registro se encuentra en una cuenta de IBM Cloud distinta de la cuenta en el que se encuentra el clúster. Cree un secreto de extracción de imágenes para acceder a imágenes de otra cuenta. Si puedes descargar una imagen en tu equipo local, significa que tu clave API tiene los permisos correctos, pero que la configuración de la API en tu clúster no es la adecuada.

      docker pull <region>icr.io/<namespace>/<image>:<tag>
      
    7. Compruebe que el secreto de extracción esté referenciado directamente desde el despliegue o desde la cuenta de servicio usada por el despliegue. Si sigue sin poder resolver el problema, póngase en contacto con el servicio de soporte.