¿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.
-
Verifique que utiliza el nombre y el código correctos de la imagen en el archivo YAML de despliegue.
ibmcloud cr images -
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 -
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 yamlSalida de ejemplo
... imagePullSecrets: - name: all-icr-io ... -
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.
- Compruebe que el espacio de nombres predeterminado
defaulttiene secretos de extracción de imagenicr-iopara cada registro regional que quiera utilizar. Si no se lista ningún secreto deicr-ioen el espacio de nombres, utilice el mandatoibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>para crear los secretos de extracción de imágenes en el espacio de nombresdefault.kubectl get secrets -n default | grep "icr-io" - Copie el secreto de extracción de imágenes
all-icr-iodel espacio de nombres de Kubernetesdefaulten el espacio de nombres en el que desea desplegar la carga de trabajo. - 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.
- Compruebe que el espacio de nombres predeterminado
-
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.
- Si el nombre del secreto contiene
icr, significa que utiliza una clave de API para autenticarse con los nombres de dominioicr.io. Continúe en el apartado Resolución de problemas de secretos de extracción de imágenes que utilizan claves de API. - Si tiene ambos tipos de secretos, utilice los dos métodos de autenticación. Utilice los nombres de dominio
icr.ioen los archivos YAML de despliegue correspondientes a la imagen de contenedor. Continúe en el apartado Resolución de problemas de secretos de extracción de imágenes que utilizan claves de API.
- Si el nombre del secreto contiene
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.
-
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 nombresdefaultde 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-idsSalida 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 -
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> -
Compruebe si las credenciales del secreto de extracción de imágenes son válidas.
-
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>] -
En la salida, copie el valor codificado en base64 del campo
.dockerconfigjson.apiVersion: v1 kind: Secret data: .dockerconfigjson: eyJyZWdp...== ... -
Decodifique la serie base64. Por ejemplo, en OS X puede ejecutar el mandato siguiente.
echo -n "<base64_string>" | base64 --decodeSalida de ejemplo
{"auths":{"<region>.icr.io":{"username":"iamapikey","password":"<password_string>","email":"<name@abc.com>","auth":"<auth_string>"}}} -
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
defaultde 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. -
Inicie una sesión en el registro desde la máquina local utilizando los valores de
usernameypassworddel 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- 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
defaultde Kubernetes.ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID> - 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.
- 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
-
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> -
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.
-