Warum schlägt das Extrahieren von Images aus der Registry mit ImagePullBackOff- oder Berechtigungsfehlern fehl?
Virtuelle 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 "<image>:<tag>" ... Manifest for <image>:<tag> not found
Ihr Cluster verwendet einen API-Schlüssel, der in einem Bildabrufgeheimnis gespeichert ist, um den Cluster zu autorisieren, Bilder von IBM Cloud Container Registry abzurufen, oder das Bild mit dem spezifischen 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 yamlBeispielausgabe
... 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
defaultfür jedes regionale Registry, das verwendet werden soll, über geheime Schlüssel für Image-Pull-Operationen vom Typicr-ioverfü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-ioaus dem Kubernetes-Namensbereichdefaultin 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
icrin seinem Namen enthält, verwenden Sie einen API-Schlüssel, um sich mit den Domänennamenicr.iozu 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.ioin 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 imdefaultKubernetes-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-idsBeispielausgabe
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. Befindet sich der Pod nicht im Namespace „
default“, fügen Sie die Option „-n“ hinzu.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 --decodeBeispielausgabe
{"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
defaultausgefü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
usernameundpasswordaus 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
defaultausgeführt werden.ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID> - Erstellen Sie Ihre Bereitstellung im Kubernetes-Namensbereich
defaultneu. 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 Bild auf Ihren lokalen Rechner herunterladen können, verfügt Ihr API-Schlüssel über 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.
-