Warum schlägt das Extrahieren von Images aus der Registry mit ImagePullBackOff
- oder Berechtigungsfehlern fehl?
Virtual Private Cloud Klassische Infrastruktur
Wenn Sie eine Workload bereitstellen, die ein Image aus IBM Cloud Container Registry extrahiert, tritt für Ihren Pod ein Fehler mit dem Status ImagePullBackOff
auf.
kubectl get pods
NAME READY STATUS RESTARTS AGE
<pod_name> 0/1 ImagePullBackOff 0 2m
Wenn Sie den Pod beschreiben, empfangen Sie Authentifizierungsfehler ähnlich den folgenden.
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 "registry.ng.bluemix.net/<namespace>/<image>:<tag>" ... unauthorized: authentication required
Failed to pull image "registry.ng.bluemix.net/<namespace>/<image>:<tag>" ... 401 Unauthorized
...
Failed to pull image "<image>:<tag>" ... Manifest for <image>:<tag> not found
Ihr Cluster verwendet einen API-Schlüssel, der in einem geheimen Schlüssel für Image-Pull-Operationen gespeichert ist, um den Cluster zu berechtigen, Images aus IBM Cloud Container Registryzu extrahieren, oder das Image mit dem bestimmten Tag ist im Repository nicht vorhanden.
Standardmäßig haben neue Cluster geheime Schlüssel für Image-Pull-Operationen, die API-Schlüssel verwenden, sodass der Cluster Images aus einer beliebigen regionalen icr.io
-Registry für Container extrahieren kann, die im Kubernetes-Namensbereich
default
bereitgestellt wurden.
-
Stellen Sie sicher, dass Sie den richtigen Namen und den richtigen Tag des Image in Ihrer YAML-Bereitstellungsdatei verwenden.
ibmcloud cr images
-
Prüfen Sie Ihre Kontingente für Speicher und Pull-Datenverkehr. Wenn der Grenzwert erreicht ist, können Sie den belegten Speicher freigeben oder Ihren Registry-Administrator bitten, das Kontingent zu erhöhen.
ibmcloud cr quota
-
Rufen Sie die Podkonfigurationsdatei für einen fehlerhaften Pod ab und suchen Sie nach dem Abschnitt für geheime Schlüssel für Image-Pull-Operationen (
imagePullSecrets
).kubectl get pod <pod_name> -o yaml
Beispielausgabe
... imagePullSecrets: - name: all-icr-io ...
-
Wenn keine geheimen Schlüssel für Image-Pull-Operationen aufgelistet werden, richten Sie einen solchen in Ihrem Namensbereich ein.
- Überprüfen Sie, ob der Namensbereich
default
für jedes regionale Registry, das verwendet werden soll, über geheime Schlüssel für Image-Pull-Operationen vom Typicr-io
verfügt. Wenn keine geheimenicr-io
-Schlüssel im Namensbereich aufgelistet sind, verwenden Sie den Befehlibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>
zum Erstellen der geheimen Schlüssel für Image-Pull-Operationen im Namensbereichdefault
.kubectl get secrets -n default | grep "icr-io"
- Kopieren Sie den geheimen Schlüssel für Image-Pull-Operationen
all-icr-io
aus dem Kubernetes-Namensbereichdefault
in den Namensbereich, in dem Sie Ihre Workload bereitstellen wollen. - Fügen Sie den geheimen Schlüssel für Image-Pull-Operationen dem Servicekonto für diesen Kubernetes-Namensbereich hinzu, sodass alle Pods in dem Namensbereich die Berechtigungsnachweise des geheimen Schlüssels für Image-Pull-Operationen verwenden können.
- Überprüfen Sie, ob der Namensbereich
-
Wenn im Pod geheime Schlüssel für Image-Pull-Operationen aufgelistet sind, dann ermitteln Sie, welchen Typ von Berechtigungsnachweisen Sie für den Zugriff auf IBM Cloud Container Registry verwenden.
- Wenn der geheime Schlüssel
icr
in seinem Namen enthält, verwenden Sie einen API-Schlüssel, um sich mit den Domänennamenicr.io
zu authentifizieren. Fahren Sie mit dem Abschnitt Fehlerbehebung für geheime Schlüssel für Image-Pull-Operationen, die API-Schlüssel verwenden fort. - Wenn Sie beide Typen von geheimen Schlüsseln haben, verwenden Sie beide Authentifizierungsmethoden. Verwenden Sie in Zukunft die Domänennamen
icr.io
in Ihren YAML-Bereitstellungsdateien für das Container-Image. Fahren Sie mit dem Abschnitt Fehlerbehebung für geheime Schlüssel für Image-Pull-Operationen, die API-Schlüssel verwenden fort.
- Wenn der geheime Schlüssel
Fehlerbehebung für geheime Schlüssel für Image-Pull-Operationen, die API-Schlüssel verwenden
Wenn Ihre Podkonfiguration einen geheimen Schlüssel für Image-Pull-Operationen hat, der einen API-Schlüssel verwendet, überprüfen Sie, ob die Berechtigungsnachweise des API-Schlüssels korrekt festgelegt sind.
In den folgenden Schritten wird davon ausgegangen, dass der API-Schlüssel die Berechtigungsnachweise für eine Service-ID speichert. Wenn Sie Ihren geheimen Schlüssel für Image-Pull-Operationen so eingerichtet haben, dass er einen API-Schlüssel eines einzelnen Benutzers verwendet, müssen Sie die IBM Cloud IAM-Berechtigungen und Berechtigungsnachweise dieses Benutzers überprüfen.
-
Suchen Sie die Service-ID, die der API-Schlüssel für den geheimen Schlüssel für Image-Pull-Operationen verwendet, indem Sie die Beschreibung (Description) prüfen. Die Service-ID, die mit dem Cluster erstellt wird, heißt
cluster-<cluster_ID>
und wird imdefault
Kubernetes-Namespace verwendet. Falls Sie eine andere Service-ID zum Beispiel für den Zugriff auf einen anderen Kubernetes-Namensbereich oder zum Ändern der IBM Cloud IAM-Berechtigungen erstellt haben, haben Sie die Beschreibung angepasst.ibmcloud iam service-ids
Beispielausgabe
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
-
Stellen Sie sicher, dass der Service-ID mindestens eine IBM Cloud-Richtlinie für die IBM Cloud Container Registry IAM-Servicezugriffsrolle Leseberechtigter zugewiesen ist. Wenn die Service-ID nicht die Servicezugriffsrolle Leseberechtigter (Reader) hat, bearbeiten Sie die IAM-Richtlinien. Wenn die Richtlinien korrekt sind, fahren Sie mit dem nächsten Schritt fort, um zu prüfen, ob die Berechtigungsnachweise gültig sind.
ibmcloud iam service-policies <service_ID_name>
Beispielausgabe
Policy ID: a111a111-b22b-333c-d4dd-e555555555e5 Roles: Reader Resources: Service Name container-registry Service Instance Region Resource Type namespace Resource <registry_namespace>
-
Prüfen Sie, ob die Berechtigungsnachweise des geheimen Schlüssels für Image-Pull-Operationen gültig sind.
-
Rufen Sie die Konfiguration des geheimen Schlüssels für Image-Pull-Operationen ab. Wenn sich der Pod nicht im Namensbereich
default
befindet, schließen Sie die Option-n
ein.kubectl get secret <image_pull_secret_name> -o yaml [-n <namespace>]
-
Kopieren Sie in der Ausgabe den base64-codierten Wert des Felds
.dockerconfigjson
.apiVersion: v1 kind: Secret data: .dockerconfigjson: eyJyZWdp...== ...
-
Decodieren Sie die Base64-Zeichenfolge. Beispiel: Unter OS X können Sie den folgenden Befehl ausführen.
echo -n "<base64_string>" | base64 --decode
Beispielausgabe
{"auths":{"<region>.icr.io":{"username":"iamapikey","password":"<password_string>","email":"<name@abc.com>","auth":"<auth_string>"}}}
-
Vergleichen Sie den Domänennamen aus der regionalen Registry des geheimen Schlüssels für Image-Pull-Operationen mit dem Domänennamen, den Sie im Container-Image angegeben haben. Standardmäßig haben neue Cluster geheime Schlüssel für Image-Pull-Operationen für jeden Domänennamen in der regionalen Registry für Container, die im Kubernetes-Namensbereich
default
ausgeführt werden. Wenn Sie die Standardeinstellungen jedoch geändert haben oder einen anderen Kubernetes-Namensbereich verwenden, haben Sie möglicherweise keinen geheimen Schlüssel für Image-Pull-Operationen für die regionale Registry. Kopieren Sie einen geheimen Schlüssel für Image-Pull-Operationen für den Domänennamen in der regionalen Registry. -
Melden Sie sich von Ihrem lokalen System aus bei der Registry mit den Werten für
username
undpassword
aus Ihrem geheimen Schlüssel für Image-Pull-Operationen an. Wenn Sie sich nicht anmelden können, müssen Sie möglicherweise die Service-ID korrigieren.docker login -u iamapikey -p <password_string> <region>.icr.io
- Erstellen Sie die Cluster-Service-ID, die IBM Cloud IAM-Richtlinien, den API-Schlüssel und die geheimen Schlüssel für Image-Pull-Operationen für Container neu, die im Kubernetes-Namensbereich
default
ausgeführt werden.ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>
- Erstellen Sie Ihre Bereitstellung im Kubernetes-Namensbereich
default
neu. Wenn weiterhin eine Berechtigungsfehlernachricht angezeigt wird, wiederholen Sie die Schritte 1 bis 5 mit den neuen geheimen Schlüsseln für Image-Pull-Operationen. Wenn Sie sich immer noch nicht anmelden können, öffnen Sie einen IBM Cloud-Supportfall.
- Erstellen Sie die Cluster-Service-ID, die IBM Cloud IAM-Richtlinien, den API-Schlüssel und die geheimen Schlüssel für Image-Pull-Operationen für Container neu, die im Kubernetes-Namensbereich
-
Wenn die Anmeldung erfolgreich ist, extrahieren Sie ein Image auf Ihre lokale Maschine. Schlägt der Befehl mit einem Fehler 'Zugriff verweigert' (
access denied
) fehl, handelt es sich bei dem Registry-Konto um ein anderes IBM Cloud-Konto als das, in dem sich Ihr Cluster befindet. Erstellen Sie einen geheimen Schlüssel für Image-Pull-Operationen (imagePullSecret), um auf Images in dem anderen Konto zuzugreifen. Wenn Sie ein Image auf Ihre lokale Maschine extrahieren können, hat Ihr API-Schlüssel die richtigen Berechtigungen, aber die API-Konfiguration in Ihrem Cluster ist nicht korrekt.docker pull <region>icr.io/<namespace>/<image>:<tag>
-
Überprüfen Sie, ob der geheime Schlüssel für die Pull-Operation entweder direkt von der Bereitstellung oder von dem Servicekonto, das die Bereitstellung verwendet, referenziert wird. Wenn Sie das Problem immer noch nicht lösen können, wenden Sie sich an den Support.
-