Registry-Spiegel für Container-Images verwenden

Auf dieser Seite wird erläutert, wie Sie Cluster mit Images erstellen und aktualisieren, die aus einer Registry-Spiegelung anstelle einer öffentlichen Registry wie gcr.io abgerufen wurden. Diese Funktion kann jederzeit während des Clusterlebenszyklus aktiviert oder deaktiviert werden.

Diese Seite richtet sich an Betreiber und Speicherspezialisten, die Speicherleistung, -nutzung und -kosten konfigurieren und verwalten. Weitere Informationen zu gängigen Rollen und Beispielaufgaben, auf die wir in Google Cloud -Inhalten verweisen, finden Sie unter Häufig verwendete GKE Enterprise-Nutzerrollen und -Aufgaben.

Eine Registry-Spiegelung ist eine lokale Kopie einer öffentlichen Registry, die die Dateistruktur der öffentlichen Registry kopiert oder spiegelt. Angenommen, der Pfad zu Ihrer lokalen Registry-Spiegelung lautet 172.18.0.20:5000. Wenn containerd auf eine Anfrage zum Abrufen eines Images wie gcr.io/kubernetes-e2e-test-images/nautilus:1.0 stößt, versucht containerd, dieses Image nicht von gcr.io, sondern aus Ihrer lokalen Registry unter dem folgenden Pfad abzurufen: 172.18.0.20:5000/kubernetes-e2e-test-images/nautilus:1.0. Wenn sich das Image nicht in diesem lokalen Registry-Pfad befindet, wird es automatisch aus der öffentlichen Registry gcr.io abgerufen.

Die Verwendung einer Registry-Spiegelung bietet die folgenden Vorteile:

  • Schützt vor Ausfällen der öffentlichen Registry.
  • Beschleunigt die Pod-Erstellung.
  • Sie können Ihre eigenen Scans auf Sicherheitslücken durchführen.
  • Vermeidet Limits, die durch öffentliche Registries festgelegt werden, wie häufig Sie Befehle ausführen können.

Hinweise

  • In Ihrem Netzwerk muss ein Container Registry-Server eingerichtet sein.
  • Wenn Ihr Registry-Server ein privates TLS-Zertifikat ausführt, benötigen Sie die Datei der Zertifizierungsstelle (Certificate Authority, CA).
  • Wenn Ihr Registry-Server eine Authentifizierung benötigt, benötigen Sie die entsprechenden Anmeldedaten oder eine Docker-Konfigurationsdatei.
  • Wenn Sie eine Registry-Spiegelung verwenden möchten, müssen Sie die Containerlaufzeit auf containerd festlegen.

Alle erforderlichen Images für Google Distributed Cloud herunterladen

Laden Sie die neueste Version des bmctl-Tools und des Image-Pakets von der Downloadseite herunter.

Container-Images auf den Registry-Server hochladen

Laden Sie die Images mit dem folgenden Befehl aus dem Image-Paket auf Ihren Registry-Server hoch:

[HTTPS_PROXY=http://PROXY_IP:PORT] ./bmctl push images \
    --source=./bmpackages_VERSION.tar.xz \
    --private-registry=REGISTRY_IP:PORT \
    [--cacert=CERT_PATH] \
    [--need-credential=false]

Ersetzen Sie Folgendes:

  • PROXY_IP:PORT durch die IP-Adresse und den Port des Proxys, wenn Sie einen Proxy zum Hochladen der Images von Ihrer Workstation auf den Registry-Server benötigen.
  • VERSION durch die Version des Image-Pakets, das Sie von der Seite Downloads heruntergeladen haben.
  • REGISTRY_IP:PORT durch die IP-Adresse und den Port des privaten Registry-Servers.
  • CERT_PATH durch den Pfad zur CA-Zertifikatsdatei, wenn Ihr Registry-Server ein privates TLS-Zertifikat verwendet.

Geben Sie Ihren Nutzernamen und Ihr Passwort ein, wenn Sie dazu aufgefordert werden, oder wählen Sie eine Docker-Konfigurationsdatei aus. Wenn für Ihren Registry-Server keine Anmeldedaten erforderlich sind, geben Sie --need-credential=false an.

Weitere Informationen zum Befehl bmctl push images erhalten Sie durch:

bmctl push images --help

Eigenen Namespace verwenden

Wenn Sie auf dem Registry-Server Ihren eigenen Namespace anstelle des Stamm-Namespace verwenden möchten, kann containerd aus diesem -Namespace abrufen, wenn Sie den API-Endpunkt für Ihre private Registry in registryMirrors.endpoint angeben. Der Endpunkt hat normalerweise das Format <REGISTRY_IP:PORT>/v2/<NAMESPACE>. Weitere Informationen finden Sie im Nutzerhandbuch für Ihre private Registry.

Wenn Sie beispielsweise nur Zugriff auf 172.18.0.20:5000/test-namespace/ haben, können Sie den folgenden Befehl verwenden, um alle Bilder unter dem Namespace test-namespace hochzuladen:

./bmctl push images \
    --source=./bmpackages_VERSION.tar.xz \
    --private-registry=172.18.0.20:5000/test-namespace \
    --username=<USERNAME> \
    --password=<PASSWORD> \
    --cacert <path/to/cert.crt>

Anschließend können Sie die folgende Clusterkonfigurationsdatei hinzufügen, um containerd aus dem Namespace abzurufen:

registryMirrors:
  - endpoint: https://172.18.0.20:5000/v2/test-namespace

Cluster für die Verwendung einer Registry-Spiegelung konfigurieren

Sie können einen Registrierungsspiegel für einen Cluster beim Erstellen oder Aktualisieren eines vorhandenen Clusters konfigurieren. Die verwendete Konfigurationsmethode hängt vom Clustertyp ab und bei Nutzerclustern davon, ob Sie einen Cluster erstellen oder aktualisieren. In den folgenden beiden Abschnitten werden die beiden Methoden zum Konfigurieren von Registrierungsspiegeln beschrieben.

Header-Abschnitt in der Clusterkonfigurationsdatei verwenden

In Google Distributed Cloud können Sie Registry-Mirrors außerhalb der Clusterspezifikation im Headerbereich der Clusterkonfigurationsdatei angeben:

  • Bei Administrator-, Hybrid- und Standalone-Clustern kann ein Registrierungsspiegel nur über den Abschnitt „Header“ in der Clusterkonfigurationsdatei konfiguriert werden. Diese Methode gilt für die Clustererstellung oder Clusteraktualisierungen.

  • Bei Nutzerclustern können Sie diese Methode nur während der Clustererstellung zum Konfigurieren eines Registry-Mirrors verwenden. Alternativ können Sie einen Registry-Mirror für einen vorhandenen Nutzercluster in der Clusterspezifikation im Abschnitt nodeConfig.registryMirrors konfigurieren.

Die folgende Beispielcluster-Konfigurationsdatei gibt an, dass Images von einer lokalen Registry-Spiegelung mit dem Endpunkt https://172.18.0.20:5000 abgerufen werden sollen. Einige der am Anfang dieser Konfigurationsdatei angezeigten Felder werden in den folgenden Abschnitten beschrieben.

# Sample cluster config with registry mirror:
---
gcrKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-gcr.json
sshPrivateKeyPath: /root/ssh-key/id_rsa
registryMirrors:
  - endpoint: https://172.18.0.20:5000
    caCertPath: /root/ca.crt
    pullCredentialConfigPath: /root/.docker/config.json
    hosts:
      - somehost.io
      - otherhost.io
---
apiVersion: v1
kind: Namespace
metadata:
  name: cluster-admin1
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: admin1
  namespace: cluster-admin1
spec:
  nodeConfig:
    containerRuntime: containerd
...

Abschnitt nodeConfig.registryMirrors in der Clusterspezifikation verwenden

Diese Methode zum Erstellen oder Aktualisieren eines Registrierungs-Mirrors gilt nur für Nutzercluster. Da Sie die für den verwaltenden Cluster erstellten Secrets für Ihren Nutzercluster freigeben können, können Sie mit nodeConfig.registryMirrors aus dem verwaltenden Administrator- oder Hybridcluster den Registry-Mirror in der Clusterspezifikation für den Nutzercluster angeben.

So konfigurieren Sie einen Nutzercluster so, dass er denselben Registry-Mirror wie der Administratorcluster verwendet:

  1. Rufen Sie den Abschnitt nodeConfig.registryMirror, einschließlich Secret-Referenzen, aus nodeConfig.registryMirrors der Admin-Clusterressource ab:

    kubectl get cluster CLUSTER_NAME -n CLUSTER_NAMESPACE \
        --kubeconfig ADMIN_KUBECONFIG \
        -o yaml
    

    Ersetzen Sie Folgendes:

    • CLUSTER_NAME: der Name des Administrator- oder Hybridclusters, der den Nutzercluster verwaltet.

    • CLUSTER_NAMESPACE: der Name des Namespaces für den verwaltenden Cluster.

    • ADMIN_KUBECONFIG: der Pfad der kubeconfig-Datei des verwaltenden Clusters.

  2. Fügen Sie die nodeConfig.registryMirrors-Konfiguration aus dem Administratorcluster der Konfigurationsdatei des Nutzerclusters hinzu.

    Der Abschnitt registryMirrors in der Konfigurationsdatei des Nutzerclusters sollte in etwa so aussehen:

    ---
    gcrKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-gcr.json
    sshPrivateKeyPath: /root/ssh-key/id_rsa
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-user1
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: user1
      namespace: cluster-user1
    spec:
      nodeConfig:
        containerRuntime: containerd
        registryMirrors:
        -   caCertSecretRef:
            name: the-secret-created-for-the-admin-cluster
            namespace: anthos-creds
          endpoint: https://172.18.0.20:5000
          hosts:
            -   somehost.io
            -   otherhost.io
          pullCredentialSecretRef:
            name: the-image-pull-creds-created-for-the-admin-cluster
            namespace: anthos-creds
    ...
    

Wenn Sie später Änderungen an der Registrierungsspiegelkonfiguration für Ihren Nutzercluster vornehmen möchten, bearbeiten Sie die nodeConfig.registryMirrors in der Konfigurationsdatei des Nutzerclusters und wenden Sie die Änderungen mit bmctl update an.

Sie können die Konfiguration der Registry-Spiegelungen für einen Nutzercluster nicht über den Headerbereich der Clusterkonfigurationsdatei aktualisieren.

Feld hosts

containerd prüft den Abschnitt hosts der Clusterkonfigurationsdatei, um zu ermitteln, welche Hosts lokal gespiegelt werden. In der Beispielkonfigurationsdatei sind die im Abschnitt hosts aufgeführten öffentlichen Registries somehost.io und otherhost.io. Da diese öffentlichen Registries im Abschnitt hosts angezeigt werden, prüft containerd die private Registry-Spiegelung erst, wenn Pull-Anfragen für Images von somehost.io oder otherhost.io auftreten.

Angenommen, containerd empfängt einen Pull-Befehl an somehost.io/kubernetes-e2e-test-images/nautilus:1.0. Da somehost.io als einer der Hosts im Abschnitt hosts der Clusterkonfigurationsdatei aufgeführt ist, sucht containerd in der lokalen Registry-Spiegelung nach dem kubernetes-e2e-test-images/nautilus:1.0-Image. Wenn somehost.io nicht im Abschnitt hosts aufgeführt ist, weiß containerd nicht, dass eine lokale Spiegelung von somehost.io vorhanden ist. In diesem Fall prüft containerd nicht die Spiegelung auf das Image und ruft das Image einfach aus der öffentlichen Registry somehost.io ab.

Beachten Sie, dass Google Distributed Cloud standardmäßig Images von gcr.io spiegelt, sodass Sie gcr.io nicht als Host im Abschnitt hosts auflisten müssen.

Feld gcrKeyPath

Wenn Sie möchten, dass Google Distributed Cloud Container Registry automatisch (gcr.io) verwendet, um Images abzurufen, die nicht in Ihrer lokalen Registry angezeigt werden, müssen Sie den Pfad zum Container Registry-Dienstkontoschlüssel angeben. Google Distributed Cloud hat keinen Mechanismus, um Schlüssel für andere öffentliche Registries bereitzustellen.

Wenn Sie nicht vorhaben, die Funktion zu verwenden, bei der Images aus gcr.io abgerufen werden, wenn sie nicht in Ihrer lokalen Registry angezeigt werden, müssen Sie keinen gcrKeyPath in der Cluster-Konfigurationsdatei hinzufügen.

Feld caCertPath

Wenn für Ihre Registry ein privates TLS-Zertifikat (Transport Layer Security) erforderlich ist, wird in diesem Feld der Pfad zur Stammzertifizierungsstellen-Zertifikatsdatei des Servers verwendet. Diese Zertifikatsdatei sollte sich auf der Administrator-Workstation befinden, also auf dem Computer, auf dem bmctl-Befehle ausgeführt werden. Wenn Ihre Registry kein privates TLS-Zertifikat erfordert, können Sie das Feld caCertPath leer lassen.

Feld pullCredentialConfigPath

Wenn Ihr Registry-Server keine Docker-Konfigurationsdatei zur Authentifizierung erfordert, können Sie das Feld pullCredentialConfigPath leer lassen. Hinweis: Dies ist der Pfad zur Konfigurationsdatei auf dem Computer, auf dem bmctl-Befehle ausgeführt werden.

Registry-Spiegelung mit Nutzerclustern verwenden

Nutzercluster rufen Images nicht automatisch von einer Registry-Spiegelung ab, wenn ihr Administratorcluster für sie konfiguriert wurde. Wenn Sie Nutzercluster aus einer Registry-Spiegelung abrufen möchten, müssen Sie sie einzeln konfigurieren, wie unter Cluster für die Verwendung einer Registry-Spiegelung konfigurieren beschrieben.

Registry-Spiegelungs-Endpunkte, Zertifikate und Pull-Anmeldedaten aktualisieren

So aktualisieren Sie Endpunkte, Zertifikate oder Pull-Anmeldedaten für die Registry-Spiegelung:

  1. Aktualisieren Sie in der Clusterkonfigurationsdatei den Endpunkt, die CA-Zertifikatsdatei und den Pfad zur Konfigurationsdatei für die Pull-Anmeldedaten.

  2. Übernehmen Sie die Änderungen mit dem folgenden Befehl:

    bmctl update cluster -c CLUSTER_NAME --kubeconfig=ADMIN_KUBECONFIG
    

    Ersetzen Sie Folgendes:

    • CLUSTER_NAME durch den Namen des Clusters, den Sie aktualisieren möchten.

    • ADMIN_KUBECONFIG durch den Pfad der Konfigurationsdatei seines Administratorclusters.

Abrufen von Images aus der Registry-Spiegelung prüfen

Sie können feststellen, ob containerd Images aus Ihrer lokalen Registry abruft. Prüfen Sie dazu den Inhalt einer Datei config.toml:

  1. Melden Sie sich bei einem Knoten an und prüfen Sie den Inhalt der folgenden Datei: /etc/containerd/config.toml.

  2. Überprüfen Sie im Abschnitt plugins."io.containerd.grpc.v1.cri".registry.mirrors der Datei config.toml, ob Ihr Registry-Server im Feld endpoint aufgeführt ist. Hier ein Auszug aus der Beispieldatei config.toml, in der das Feld endpoint fett dargestellt wird:

    version = 2
    root = "/var/lib/containerd"
    state = "/run/containerd"
    ...
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."gcr.io"]
          [plugins."io.containerd.grpc.v1.cri".registry.configs."privateregistry2.io".tls]
            ca_file = '/etc/containerd/certs.d/privateregistry2.io/ca.crt'
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
          endpoint = ["http://privateregistry.io", "http://privateregistry2.io"]
    ...
    

    Wenn Ihre Registry-Spiegelung im Feld endpoint angezeigt wird, ruft der Knoten Images aus Ihrer Registry-Spiegelung und nicht aus einer öffentlichen Registry ab.