Perché le immagini non riescono a eseguire il pull dal registro con ImagePullBackOff o errori di autorizzazione?
Virtual Private Cloud Infrastruttura classica
Quando distribuisci un carico di lavoro che segue il pull di un'immagine da IBM Cloud Container Registry, si verifica un malfunzionamento dei tuoi pod con lo stato ImagePullBackOff.
oc get pods
NAME READY STATUS RESTARTS AGE
<pod_name> 0/1 ImagePullBackOff 0 2m
Quando descrivi il pod, vedi degli errori di autenticazione simili al seguente:
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
Il cluster utilizza una chiave API memorizzata in un segreto di estrazione delle immagini per autorizzare il cluster a estrarre le immagini da IBM Cloud Container Registry, oppure l'immagine con il tag specifico non esiste nel repository.
Per impostazione predefinita, i nuovi cluster dispongono di secret per il download delle immagini che utilizzano chiavi API, in modo che il cluster possa scaricare immagini da qualsiasi registro regionale icr.io per i container distribuiti
nel progetto default Red Hat OpenShift.
-
Verifica di utilizzare il nome e la tag corretti dell'immagine nel tuo file YAML di distribuzione.
ibmcloud cr images -
Consulta il traffico di pull e la quota di archiviazione. Se viene raggiunto il limite, libera spazio di archiviazione utilizzato o chiedi al tuo amministratore del registro di aumentare la quota.
ibmcloud cr quota -
Ottieni il file di configurazione di un pod in errore e cerca la sezione
imagePullSecrets.oc get pod <pod_name> -o yamlOutput di esempio
... imagePullSecrets: - name: all-icr-io ... -
Se non è elencato alcun segreto di pull dell'immagine, eseguine la configurazione nel tuo progetto.
- Verifica che il progetto
defaultdisponga di segreti di pull dell'immagineicr-ioper ogni registro regionale che vuoi utilizzare. Se nel progetto non sono presenti segreti relativi a "icr-io", visita utilizza il comandoibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>per creare i segreti necessari per il pull dell'immagine nel progettodefault.oc get secrets -n default | grep "icr-io" - Copia il segreto di recupero delle immagini "
all-icr-io" dal progetto "default"(Red Hat OpenShift)nel progetto in cui desideri distribuire il tuo carico di lavoro. - Aggiungi il segreto per il download delle immagini all'account di servizio di questo progetto Red Hat OpenShift, in modo che tutti i pod del progetto possano utilizzare le credenziali del segreto per il download delle immagini.
- Verifica che il progetto
-
Se i segreti di pull dell'immagine sono elencati nel pod, determina quale tipo di credenziali utilizzi per accedere a IBM Cloud Container Registry.
- Se il segreto ha
icrnel nome, utilizzi una chiave API per eseguire l'autenticazione con i nomi dominioicr.io. Continua con Risoluzione dei problemi dei segreti di pull dell'immagine che utilizzano chiavi API. - Se hai entrambi i tipi di segreti, utilizzi entrambi i metodi di autenticazione. Andando avanti, utilizza i nomi dominio
icr.ionei tuoi YAML di distribuzione per l'immagine del contenitore. Continua con Risoluzione dei problemi dei segreti di pull dell'immagine che utilizzano chiavi API.
- Se il segreto ha
Risoluzione dei problemi relativi ai segreti per il recupero delle immagini che utilizzano chiavi API
Se la tua configurazione dl pod ha un segreto di pull dell'immagine che utilizza una chiave API, controlla che le credenziali di chiave API siano configurate correttamente.
La seguente procedura presume che la chiave API memorizzi le credenziali di un ID servizio. Se configuri il tuo segreto di pull dell'immagine per utilizzare una chiave API di un singolo utente, devi verificare le credenziali e le autorizzazioni IBM Cloud IAM di tale utente.
-
Trova l'ID servizio utilizzato dalla chiave API per il segreto di pull dell'immagine esaminando la descrizione (Description). L'ID del servizio creato con il cluster si chiama "
cluster-<cluster_ID>" e viene utilizzato nel progetto "default" Red Hat OpenShift. Se hai creato un altro ID di servizio, ad esempio per accedere a un altro progetto Red Hat OpenShift o per modificare le autorizzazioni IAM di IBM Cloud, hai personalizzato la descrizione.ibmcloud iam service-idsOutput di esempio
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 -
Verifica che all'ID servizio sia assegnato almeno una politica di ruolo di accesso al servizio per IBM Cloud di Lettore di IBM Cloud Container Registry IAM. Se l'ID del servizio non dispone del ruolo di accesso al servizio Reader, modificare le politiche IAM. Se le politiche sono corrette, continua con il passo successivo per appurare se le credenziali sono valide.
ibmcloud iam service-policies <service_ID_name>Output di esempio
Policy ID: a111a111-b22b-333c-d4dd-e555555555e5 Roles: Reader Resources: Service Name container-registry Service Instance Region Resource Type namespace Resource <registry_namespace> -
Controlla se le credenziali del segreto di pull dell'immagine sono valide.
-
Ottieni la configurazione del segreto di pull dell'immagine. Se il pod non si trova nel progetto
default, includere l'opzione-n.oc get secret <image_pull_secret_name> -o yaml [-n <project>] -
Nell'output, copia il valore con codifica base64 del campo
.dockerconfigjson.apiVersion: v1 kind: Secret data: .dockerconfigjson: eyJyZWdp...== ... -
Decodifica la stringa base64. Ad esempio, su OS X puoi eseguire il seguente comando.
echo -n "<base64_string>" | base64 --decodeOutput di esempio
{"auths":{"<region>.icr.io":{"username":"iamapikey","password":"<password_string>","email":"<name@abc.com>","auth":"<auth_string>"}}} -
Confronta il nome dominio del registro regionale del segreto di pull dell'immagine con il nome dominio che hai specificato nell'immagine del contenitore. Per impostazione predefinita, i nuovi cluster dispongono di secret per il download delle immagini per ciascun nome di dominio del registro regionale per i container in esecuzione nel progetto
defaultRed Hat OpenShift. Tuttavia, se hai modificato le impostazioni predefinite o stai utilizzando un progetto " Red Hat OpenShift " diverso, potresti non disporre di un segreto per il download delle immagini dal registro regionale. Copia un segreto di pull dell'immagine per il nome dominio del registro regionale. -
Esegui l'accesso al registro dalla tua macchina locale utilizzando
usernameepassworddal tuo segreto di pull dell'immagine. Se non riesci ad accedere, potrebbe essere necessario correggere l'ID del servizio.docker login -u iamapikey -p <password_string> <region>.icr.io- Ricrea l'ID del servizio cluster, IBM Cloud le politiche IAM, la chiave API e i segreti per il download delle immagini per i container in esecuzione nel progetto
defaultRed Hat OpenShift.ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID> - Ricrea la tua distribuzione nel progetto "
default" Red Hat OpenShift. Se continui a vedere un messaggio di errore di autorizzazione, ripeti i passi da 1 a 5 con i nuovi segreti di pull dell'immagine. Se ancora non riesci ad accedere, apri un caso di supporto IBM Cloud.
- Ricrea l'ID del servizio cluster, IBM Cloud le politiche IAM, la chiave API e i segreti per il download delle immagini per i container in esecuzione nel progetto
-
Se l'accesso riesce, esegui il pull di un'immagine localmente. Se il comando non riesce con un errore
access denied, l'account del registro si trova in un account IBM Cloud differente da quello in cui si trova il tuo cluster. Crea un segreto di pull dell'immagine per accedere alle immagini nell'altro account. Se riesci a scaricare un'immagine sul tuo computer locale, significa che la tua chiave API dispone delle autorizzazioni corrette, ma la configurazione dell'API nel tuo cluster non è corretta.docker pull <region>icr.io/<namespace>/<image>:<tag> -
Verifica che al segreto di pull si faccia riferimento direttamente dalla distribuzione o dall'account di servizi utilizzato dalla distribuzione. Se ancora non riesci a risolvere il problema, contatta il supporto.
-