IBM Cloud Docs
Image-Registry einrichten

Image-Registry einrichten

Planen und richten Sie eine Image-Registry ein, damit Entwickler mithilfe von Docker-Images App-Container in IBM Cloud® Kubernetes Service erstellen können.

Image-Registrys planen

Images werden typischerweise in einer Registry gespeichert, die entweder öffentlich zugänglich ist (öffentliche Registry) oder mit eingeschränktem Zugriff für eine kleine Benutzergruppen eingerichtet ist (private Registry).

Öffentliche Registrys wie Docker Hub sind gut dafür geeignet, sich mit Docker und Kubernetes vertraut zu machen und die erste containerisierte App in einem Cluster zu erstellen. Was Unternehmensanwendungen betrifft, so sollten Sie jedoch eine private Registry, wie z. B. die von IBM Cloud Container Registry bereitgestellte Registry, verwenden, um zu verhindern, dass Ihre Images durch nicht berechtigte Benutzer verwendet oder unbefugt Änderungen an ihnen vorgenommen werden. Private Registrys müssen vom Clusteradministrator eingerichtet werden, damit sichergestellt ist, dass die Berechtigungsnachweise für den Zugriff auf die private Registry den Clusterbenutzern zur Verfügung stehen.

Für die Bereitstellung Ihrer Apps im Cluster können Sie mehrere Registrys mit IBM Cloud Kubernetes Service verwenden.

Optionen für öffentliche und private Image-Registrys
Registry Beschreibung Nutzen
IBM Cloud Container Registry Mit dieser Option können Sie Ihr eigenes geschütztes Docker-Image-Repository in IBM Cloud Container Registry einrichten, in dem Sie Images sicher speichern und gemeinsam mit den Clusterbenutzern nutzen können.
  • Verwalten Sie den Zugriff auf Images in Ihrem Konto.
  • Verwenden Sie die von IBM bereitgestellten Images und Beispiel-Apps (z. B. IBM Liberty) als übergeordnetes Image und fügen Sie eigenen App-Code hinzu.
  • Automatisches Scannen von Images auf potenzielle Schwachstellen durch Vulnerability Advisor, einschließlich betriebssystemspezifischer Empfehlungen zur Behebung.
Jede andere private Registry Verbinden Sie jedes vorhandene private Register mit Ihrem Cluster, indem Sie ein geheimes Bildabrufverfahren erstellen. Dieser dient dazu, die URL zur Ihrer Registry und die Berechtigungsnachweise sicher in einem geheimen Kubernetes-Schlüssel zu speichern. Ermöglicht die Verwendung vorhandener privater Registrys unabhängig von ihrer jeweiligen Quelle (Docker Hub, organisationseigene Registrys oder andere private Cloud-Registrys).
Öffentliche Docker Hub-Registry Verwenden Sie diese Option, um vorhandene öffentliche Bilder von Docker Hub direkt in Ihrer Kubernetes-Bereitstellung zu verwenden, wenn keine Änderungen an der Docker-Datei erforderlich sind. Hinweis: Berücksichtigen Sie, dass diese Option möglicherweise den Sicherheitsanforderungen Ihrer Organisation (wie beispielsweise bei der Zugriffsverwaltung, der Ermittlung von Sicherheitslücken oder der Vertraulichkeit von App-Daten) nicht entspricht.

Für Ihren Cluster sind keine zusätzlichen Konfigurationsschritte erforderlich.

  • Enthält eine Vielzahl von Open-Source-Anwendungen.

Nachdem Sie eine Image-Registry eingerichtet haben, können Clusterbenutzer diese Images zur Bereitstellung ihrer Apps im Cluster verwenden.

Erfahren Sie mehr über das Sichern der persönlichen Daten bei der Arbeit mit Container-Images.

Informationen zur Autorisierung Ihres Clusters zum Extrahieren von Images aus einer privaten Registry

Zum Extrahieren von Images aus einer Registry verwendet der IBM Cloud Kubernetes Service-Cluster einen speziellen Typ eines geheimen Kubernetes-Schlüssels, einen geheimen Schlüssel für Image-Pull-Operationen (imagePullSecret). In diesem geheimen Schlüssel für Image-Pull-Operationen werden die Berechtigungsnachweise für den Zugriff auf eine Container-Registry gespeichert.

Bei der Container-Registry kann es sich um Folgendes handeln:

  • Ein privater Namensbereich in Ihrer eigenen Instanz von IBM Cloud Container Registry.
  • Ein privater Namensbereich in IBM Cloud Container Registry, der zu einem anderen IBM Cloud-Konto gehört.
  • Eine beliebige andere private Registry wie beispielsweise Docker.

Ihr Cluster ist standardmäßig jedoch so konfiguriert, dass er Images nur aus den in Ihrem Konto vorhandenen Namensbereichen in IBM Cloud Container Registry extrahiert und Container aus diesen Images im Kubernetes-Namensbereich (default) in Ihrem Cluster bereitstellt. Wenn Sie Images in andere Namensbereiche des Clusters oder aus anderen Container-Registrys extrahieren müssen, müssen Sie einen eigenen geheimen Schlüssel für Image-Pull-Operationen einrichten.

Standardeinrichtung eines geheimen Schlüssels für Image-Pull-Operationen

Im Allgemeinen ist Ihr IBM Cloud Kubernetes Service-Cluster so konfiguriert, dass Images aus allen icr.io-Domänen in IBM Cloud Container Registry nur aus dem Kubernetes-Namensbereich default extrahiert werden. Lesen Sie die folgenden FAQ, um mehr darüber zu erfahren, wie Sie Bilder in anderen Kubernetes-Namespaces oder -Konten abrufen, den Abrufzugriff einschränken oder warum Ihr Cluster möglicherweise nicht über die Standardgeheimnisse für den Bildabruf verfügt.

Wie ist mein Cluster eingerichtet, um Bilder aus dem default Kubernetes-Namensraum abzurufen?
Wenn Sie einen Cluster erstellen, hat der Cluster eine IBM Cloud IAM-Service-ID, der eine Richtlinie für die IAM-Servicezugriffsrolle Leseberechtigter für IBM Cloud Container Registry zugeordnet wird. Die Service-ID-Berechtigungsnachweise werden als Identität durch einen nicht ablaufenden API-Schlüssel dargestellt, der in geheimen Schlüsseln für Image-Pull-Operationen (imagePullSecrets) in Ihrem Cluster gespeichert wird. Die geheimen Schlüssel für Pull-Operationen werden zum Kubernetes-Namensbereich default und zur Liste der geheimen Schlüssel im Servicekonto default für diesen Kubernetes-Namensbereich hinzugefügt. Durch die Verwendung von geheimen Schlüsseln für Image-Pull-Operationen können Ihre Bereitstellungen Images (nur Lesezugriff) aus der globalen und regionalen IBM Cloud Container Registry-Instanz extrahieren, um Container im Kubernetes-Namensbereich default bereitzustellen.
  • Die globale Registry speichert in sicherer Weise öffentliche Images, die von IBM zur Verfügung gestellt werden. Sie können auf diese öffentlichen Images in allen Ihren Bereitstellungen verweisen, sodass es nicht notwendig ist, unterschiedliche Verweise für Images zu verwenden, die in den einzelnen regionalen Registrys gespeichert sind.
  • Die regionale Registry dient der sicheren Speicherung Ihrer eigenen privaten Docker-Images.
Was ist, wenn ich keine Geheimnisse für die Bildauswahl im Namensraum default Kubernetes habe?
Sie können das Vorhandensein geheimer Schlüssel für Image-Pull-Operationen überprüfen, indem Sie sich bei Ihrem Cluster anmelden und den Befehl kubectl get secrets -n default | grep "icr-io" ausführen. Wenn keine geheimen icr-Schlüssel aufgelistet werden, verfügte die Person, die den Cluster erstellt hat, möglicherweise nicht über die erforderlichen Berechtigungen für IBM Cloud Container Registry in IAM. Siehe Vorhandene Cluster zur Verwendung von API-Schlüsseln in geheimen Schlüsseln für Image-Pull-Operationen aktualisieren.
Kann ich den Zugriff auf ein bestimmtes regionales Register beschränken?
Ja, Sie können die vorhandene IAM-Richtlinie der Service-ID bearbeiten, die die Zugriffsrolle den Leser -Service auf diese regionale Registry oder eine Registry-Ressource, wie z. B. einen Namespace, beschränkt. Bevor Sie Registry-IAM-Richtlinien anpassen können, müssen Sie IBM Cloud IAM-Richtlinien für IBM Cloud Container Registry aktivieren.

Möchten Sie Ihre Registry-Berechtigungsnachweise noch sicherer machen? Fragen Sie Ihren Cluster-Administrator, einen Schlüsselmanagementservice-Anbieter in Ihrem Cluster zu aktivieren, um geheime Kubernetes-Schlüssel in Ihrem Cluster zu verschlüsseln, z. B. den geheimen Image-Pull-Schlüssel, der die Berechtigungsnachweise ihrer Registry speichert.

Kann ich Bilder aus einem anderen Kubernetes-Namensraum als default abrufen?
Standardmäßig nicht. Unter Verwendung des Standard-Cluster-Setups können Sie Container aus beliebigen Images, die in Ihrem IBM Cloud Container Registry-Namensbereich gespeichert sind, im Kubernetes-Standardnamensbereich (default) Ihres Clusters bereitstellen. Zur Verwendung dieser Images in einem beliebigen anderen Kubernetes-Namensbereich oder in anderen IBM Cloud-Konten haben Sie die Option, geheime Schlüssel für Image-Pull-Operationen zu kopieren oder eigene Schlüssel zu erstellen.
Kann ich Bilder von einem anderen IBM Cloud-Konto abrufen?
Ja, Sie können einen API-Schlüssel in dem IBM Cloud-Konto erstellen, das Sie zu verwenden beabsichtigen. Erstellen Sie anschließend in allen Namensbereichen der Cluster, in die Sie Images aus dem IBM Cloud-Konto extrahieren möchten, einen geheimen Schlüssel, der den API-Schlüssel enthält. Für weitere Informationen folgen Sie diesem Beispiel, bei dem ein API-Schlüssel für eine autorisierte Service-ID verwendet wird.

Informationen zur Verwendung einer Nicht-IBM Cloud-Registry wie Docker finden Sie unter Zugriff auf Images in anderen privaten Registrys.

Muss der API-Schlüssel für eine Service-ID sein? Was passiert, wenn ich die maximale Anzahl an Service-IDs für mein Konto erreicht habe?
Das Standard-Cluster-Setup erstellt eine Service-ID zum Speichern von IBM Cloud IAM-API-Schlüsselberechtigungsnachweisen im geheimen Schlüssel für Image-Pull-Operationen. Sie können jedoch auch einen API-Schlüssel für einen einzelnen Benutzer erstellen und diese Berechtigungsnachweise in einem geheimen Schlüssel für Image-Pull-Operationen speichern. Wenn der IAM-Grenzwert für Service-IDs erreicht ist, wird Ihr Cluster ohne die Service-ID und den geheimen Schlüssel für Image-Pull-Operationen erstellt und kann standardmäßig keine Images aus den Domänen der icr.io-Registry extrahieren. Sie müssen einen eigenen geheimen Schlüssel für Image-Pull-Operationen erstellen, jedoch unter Verwendung eines API-Schlüssels für einen einzelnen Benutzer, wie zum Beispiel einer funktionellen ID, und nicht mittels einer IBM Cloud IAM-Service-ID.
Ich sehe Bild-Pull-Geheimnisse für die regionalen Registrierungsdomains und alle Registrierungsdomains. Welches verwende ich?
Bisher hat IBM Cloud Kubernetes Service für jede Domäne der regionalen und öffentlichen icr.io-Registry separate geheime Schlüssel für Image-Pull-Operationen erstellt. Jetzt werden alle Domänen der öffentlichen und privaten icr.io-Registry für alle Regionen in einem einzigen geheimen Schlüssel für Image-Pull-Operationen mit dem Namen all-icr-io gespeichert, der im Kubernetes-Namensbereich default Ihres Clusters automatisch erstellt wird.

Damit Ihre Workloads in anderen Namensbereichen im Cluster Container-Images aus einer privaten Registry extrahieren können, müssen Sie jetzt nur den geheimen Schlüssel für Image-Pull-Operationen namens all-icr-io in diesen Namensbereich kopieren. Anschließend geben Sie den geheimen Schlüssel all-icr-io in Ihrem Servicekonto oder in Ihrer Bereitstellung an. Den geheimen Schlüssel für Image-Pull-Operationen, der der regionalen Registry für Ihr Image entspricht, müssen Sie nicht mehr kopieren. Beachten Sie außerdem, dass keine geheimen Schlüssel für Image-Pull-Operationen in öffentlichen Registrys benötigt werden, für die keine Authentifizierung erforderlich ist.

Wenn ich ein Bild-Pull-Secret in einem anderen Kubernetes-Namensraum kopiere oder erstelle, bin ich dann fertig?
Nicht ganz. Ihre Container müssen zum Extrahieren von Images unter Verwendung des von Ihnen erstellten geheimen Schlüssels berechtigt sein. Sie können dem Servicekonto für den Namensbereich den geheimen Schlüssel für Image-Pull-Operationen hinzufügen oder in jeder Bereitstellung auf den geheimen Schlüssel verweisen. Anweisungen finden Sie unter Geheimen Schlüssel für Image-Pull-Operationen zum Bereitstellen von Containern verwenden.

Private Netzverbindung zu icr.io-Registrys

Wenn Sie Ihr IBM Cloud-Konto für die Verwendung von Serviceendpunkten einrichten, können Sie eine private Netzverbindung verwenden, um Images mit Push-Operationen an IBM Cloud Container Registry zu übertragen und mit Pull-Operationen von dort aus zu extrahieren.

Was muss ich tun, um meinen Cluster so einzurichten, dass er die private Verbindung zu icr.io-Registern nutzen kann?

  1. Aktivieren Sie eine virtuelle Routerfunktion (Virtual Router Function (VRF)) für Ihr Konto in der IBM Cloud-Infrastruktur, damit Sie den IBM Cloud Container Registry-Private-Cloud-Serviceendpunkt verwenden können. Informationen zum Aktivieren von VRF finden Sie im Abschnitt VRF aktivieren. Mit dem Befehl ibmcloud account show können Sie überprüfen, ob VRF bereits aktiviert ist.
  2. Aktivieren Sie Ihr IBM Cloud-Konto zur Verwendung von Serviceendpunkten.

IBM Cloud Container Registry verwendet automatisch den Endpunkt des privaten Cloud-Dienstes. Sie müssen den Serviceendpunkt der privaten Cloud für Ihre IBM Cloud Kubernetes Service-Cluster nicht aktivieren.

Vorhandene Cluster zur Verwendung von API-Schlüsseln in geheimen Schlüsseln für Image-Pull-Operationen aktualisieren

Neue IBM Cloud Kubernetes Service-Cluster speichern einen API-Schlüssel in geheimen Schlüsseln für Image-Pull-Operationen, um den Zugriff auf IBM Cloud Container Registry zu autorisieren. Mit diesen geheimen Schlüsseln für Image-Pull-Operationen können Sie Container aus Images bereitstellen, die in den Registry-Domänen icr.io gespeichert sind. Sie können die geheimen Schlüssel für Image-Pull-Operationen zu Ihrem Cluster hinzufügen, wenn Ihr Cluster ohne diese geheimen Schlüssel erstellt wurde. Cluster, die vor dem 25. Februar 2019 erstellt wurden, müssen Sie aktualisieren, um einen API-Schlüssel anstelle eines Registry-Tokens im geheimen Schlüssel für Image-Pull-Operationen zu speichern.

Vorbereitende Schritte

  1. Melden Sie sich an Ihrem Konto an. If applicable, target the appropriate resource group. Legen Sie den Kontext für den Cluster fest.

  2. Stellen Sie sicher, dass Sie über die folgenden Berechtigungen verfügen: IBM Cloud IAM-Plattformzugriffsrolle Operator oder Administrator für IBM Cloud Kubernetes Service. Der Account-Besitzer kann Ihnen die Rolle mit dem folgenden Befehl zuweisen.

    ibmcloud iam user-policy-create EMAIL --service-name containers-kubernetes --roles "Administrator,Operator"
    
  3. IBM Cloud IAM-Plattformzugriffsrolle Administrator für IBM Cloud Container Registry, über alle Regionen und Ressourcengruppen. Die Gültigkeit der Richtlinie kann nicht auf eine bestimmte Region oder Ressourcengruppe begrenzt werden. Der Account-Besitzer kann Ihnen die Rolle mit dem folgenden Befehl zuweisen.

    Überprüfen Sie, ob das Geheimnis erfolgreich erstellt wurde

    ibmcloud iam user-policy-create <your_user_email> --service-name container-registry --roles Administrator
    
  4. Wenn Ihr Konto das Erstellen von Service-IDs einschränkt, fügen Sie die Rolle Erstellungsfunktion für Service-IDs zu Identity and Access Management in der Konsole hinzu (iam-identity in der API oder in der CLI).

  5. Wenn Ihr Konto das Erstellen von API-Schlüsseln einschränkt, fügen Sie die Rolle Erstellungsfunktion für Benutzer-API-Schlüssel zu Identity and Access Management in der Konsole hinzu (iam-identity in der API oder in der CLI).

Aktualisierung Ihres geheimen Image-Pull-Schlüssels

Ihren geheimen Image-Pull-Schlüssel des Clusters in dem default-Kubernetes-Namensbereich aktualisieren.

  1. Rufen Sie Ihre Cluster-ID ab.

    ibmcloud ks cluster ls
    
  2. Führen Sie den folgenden Befehl aus, um eine Service-ID für den Cluster zu erstellen und der Service-ID die IAM-Servicezugriffsrolle Leseberechtigter für IBM Cloud Container Registry zuzuordnen. Mit dem Befehl wird auch ein API-Schlüssel erstellt, der die Identität der Berechtigungsnachweise der Service-ID annimmt, und der API-Schlüssel wird in einem geheimen Kubernetes-Schlüssel für Image-Pull-Operationen im Cluster gespeichert. Der geheime Schlüssel für Image-Pull-Operationen befindet sich im Kubernetes-Namensbereich default.

    ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>
    

    Wenn Sie diesen Befehl ausführen, wird die Erstellung von IAM-Berechtigungsnachweisen und geheimen Schlüsseln für Image-Pull-Operationen eingeleitet, deren Ausführung einige Zeit dauern kann. Sie können Container, die ein Image aus IBM Cloud Container Registry-Domänen icr.io extrahieren, erst bereitstellen, wenn die geheimen Schlüssel für Image-Pull-Operationen erstellt wurden.

  3. Überprüfen Sie, ob die geheimen Schlüssel (Secrets) für Image-Pull-Operationen in Ihrem Cluster erstellt wurden.

    kubectl get secrets | grep icr-io
    

    Beispielausgabe

    all-icr-io           kubernetes.io/dockerconfigjson        1         16d
    
  4. Aktualisieren Sie Ihre Containerbereitstellungen, um Images aus dem icr.io-Domänennamen zu extrahieren.

  5. Optional: Wenn Sie eine Firewall haben, stellen Sie sicher, dass Sie ausgehenden Netzverkehr an die Registry-Teilnetze für die Domänen zulassen, die Sie verwenden.

  6. Führen Sie Ihre Konfiguration mit einer der folgenden Optionen aus.

Verwendung eines Bildabrufgeheimnisses, um auf Bilder in externen privaten Registern zuzugreifen

Richten Sie Ihren eigenen geheimen Schlüssel für Image-Pull-Operationen in Ihrem Cluster ein, um Container in anderen Kubernetes-Namensbereichen als default bereitzustellen, Images zu verwenden, die in anderen IBM Cloud-Konten gespeichert sind, oder Images zu verwenden, die in externen privaten Registrys gespeichert sind. Weiterhin können Sie einen eigenen geheimen Schlüssel für Image-Pull-Operationen erstellen, um IAM-Zugriffsrichtlinien anzuwenden, die Berechtigungen auf bestimmte Namensbereiche für Registry-Images oder Aktionen (z. B. push oder pull) beschränken.

Nachdem Sie den geheimen Schlüssel zum Extrahieren von Images erstellt haben, müssen Ihre Container den geheimen Schlüssel verwenden, um zum Extrahieren eines Image aus der Registry berechtigt zu sein. Sie können dem Servicekonto für den Namensbereich den geheimen Schlüssel für Image-Pull-Operationen hinzufügen oder in jeder Bereitstellung auf den geheimen Schlüssel verweisen. Anweisungen finden Sie unter Geheimen Schlüssel für Image-Pull-Operationen zum Bereitstellen von Containern verwenden.

Geheime Schlüssel für Image-Pull-Operationen sind nur für die Kubernetes-Namensbereiche gültig, für die sie erstellt wurden. Wiederholen Sie diese Schritte für jeden Namensbereich, in dem Sie Container bereitstellen möchten. Für Images aus DockerHub sind keine geheimen Schlüssel für Image-Pull-Operationen erforderlich.

Vorbereitende Schritte:

  1. Richten Sie einen Namensbereich in IBM Cloud Container Registry ein und übertragen Sie Images per Push-Operation an diesen Namensbereich.
  2. Erstellen Sie einen Cluster.
  3. Melden Sie sich an Ihrem Konto an. If applicable, target the appropriate resource group. Legen Sie den Kontext für den Cluster fest.

Wählen Sie zur Verwendung Ihres eigenen geheimen Schlüssels für Image-Pull-Operationen eine der folgenden Optionen aus:

Wenn Sie bereits einen geheimen Schlüssel für Image-Pull-Operationen in Ihrem Namensbereich erstellt haben, den Sie in Ihrer Bereitstellung verwenden möchten, finden Sie weitere Informationen unter Container mithilfe des erstellten geheimen Schlüssels für Image-Pull-Operationen (imagePullSecret) bereitstellen.

Vorhandenen geheimen Schlüssel für Image-Pull-Operationen kopieren

Sie können einen geheimen Schlüssel für Image-Pull-Operationen, z. B. den, der automatisch für den Kubernetes-Namensbereich default erstellt wird, in andere Namensbereiche Ihres Clusters kopieren. Wenn Sie andere IBM Cloud IAM-API-Schlüsselberechtigungsnachweise für diesen Namensbereich verwenden möchten, z. B. um den Zugriff auf bestimmte Namensbereiche einzuschränken oder um Images mit Pull-Operation aus anderen IBM Cloud-Konten zu extrahieren, erstellen Sie stattdessen einen geheimen Schlüssel für Image-Pull-Operationen.

  1. Listen Sie die Kubernetes-Namensbereiche in Ihrem Cluster auf oder erstellen Sie einen Namensbereich, der verwendet werden soll.

    kubectl get namespaces
    

    Beispielausgabe

    default          Active    79d
    ibm-cert-store   Active    79d
    ibm-system       Active    79d
    kube-public      Active    79d
    kube-system      Active    79d
    

    So erstellen Sie einen Namensbereich

    kubectl create namespace <namespace_name>
    
  2. Listen Sie die vorhandenen geheimen Schlüssel für Image-Pull-Operationen (Secrets) im Kubernetes-Namensbereich default für IBM Cloud Container Registry auf.

    kubectl get secrets -n default | grep icr-io
    

    Beispielausgabe

    all-icr-io          kubernetes.io/dockerconfigjson        1         16d
    
  3. Kopieren Sie den geheimen Schlüssel für Image-Pull-Operationen namens all-icr-io aus dem Namensbereich default in den Namensbereich Ihrer Wahl. Die neuen geheimen Schlüssel für Image-Pull-Operationen tragen den Namen <namespace_name>-icr-<region>-io.

    kubectl get secret all-icr-io -n default -o yaml | sed 's/default/<new-namespace>/g' | kubectl create -n <new-namespace> -f -   
    
  4. Überprüfen Sie, ob die geheimen Schlüssel erfolgreich erstellt wurden.

    kubectl get secrets -n <namespace_name> | grep icr-io
    
  5. Zum Bereitstellen von Containern fügen Sie den geheimen Schlüssel für Image-Pull-Operationen jeder Bereitstellung oder dem Servicekonto des Namensbereichs hinzu, damit alle Bereitstellungen im Namensbereich Images aus der Registry extrahieren können.

Geheimen Schlüssel für Image-Pull-Operationen mit unterschiedlichen Berechtigungsnachweisen für IAM-API-Schlüssel erstellen

Sie können Benutzern oder einer Service-ID IBM Cloud IAM-Zugriffsrichtlinien zuweisen, um die Berechtigungen auf bestimmte Namensbereiche für Registry-Images oder Aktionen (wie push oder pull) zu beschränken. Anschließend erstellen Sie einen API-Schlüssel und speichern diese Registry-Berechtigungsnachweise in einem geheimen Schlüssel für Image-Pull-Operationen für Ihren Cluster.

Wenn Sie beispielsweise auf Images in anderen IBM Cloud-Konten zugreifen möchten, erstellen Sie einen API-Schlüssel, der die IBM Cloud Container Registry-Berechtigungsnachweise eines Benutzers oder einer Service-ID in diesem Konto speichert. Anschließend speichern Sie Im Konto Ihres Clusters die API-Schlüsselberechtigungsnachweise in einem geheimen Schlüssel für Image-Pull-Operationen für jeden Cluster und Clusternamensbereich.

Bei Ausführung der folgenden Schritte wird ein API-Schlüssel erstellt, von dem die Berechtigungsnachweise einer IBM Cloud IAM-Service-ID gespeichert werden. Anstatt eine Service-ID zu verwenden, können Sie auch einen API-Schlüssel für eine Benutzer-ID erstellen, die eine IBM Cloud IAM-Servicezugriffsrichtlinie für IBM Cloud Container Registry hat. Stellen Sie jedoch sicher, dass der Benutzer eine funktionsfähige ID ist, oder treffen Sie Vorkehrungen für den Fall, dass der Benutzer ausscheidet, sodass der Cluster weiterhin auf die Registry zugreifen kann.

  1. Listen Sie die Kubernetes-Namensbereiche in Ihrem Cluster auf oder erstellen Sie einen Namensbereich, der verwendet werden soll, wenn Sie Container aus Ihren Registry-Images bereitstellen wollen.

    kubectl get namespaces
    

    Beispielausgabe

    default          Active    79d
    ibm-cert-store   Active    79d
    ibm-system       Active    79d
    kube-public      Active    79d
    kube-system      Active    79d
    

    So erstellen Sie einen Namensbereich

    kubectl create namespace <namespace_name>
    
  2. Erstellen Sie eine IBM Cloud IAM-Service-ID für Ihren Cluster, die für die IAM-Richtlinien und die API-Schlüsselberechtigungsnachweise in dem geheimen Schlüssel für Image-Pull-Operationen verwendet wird. Stellen Sie sicher, dass Sie die Service-ID mit einer Beschreibung versehen, die Ihnen später beim Abrufen der Service-ID hilft, zum Beispiel indem Sie den Clusternamen und den Namensbereich mitangeben.

    ibmcloud iam service-id-create <cluster_name>-<namespace>-id --description "Service ID for IBM Cloud Container Registry in Kubernetes cluster <cluster_name> namespace <namespace>"
    
  3. Erstellen Sie eine angepasste IBM Cloud IAM-Richtlinie für Ihre Cluster-Service-ID, die Zugriff auf IBM Cloud Container Registry erteilt.

    ibmcloud iam service-policy-create <cluster_service_ID> --roles <service_access_role> --service-name container-registry [--region <IAM_region>] [--resource-type namespace --resource <registry_namespace>]
    
    cluster_service_ID
    Erforderlich. Ersetzen Sie den Wert durch die <cluster_name>-<kube_namespace>-id-Service-ID, die Sie zuvor für Ihren Kubernetes-Cluster erstellt haben.
    --service-name container-registry
    Erforderlich. Geben Sie container-registry so ein, dass die IAM-Richtlinie für IBM Cloud Container Registry gilt.
    --roles <service_access_role>
    Erforderlich. Geben Sie die Servicezugriffsrolle für IBM Cloud Container Registry ein, an die Sie den Service-ID-Zugriff bereichsorientieren möchten. Gültige Werte sind Reader, Writer und Manager.
    --region <IAM_region>
    Optional. Wenn Sie den Bereich der Zugriffsrichtlinie auf bestimmte IAM-Regionen festlegen wollen, geben Sie die Regionen in einer durch Kommas getrennten Liste ein. Mögliche Werte sind global und die lokalen Registry-Regionen.
    --resource-type namespace --resource <registry_namespace>
    Optional. Wenn Sie den Zugriff ausschließich auf Images in bestimmten IBM Cloud Container Registry-Namensbereichen beschränken möchten, geben Sie den Ressourcentyp namespace ein und geben Sie <registry_namespace> an. Führen Sie zum Auflisten von Registry-Namensbereichen den Befehl ibmcloud cr namespaces aus.
  4. Erstellen Sie einen API-Schlüssel für die Service-ID. Benennen Sie den API-Schlüssel ähnlich wie Ihre Service-ID und fügen Sie die zuvor erstellte Service-ID hinzu <cluster_name>-<kube_namespace>-id. Stellen Sie sicher, dass Sie für den API-Schlüssel eine Beschreibung angeben, die Ihnen später das Abrufen des Schlüssels erleichtert.

    ibmcloud iam service-api-key-create <cluster_name>-<namespace>-key <cluster_name>-<namespace>-id --description "API key for service ID <service_id> in Kubernetes cluster <cluster_name> namespace <namespace>"
    
  5. Ermitteln Sie Ihren Wert für API Key in der Ausgabe des vorherigen Befehls.

    Please preserve the API key! It can't be retrieved after it's created.
    
    Name          <cluster_name>-<kube_namespace>-key   
    Description   key_for_registry_for_serviceid_for_kubernetes_cluster_multizone_namespace_test   
    Bound To      crn:v1:bluemix:public:iam-identity::a/1bb222bb2b33333ddd3d3333ee4ee444::serviceid:ServiceId-ff55555f-5fff-6666-g6g6-777777h7h7hh   
    Created At    2019-02-01T19:06+0000   
    API Key       i-8i88ii8jjjj9jjj99kkkkkkkkk_k9-llllll11mmm1   
    Locked        false   
    UUID          ApiKey-222nn2n2-o3o3-3o3o-4p44-oo444o44o4o4   
    
  6. Erstellen Sie einen geheimen Schlüssel für Image-Pull-Operationen, um die Berechtigungsnachweise des API-Schlüssels im Namensbereich des Clusters zu speichern. Wiederholen Sie diesen Schritt für alle Namensbereiche aller Cluster für alle icr.io-Domänen, aus denen Sie Images extrahieren möchten.

    kubectl --namespace <namespace> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=iamapikey --docker-password=<api_key_value> --docker-email=<docker_email>
    
    --namespace <namespace>
    Erforderlich. Geben Sie den Kubernetes-Namensbereich Ihres Clusters an, den Sie für den Service-ID-Namen verwendet haben.
    <secret_name>
    Erforderlich. Geben Sie einen Namen für Ihren geheimen Schlüssel für Image-Pull-Operationen ein.
    --docker-server <registry_URL>
    Erforderlich. Setzen Sie die URL auf die Image-Registry, in der Ihr Registry-Namensbereich eingerichtet ist. Informationen zu verfügbaren Domänen finden Sie unter Lokale Regionen.
    --docker-username iamapikey
    Erforderlich. Geben Sie den Benutzernamen für die Anmeldung bei Ihrer privaten Registry ein. Wenn Sie IBM Cloud Container Registry verwenden, geben Sie iamapikey ein.
    --docker-password <token_value>
    Erforderlich. Geben Sie den Wert für Ihren API-Schlüssel (API Key) ein, den Sie zuvor ermittelt haben.
    --docker-email <docker-email>
    Erforderlich. Falls Sie über eine Docker-E-Mail-Adresse verfügen, geben Sie diese ein. Wenn nicht, geben Sie eine fiktive E-Mail-Adresse ein, z. B. a@b.c. Diese E-Mail-Adresse ist erforderlich, um einen geheimen Kubernetes-Schlüssel zu erstellen, wird aber nach der Erstellung nicht weiter genutzt.
  7. Überprüfen Sie, ob der geheime Schlüssel erfolgreich erstellt wurde. Ersetzen Sie <namespace> durch den namespace, in dem Sie den geheimen Schlüssel für Image-Pull-Operationen erstellt haben.

    kubectl get secrets --namespace <namespace>
    
  8. Fügen Sie einem Kubernetes Service-Konto den geheimen Schlüssel für Image-Pull-Operationen hinzu, sodass jeder Pod in dem Namensbereich den geheimen Schlüssel für Image-Pull-Operationen verwenden kann, wenn Sie einen Container bereitstellen.

Zugriff auf Images in anderen privaten Registrys

Wenn bereits eine private Registry vorhanden ist, müssen Sie die Berechtigungsnachweise für die Registry in einem geheimen Kubernetes-Schlüssel für Image-Pull-Operationen speichern und diesen geheimen Schlüssel in Ihrer Konfigurationsdatei referenzieren.

Vorbereitende Schritte:

  1. Erstellen Sie einen Cluster.
  2. Melden Sie sich an Ihrem Konto an. If applicable, target the appropriate resource group. Legen Sie den Kontext für den Cluster fest.

Gehen Sie wie folgt vor, um einen geheimen Schlüssel für Image-Pull-Operationen zu erstellen:

  1. Erstellen Sie den geheimen Kubernetes-Schlüssel, um Ihre Berechtigungsnachweise für die private Registry zu speichern.

    kubectl --namespace <namespace> create secret docker-registry <secret_name>  --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email>
    
    --namespace <namespace>
    Erforderlich. Der Kubernetes-Namensbereich Ihres Clusters, in dem Sie den geheimen Schlüssel verwenden und Container bereitstellen möchten. Führen Sie zum Auflisten der Namensbereiche in Ihrem Cluster den Befehl kubectl get namespaces aus.
    <secret_name>
    Erforderlich. Der Name, den Sie für Ihren geheimen Schlüssel für Image-Pull-Operationen verwenden wollen.
    --docker-server <registry_URL>
    Erforderlich. Die URL der Registry, in der Ihre privaten Images gespeichert sind.
    --docker-username <docker_username>
    Erforderlich. Der Benutzername für die Anmeldung bei Ihrer privaten Registry.
    --docker-password <token_value>
    Erforderlich. Das Kennwort für die Anmeldung bei Ihrer privaten Registry, z. B. ein Tokenwert.
    --docker-email <docker-email>
    Erforderlich. Falls Sie über eine Docker-E-Mail-Adresse verfügen, geben Sie diese ein. Falls Sie nicht über eine solche Adresse verfügen, geben Sie eine fiktive E-Mail-Adresse ein (z. B. a@b.c). Diese E-Mail-Adresse ist erforderlich, um einen geheimen Kubernetes-Schlüssel zu erstellen, wird aber nach der Erstellung nicht weiter genutzt.
  2. Überprüfen Sie, ob der geheime Schlüssel erfolgreich erstellt wurde. Ersetzen Sie <namespace> durch den Namen des Namensbereichs, in dem Sie den geheimen Schlüssel für Image-Pull-Operationen erstellt haben.

    kubectl get secrets --namespace <namespace>
    
  3. Erstellen Sie einen Pod, der den geheimen Schlüssel für Image-Pull-Operationen referenziert.

Geheimen Schlüssel für Image-Pull-Operationen zum Bereitstellen von Containern verwenden

Sie können einen geheimen Schlüssel für Image-Pull-Operationen in Ihrer Pod-Bereitstellung definieren oder den geheimen Schlüssel für Image-Pull-Operationen in Ihrem Kubernetes-Servicekonto speichern, sodass er für alle Bereitstellungen indem Namensbereich verfügbar ist, für die kein Kubernetes-Servicekonto angegeben ist.

Zur Planung, wie geheime Image-Pull-Schlüssel in Ihrem Cluster verwendet werden sollen, wählen Sie zwischen den folgenden Optionen.

  • Verweis auf geheimen Schlüssel für Image-Pull-Operationen in Ihrer Pod-Bereitstellung: Verwenden Sie diese Option, wenn Sie nicht allen Pods in Ihrem Namensbereich standardmäßig Zugriff auf Ihre Registry gewähren möchten. Entwickler können den geheimen Schlüssel für Image-Pull-Operationen in jede Pod-Bereitstellung einschließen, die auf Ihre Registry zugreifen muss.
  • Speichern des geheimen Schlüssels für Image-Pull-Operationen im Kubernetes Service-Konto: Verwenden Sie diese Option, um Zugriff auf Images in Ihrer Registry für alle Bereitstellungen in den ausgewählten Kubernetes-Namensbereichen zu erteilen. Um einen geheimen Schlüssel für Image-Pull-Operationen im Kubernetes Service-Konto zu speichern, verwenden Sie die folgenden Schritte.

Geheimen Schlüssel für Image-Pull-Operationen im Kubernetes Service-Konto für den ausgewählten Namensbereich speichern

Jeder Kubernetes-Namensbereich verfügt über ein Kubernetes-Servicekonto mit dem Namen default. Innerhalb des Namensbereichs können Sie diesem Servicekonto den geheimen Schlüssel für Image-Pull-Operationen hinzufügen, um Pods den Zugriff auf das Extrahieren von Images aus Ihrer Registry zu erteilen. Bereitstellungen, die kein Servicekonto angeben, verwenden automatisch das default-Servicekonto für diesen Kubernetes-Namensbereich.

  1. Prüfen Sie, ob bereits ein geheimer Schlüssel für Image-Pull-Operationen für Ihr Standardservicekonto vorhanden ist.

    kubectl describe serviceaccount default -n <namespace_name>
    

    Wenn <none> im Eintrag Geheime Schlüssel für Image-Pull-Operationen angezeigt wird, ist kein geheimer Schlüssel für Image-Pull-Operationen vorhanden.

  2. Fügen Sie Ihrem Standardservicekonto den geheimen Schlüssel für Image-Pull-Operationen hinzu.

    • Beispielbefehl zum Hinzufügen des geheimen Image-Pull-Schlüssels, wenn kein geheimer Image-Pull-Schlüssel definiert ist.

      kubectl patch -n <namespace_name> serviceaccount/default -p '{"imagePullSecrets":[{"name": "<image_pull_secret_name>"}]}'
      
    • Beispielbefehl zum Hinzufügen des geheimen Image-Pull-Schlüssels, wenn kein geheimer Image-Pull-Schlüssel bereits definiert ist.

      kubectl patch -n <namespace_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
      
  3. Überprüfen Sie, ob Ihr geheimer Schlüssel für Image-Pull-Operationen Ihrem Standardservicekonto hinzugefügt wurde.

    kubectl describe serviceaccount default -n <namespace_name>
    

    Beispielausgabe

    Name:                default
    Namespace:           <namespace_name>
    Labels:              <none>
    Annotations:         <none>
    Image pull secrets:  <image_pull_secret_name>
    Mountable secrets:   default-token-sh2dx
    Tokens:              default-token-sh2dx
    Events:              <none>
    

    Wenn Geheime Schlüssel für Image-Pull-Operationen den Eintrag <secret> (not found) enthält, überprüfen Sie, dass der geheime Schlüssel für Image-Pull-Operationen im selben Namensbereich wie Ihr Servicekonto vorhanden ist, indem Sie kubectl get secrets -n namespaceausführen.

  4. Erstellen Sie eine Podkonfigurationsdatei mit dem Namen mypod.yaml, um einen Container aus einem Image in Ihrer Registry bereitzustellen.

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod-container
          image: <region>.icr.io/<namespace>/<image>:<tag>
    
  5. Erstellen Sie den Pod in dem Cluster, indem Sie die Konfigurationsdatei mypod.yaml anwenden.

    kubectl apply -f mypod.yaml
    

Cluster einrichten, mit dem Software per Pull-Operation übertragen werden kann

Sie können Ihren IBM Cloud Kubernetes Service-Cluster so einrichten, dass Software, für die Sie berechtigt sind, per Pull-Operation übertragen wird. Bei der Software handelt es sich um eine Gruppe von Container-Images, die in Helm-Charts gepackt sind, für deren Nutzung Sie durch IBM berechtigt wurden. Die Software, für die Sie eine Berechtigung haben, wird in der speziellen IBM Cloud Container Registry-Domäne cp.icr.io gespeichert. Um auf diese Domäne zugreifen zu können, müssen Sie einen geheimen Schlüssel für Image-Pull-Operationen mit einem Berechtigungsschlüssel für Ihren Cluster erstellen und diesen geheimen Schlüssel für Image-Pull-Operationen dem Kubernetes-Servicekonto für jeden Namensbereich hinzufügen, in dem die Software bereitgestellt werden soll.

Vorbereitende Schritte: Melden Sie sich bei Ihrem Konto an. If applicable, target the appropriate resource group. Legen Sie den Kontext für den Cluster fest.

  1. Fordern Sie den Berechtigungsschlüssel für die Bibliothek mit der Software an, für die Sie berechtigt sind.

    1. Melden Sie sich bei MyIBM.com an und scrollen Sie zum Abschnitt "Container-Software-Bibliothek ". Klicken Sie auf View library.
    2. Klicken Sie auf der Seite Access your container software > Entitlement keys auf Copy key. Mit diesem Schlüssel wird der Zugriff auf die gesamte Software in Ihrer Containersoftwarebibliothek autorisiert, für die Sie berechtigt sind.
  2. Erstellen Sie in dem Namensbereich, in dem Sie die Container, für die Sie berechtigt sind, bereitstellen möchten, einen geheimen Schlüssel für Image-Pull-Operationen, damit Sie auf die Registry cp.icr.io, für die Sie berechtigt sind, zugreifen können. Verwenden Sie den Berechtigungsschlüssel, den Sie zuvor als Wert für --docker-password abgerufen haben. Weitere Informationen finden Sie unter Zugriff auf Images in anderen privaten Registrys.

    kubectl create secret docker-registry entitled-cp-icr-io --docker-server=cp.icr.io --docker-username=cp --docker-password=<entitlement_key> --docker-email=<docker_email> -n <namespace>
    
  3. Fügen Sie den geheimen Schlüssel für Image-Pull-Operationen dem Servicekonto des Namensbereichs hinzu, sodass jeder Container im Namensbereich den Berechtigungsschlüssel verwenden kann, um Images zu extrahieren, für die eine Berechtigung besteht. Weitere Informationen finden Sie unter Geheimen Schlüssel für Image-Pull-Operationen zum Bereitstellen von Containern verwenden.

    kubectl patch -n <namespace> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"entitled-cp-icr-io"}}]'
    
  4. Erstellen Sie einen Pod in dem Namensbereich, der einen Container aus einem Image in der Registry erstellt, für die Sie berechtigt sind.

    kubectl run <pod_name> --image=cp.icr.io/<image_name> -n <namespace> --generator=run-pod/v1
    
  5. Stellen Sie sicher, dass Ihr Container erfolgreich aus dem Image, für das Sie berechtigt sind, erstellt werden konnte, indem Sie überprüfen, ob sich der Pod in einem aktiven Status (Running) befindet.

    kubectl get pod <pod_name> -n <namespace>
    

Welcher Schritt soll als Nächstes ausgeführt werden? Sie können das Helm-Chart-Repository entitled einrichten, in dem Helm-Charts gespeichert werden, die Software mit Berechtigung enthalten. Wenn Sie Helm bereits in Ihrem Cluster installiert haben, führen Sie folgenden Befehl aus: helm repo add entitled https://raw.githubusercontent.com/IBM/charts/master/repo/entitled.

Containerd-Konfiguration für angepasste IBM Cloud Kubernetes Service-Registry aktualisieren

Mit Kubernetes Version 1.22 oder höher können Sie containerd-Konfigurationsdateien auf Workerknoten verwenden, um das Extrahieren aus einer Container-Registry zu konfigurieren. Sie können eine Dämongruppe verwenden, um die Konfigurationen für alle Knoten in einem Cluster zu aktualisieren. Dadurch wird verhindert, dass Konfigurationen gelöscht werden, wenn Workerknoten erneut geladen oder neue Worker hinzugefügt werden.

Beispiel für eine Dämongruppe zur Aktualisierung einer containerd-Konfiguration für eine angepasste Registry

Verwenden Sie die YAML-Beispieldatei, um eine Dämongruppe zu definieren, die auf allen Workerknoten ausgeführt wird, um eine Hostkonfiguration für die containerd-Registry festzulegen oder zu aktualisieren und an den entsprechenden containerd-Registry-Pfad anzuhängen.

Das Beispiel legt die folgende Registry-Hostkonfiguration für DockerHub fest. Diese Registry-Hostkonfiguration wird bereits während der Worker-Bereitstellungsphase bereitgestellt und automatisch konfiguriert. Der Container init initialisiert hosts.toml auf jedem Arbeitsknoten nach der Bereitstellung und nach dem erneuten Laden oder Neustart der Arbeitsknoten.

server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]

Beispiel für YAML-Datei:

apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
    name: containerd-dockerhub-registry-config
name: containerd-dockerhub-registry-config
namespace: kube-system
spec:
selector:
    matchLabels:
    name: containerd-dockerhub-registry-config
template:
    metadata:
    labels:
        name: containerd-dockerhub-registry-config
    spec:
    initContainers:
    - image: alpine:3.13.6
        name: containerd-dockerhub-registry-config
        command:
        - /bin/sh
        - -c
        - |
            #!/bin/sh
            set -uo pipefail
            cat << EOF > /etc/containerd/certs.d/docker.io/hosts.toml
            server = "https://docker.io"
            [host."https://registry-1.docker.io"]
            capabilities = ["pull", "resolve"]
            EOF
        volumeMounts:
        - mountPath: /etc/containerd/certs.d/docker.io/
        name: dockerhub-registry-config
    containers:
    - name: pause
        image: "us.icr.io/armada-master/pause:3.5"
        imagePullPolicy: IfNotPresent
    volumes:
    - name: dockerhub-registry-config
        hostPath:
        path: /etc/containerd/certs.d/docker.io/

Weitere Informationen zum Aktualisieren einer containerd-Registry-Hostkonfiguration finden Sie in der containerd-Dokumentation.