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.

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

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

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 verfügen neue Cluster über 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 default Red Hat OpenShift-Projekt bereitgestellt werden.

  1. Stellen Sie sicher, dass Sie den richtigen Namen und den richtigen Tag des Image in Ihrer YAML-Bereitstellungsdatei verwenden.

    ibmcloud cr images
    
  2. 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
    
  3. 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).

    oc get pod <pod_name> -o yaml
    

    Beispielausgabe

    ...
    imagePullSecrets:
    - name: all-icr-io
    ...
    
  4. Wenn keine geheimen Schlüssel für Image-Pull-Operationen aufgelistet werden, richten Sie einen solchen in Ihrem Projekt ein.

    1. Überprüfen Sie, ob das Projekt default für jedes regionale Registry, das verwendet werden soll, über geheime Schlüssel für Image-Pull-Operationen vom Typ icr-io verfügt. Wenn keine geheimen icr-io-Schlüssel im Projekt aufgelistet sind, verwenden Sie den Befehl ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>, um die geheimen Schlüssel für Image-Pull-Operationen im default-Projekt zu erstellen.
      oc get secrets -n default | grep "icr-io"
      
    2. Kopieren Sie den geheimen Schlüssel für die Pull-Operation all-icr-io aus dem defaultRed Hat OpenShift-Projekt in das Projekt, in dem Sie Ihre Arbeitslast bereitstellen möchten.
    3. Fügen Sie den geheimen Schlüssel für Image-Pull-Operationen dem Servicekonto für dieses Red Hat OpenShift-Projekt hinzu, sodass alle Pods in dem Projekt die Berechtigungsnachweise des geheimen Schlüssels für Image-Pull-Operationen verwenden können.
  5. 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.

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.

  1. 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 mit dem Cluster erstellte Service-ID hat den Namen cluster-<cluster_ID> und wird im default Red Hat OpenShift-Projekt verwendet. Wenn Sie eine andere Service-ID erstellt haben, z. B. um auf ein anderes Red Hat OpenShift-Projekt zuzugreifen oder um IBM Cloud IAM-Berechtigungen zu ändern, 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 <project>                                                                                                                                         false
    
  2. 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>
    
  3. Prüfen Sie, ob die Berechtigungsnachweise des geheimen Schlüssels für Image-Pull-Operationen gültig sind.

    1. Rufen Sie die Konfiguration des geheimen Schlüssels für Image-Pull-Operationen ab. Falls sich der Pod nicht im Projekt „ default “ befindet, fügen Sie die Option „ -n “ hinzu.

      oc get secret <image_pull_secret_name> -o yaml [-n <project>]
      
    2. Kopieren Sie in der Ausgabe den base64-codierten Wert des Felds .dockerconfigjson.

      apiVersion: v1
      kind: Secret
      data:
        .dockerconfigjson: eyJyZWdp...==
      ...
      
    3. 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>"}}}
      
    4. 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 verfügen neue Cluster über geheime Schlüssel für Image-Pull-Operationen für jeden Domänennamen der regionalen Registry für Container, die im default Red Hat OpenShift-Projekt ausgeführt werden. Wenn Sie die Standardeinstellungen jedoch geändert haben oder ein anderes Red Hat OpenShift-Projekt verwenden, verfügen Sie möglicherweise nicht über einen 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.

    5. Melden Sie sich von Ihrem lokalen System aus bei der Registry mit den Werten für username und password 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
      
      1. Erstellen Sie die Cluster-Service-ID, IBM Cloud IAM-Richtlinien, den API-Schlüssel und die geheimen Schlüssel für Image-Pull-Operationen für Container, die im default Red Hat OpenShift-Projekt ausgeführt werden, erneut.
        ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>
        
      2. Erstellen Sie Ihre Bereitstellung im default Red Hat OpenShift-Projekt erneut. 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.
    6. 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>
      
    7. Ü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.