¿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.

kubectl 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.

kubectl 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 espacio de nombres default de Kubernetes.

  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.

    kubectl 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 espacio de nombres.

    1. Compruebe que el espacio de nombres predeterminado default tiene secretos de extracción de imagen icr-io para cada registro regional que quiera utilizar. Si no se lista ningún secreto de icr-io en el espacio de nombres, utilice el mandato ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID> para crear los secretos de extracción de imágenes en el espacio de nombres default.
      kubectl get secrets -n default | grep "icr-io"
      
    2. Copie el secreto de extracción de imágenes all-icr-io del espacio de nombres de Kubernetes default en el espacio de nombres en el que desea desplegar la carga de trabajo.
    3. Añada el secreto de extracción de imágenes a la cuenta de servicio para este espacio de nombres de Kubernetes para que todos los pods del espacio de nombres puedan utilizar las credenciales secretas de obtención de imágenes.
  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 espacio de nombres default de Kubernetes. Si ha creado otro ID de servicio, como por ejemplo para acceder a otro espacio de nombres de Kubernetes 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 <namespace>                                                                                                                                         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 espacio de nombres default, incluye la opción -n.

      kubectl get secret <image_pull_secret_name> -o yaml [-n <namespace>]
      
    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 espacio de nombres default de Kubernetes. Sin embargo, si ha modificado los valores predeterminados o si está utilizando un espacio de nombres de Kubernetes 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 espacio de nombres default de Kubernetes.
        ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>
        
      2. Vuelva a crear el despliegue en el espacio de nombres de Kubernetes default. 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 a 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.