Installieren von Harbor für die Dienstregistrierung

In diesem Thema wird die Bereitstellung von Harbor in einem Arbeitslastcluster oder einem Cluster für gemeinsam genutzte Dienste in Tanzu Kubernetes Grid erläutert.

Hinweis

In vSphere with Tanzu können Sie Harbor auf einem Supervisor installieren, wie unter Installieren und Konfigurieren von Harbor auf einem Supervisor beschrieben, oder Harbor in einzelnen Arbeitslastclustern installieren, wie unten beschrieben.
Da Supervisor-Dienste gemeinsam genutzt werden, bietet vSphere with Tanzu keine Unterstützung für die Bereitstellung von Paketen in einem separaten Cluster für gemeinsam genutzte Dienste.

Notary und Chartmuseum sind in Harbor v2.6 veraltet und werden in einer zukünftigen Version entfernt, wie in den Versionshinweisen zu Harbor v2.6.0 beschrieben. Benutzer sollten zur Containersignierung und -überprüfung zu Sigstore Cosign wechseln.

Harbor

Bei Harbor handelt es sich um eine vertrauenswürdige, cloudnative Open Source-Container-Registrierung, in der Inhalte gespeichert, signiert und gescannt werden. Tanzu Kubernetes Grid enthält signierte, gepackte Binärdateien für Harbor, die Sie in einem Arbeitslastcluster bereitstellen können, um Container-Registrierungsdienste für diesen Cluster zur Verfügung zu stellen. Dieses Harbor-Paket erweitert die Open Source-Docker-Distribution um die in der Regel von Benutzern benötigten Funktionen, wie z. B. Sicherheit und Identitätssteuerung und -verwaltung.

Tanzu Kubernetes Grid enthält signierte Binärdateien für Harbor, die Sie in folgenden Clustern bereitstellen können.

  • Einem Arbeitslastcluster zur Bereitstellung von Containerregistrierungsdiensten für diese Cluster
  • Einem Cluster für gemeinsam genutzte Dienste zur Bereitstellung von Containerregistrierungsdiensten für andere Arbeitslastcluster in einer Bereitstellung mit einem eigenständigen Verwaltungscluster.

Wenn Harbor als gemeinsam genutzter Dienst bereitgestellt wird, ist er für alle Arbeitslastcluster verfügbar, die vom selben eigenständigen Verwaltungscluster verwaltet werden. Zur Implementierung von Harbor als gemeinsam genutzten Dienst stellen Sie ihn in einem speziellen Cluster bereit, der für die Ausführung gemeinsam genutzter Dienste reserviert ist. Jeder Verwaltungscluster kann nur über einen Cluster für gemeinsam genutzte Dienste verfügen.

Harbor-Registrierung und ExternalDNS

VMware empfiehlt die Installation von ExternalDNS gemeinsam mit der Harbor-Registrierung in Infrastrukturen mit Lastausgleich, insbesondere in Produktions- oder anderen Umgebungen, in denen die Verfügbarkeit von Harbor wichtig ist.

Wenn sich die IP-Adresse des Ingress-Lastausgleichsdiensts ändert, übernimmt ExternalDNS die Änderung automatisch und ordnet die neue Adresse dem Harbor-Hostnamen erneut zu. Damit entfällt die Notwendigkeit zur manuellen Neuzuordnung der Adresse (siehe Beschreibung unter Herstellen einer Verbindung zur Harbor-Benutzeroberfläche).

Voraussetzungen

Hinweis

Sie können die Proxy-Cache-Funktion von Harbor nicht verwenden, um Tanzu Kubernetes Grid v2.2 in einer Umgebung mit Internetbeschränkungen auszuführen. Sie können weiterhin einen Harbor-Proxy-Cache verwenden, um Images aus früheren Versionen von Tanzu Kubernetes Grid und Nicht-Tanzu-Images wie Anwendungs-Images zu übermitteln.

Vorbereiten eines Clusters für die Harbor-Bereitstellung

So bereiten Sie einen Cluster für die Harbor-Bereitstellung vor:

  1. Legen Sie den Kontext von kubectl auf den Arbeitslastcluster oder den Cluster für gemeinsam genutzte Dienste fest. Beispiel:

    kubectl config use-context tkg-services-admin@tkg-services
    
  2. Wenn der Cluster nicht über ein Paket-Repository mit installiertem Harbor-Paket verfügt, wie z. B. das tanzu-standard-Repository, installieren Sie es:

    Hinweis

    Wenn Sie einen planbasierten Cluster (Legacy) als Ziel verwenden, überspringen Sie diesen Schritt. Für planbasierte Cluster wird das tanzu-standard-Paket-Repository automatisch in jedem Cluster im Namespace tanzu-package-repo-global aktiviert.

    tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
    

    Dabei gilt:

    • PACKAGE-REPO-NAME ist der Name des Paket-Repositorys, wie z. B. tanzu-standard, oder der Name einer privaten Image-Registrierung, die mit ADDITIONAL_IMAGE_REGISTRY-Variablen konfiguriert ist.
    • PACKAGE-REPO-ENDPOINT ist die URL des Paket-Repositorys.

      • Für diese Version lautet die tanzu-standard-URL auf projects.registry.vmware.com/tkg/packages/standard/repo:v2.2.0. Informationen zum Abrufen dieses Werts über die Tanzu CLI finden Sie unter Listen von Paketrepositorys oder in Tanzu Mission Control in der Liste Add-Ons (Addons) > Repositorys (Repositories) im Fensterbereich Cluster.
  3. Wenn Sie dies noch nicht getan haben, installieren Sie cert-manager und Contour-Pakete im Cluster. Anweisungen finden Sie unter Installieren von Contour für die Ingress-Steuerung.

  4. (Optional) Installieren Sie das ExternalDNS-Paket. Anweisungen finden Sie unter Installieren von ExternalDNS für die Diensterkennung.

  5. Fahren Sie mit Bereitstellen von Harbor in einem Cluster im Folgenden fort.

Bereitstellen von Harbor in einem Cluster

Führen Sie dieses Verfahren durch, um Harbor in einem Arbeitslastcluster oder einem Cluster für gemeinsam genutzte Dienste bereitzustellen:

  1. Bestätigen Sie, dass das Harbor-Paket im Cluster verfügbar ist:

    tanzu package available list -A
    
  2. Rufen Sie die Version des verfügbaren Pakets ab:

    tanzu package available list harbor.tanzu.vmware.com -A
    
  3. Laden Sie das Harbor-Paket aus dem Paket-Repository standard herunter:

    imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:PACKAGE-VERSION -o /tmp/harbor-package-PACKAGE-VERSION
    

    Dabei ist PACKAGE-VERSION die Version des Pakets, wie durch tanzu package available list aufgelistet, aber mit dem Zeichen _ anstelle des Zeichens +. Sie muss auch das Präfix v enthalten. Beispiel: v2.7.1_vmware.1-tkg.1.

    Beispiel:

    imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:v2.7.1_vmware.1-tkg.1 -o /tmp/harbor-package-v2.7.1_vmware.1-tkg.1
    
    1. Legen Sie die obligatorischen Kennwörter und geheimen Schlüssel in der Datei harbor-data-values.yaml fest, indem Sie einen der folgenden Schritte ausführen:

      • Führen Sie zum automatischen Erzeugen zufälliger Kennwörter und geheimer Schlüssel folgenden Befehl aus:

        image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.PACKAGE-VERSION -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
        imgpkg pull -b $image_url -o /tmp/harbor-package-PACKAGE-VERSION
        
        cp /tmp/harbor-package-PACKAGE-VERSION/config/values.yaml harbor-data-values.yaml
        
        bash /tmp/harbor-package-PACKAGE-VERSION/config/scripts/generate-passwords.sh harbor-data-values.yaml
        

        Dabei gilt: PACKAGE-VERSION ist die Version des zu installierenden Harbor-Pakets.

        Führen Sie für das Harbor-Paket v2.7.1 beispielsweise folgenden Befehl aus:

        image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.2.7.1+vmware.1-tkg.1 -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
        imgpkg pull -b $image_url -o /tmp/harbor-package-2.7.1
        bash /tmp/harbor-package-2.7.1/config/scripts/generate-passwords.sh harbor-data-values.yaml
        
      • Aktualisieren Sie die folgenden Einträge in der Datei harbor-data-values.yaml, um eigene Kennwörter und geheime Schlüssel festzulegen:

        • harborAdminPassword
        • secretKey
        • database.password
        • core.secret
        • core.xsrfKey
        • jobservice.secret
        • registry.secret
    2. Geben Sie weitere Einstellungen in der Datei harbor-data-values.yaml an.

      • Legen Sie die Einstellung hostname auf den Hostnamen fest, den Sie für den Zugriff auf Harbor verwenden möchten. Beispiel: harbor.yourdomain.com.
      • Aktualisieren Sie zum Verwenden eigener Zertifikate die Einstellungen tls.crt, tls.key und ca.crt mit den Inhalten des Zertifikats, Schlüssels und CA-Zertifikats. Das Zertifikat kann von einer vertrauenswürdigen Zertifizierungsstelle signiert oder selbstsigniert sein. Wenn Sie dieses Feld leer lassen, erzeugt Tanzu Kubernetes Grid automatisch ein selbstsigniertes Zertifikat.
      • Wenn Sie das Skript generate-passwords.sh verwendet haben, aktualisieren Sie das harborAdminPassword optional mit einer Zeichenfolge, die Sie sich leichter merken können.
      • Nicht leere Werte werden für Folgendes benötigt:

        • storageClass: Legen Sie unter persistence.persistentVolumeClaim für registry, jobservice, database, redis und trivy die storageClass auf ein von kubectl get sc zurückgegebenes Speicherprofil fest.
        Hinweis

        Mit der Speicherklasse azure-file können Sie die Dateisystemberechtigungen nicht ändern, nachdem die Festplatte bereitgestellt wurde. Der Grund dafür ist ein Azure-Problem, das unter Fehler „Berechtigungen konnten nicht geändert werden“ bei Verwendung von Azure Files in der Azure-Dokumentation beschrieben ist.

        • pspNames: Legen Sie pspNames auf PSP-Werte fest, die von kubectl get psp zurückgegeben werden, wie z. B. "vmware-system-restricted,vmware-system-privileged".
      • Aktualisieren Sie optional weitere persistence-Einstellungen, um anzugeben, wie Daten in Harbor gespeichert werden.

        Wenn Sie sehr viele Container-Images in Harbor speichern müssen, legen Sie persistence.persistentVolumeClaim.registry.size auf eine größere Anzahl fest.

      Zum Anzeigen weiterer Informationen zu den Werten in der Datei harbor-data-values.yaml führen Sie den folgenden Befehl für Ihren Zielcluster aus:

      tanzu package available get harbor.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
      

      Dabei gilt: AVAILABLE-VERSION ist die Version des Harbor-Pakets. Das Flag --values-schema ruft den Abschnitt valuesSchema aus der API-Ressource Package für das Harbor-Paket ab. Sie können das Ausgabeformat --output für das Werteschema auf yaml, json oder table festlegen.

      Beispiel:

      tanzu package available get harbor.tanzu.vmware.com/2.7.1+vmware.1-tkg.1 --values-schema
      
    3. Entfernen Sie alle Kommentare in der Datei harbor-data-values.yaml:

      yq -i eval '... comments=""' harbor-data-values.yaml
      
  4. Installieren des Pakets:

    tanzu package install harbor \
    --package harbor.tanzu.vmware.com \
    --version AVAILABLE-PACKAGE-VERSION \
    --values-file harbor-data-values.yaml \
    --namespace TARGET-NAMESPACE
    

    Dabei gilt:

    • TARGET-NAMESPACE ist der Namespace, in dem das Harbor-Paket installiert werden soll. Beispielsweise der Namespace my-packages oder tanzu-cli-managed-packages.

      • Wenn das Flag --namespace nicht angegeben ist, installiert die Tanzu CLI das Paket und zugehörige Ressourcen im Namespace default. Die Harbor-Pods und alle anderen mit der Harbor-Komponente verknüpften Ressourcen werden im Namespace tanzu-system-registry erstellt. Installieren Sie das Harbor-Paket nicht in diesem Namespace.
      • Der angegebene Namespace muss bereits vorhanden sein, wie z. B. durch die Ausführung von kubectl create namespace my-packages.
    • AVAILABLE-PACKAGE-VERSION ist die oben abgerufene Version.

    Beispiel:

    tanzu package install harbor \
    --package harbor.tanzu.vmware.com \
    --version 2.7.1+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    
  5. Bestätigen Sie, dass das Paket harbor installiert wurde:

    tanzu package installed list -A
    

    Sie können auch folgenden Befehl ausführen, um weitere Paketdetails anzuzeigen:

    tanzu package installed get harbor --namespace PACKAGE-NAMESPACE
    

    Dabei gilt: PACKAGE-NAMESPACE ist der Namespace, in dem das harbor-Paket installiert ist.

  6. Bestätigen Sie, dass die harbor-App erfolgreich in Ihrem PACKAGE-NAMESPACE abgeglichen wurde:

    kubectl get apps -A
    

    Lautet der Status nicht Reconcile Succeeded, zeigen Sie die vollständigen Statusdetails der App harbor an. Die Anzeige des vollständigen Status kann Sie bei der Behebung des Problems unterstützen.

    kubectl get app harbor --namespace PACKAGE-NAMESPACE -o yaml
    

    Dabei gilt: PACKAGE-NAMESPACE ist der Namespace, in dem Sie das Paket installiert haben. Wenn das Problem nicht behoben werden kann, müssen Sie das Paket zunächst deinstallieren und dann erneut installieren:

    tanzu package installed delete harbor --namespace PACKAGE-NAMESPACE
    
  7. Bestätigen Sie, dass die Harbor-Dienste ausgeführt werden, indem Sie alle Pods im Cluster auflisten:

    kubectl get pods -A
    

    Im Namespace tanzu-system-registry sollten die Dienste harbor core, database, jobservice, notary, portal, redis, registry und trivy in einem Pod mit Namen ähnlich den folgenden ausgeführt werden:

    NAMESPACE               NAME                                    READY   STATUS    RESTARTS   AGE
    [...]
    tanzu-system-ingress    contour-6b568c9b88-h5s2r                1/1     Running   0          26m
    tanzu-system-ingress    contour-6b568c9b88-mlg2r                1/1     Running   0          26m
    tanzu-system-ingress    envoy-wfqdp                             2/2     Running   0          26m
    tanzu-system-registry   harbor-core-557b58b65c-4kzhn            1/1     Running   0          23m
    tanzu-system-registry   harbor-database-0                       1/1     Running   0          23m
    tanzu-system-registry   harbor-jobservice-847b5c8756-t6kfs      1/1     Running   0          23m
    tanzu-system-registry   harbor-notary-server-6b74b8dd56-d7swb   1/1     Running   2          23m
    tanzu-system-registry   harbor-notary-signer-69d4669884-dglzm   1/1     Running   2          23m
    tanzu-system-registry   harbor-portal-8f677757c-t4cbj           1/1     Running   0          23m
    tanzu-system-registry   harbor-redis-0                          1/1     Running   0          23m
    tanzu-system-registry   harbor-registry-85b96c7777-wsdnj        2/2     Running   0          23m
    tanzu-system-registry   harbor-trivy-0                          1/1     Running   0          23m
    [...]
    
  8. Rufen Sie das Harbor-CA-Zertifikat aus dem geheimen Schlüssel harbor-tls im Namespace tanzu-system-registry ab:

    kubectl -n tanzu-system-registry get secret harbor-tls -o=jsonpath="{.data.ca\.crt}" | base64 -d
    

    Zeichnen Sie die Ausgabe für den folgenden Schritt auf

  9. Wenn die Harbor-Registrierung eine selbstsignierte Zertifizierungsstelle verwendet, fügen Sie sie zu Arbeitslastclustern hinzu, indem Sie das entsprechende Verfahren verwenden, das auf der Bereitstellung des Clusters basiert:

Herstellen einer Verbindung zur Harbor-Benutzeroberfläche

Die Harbor-Benutzeroberfläche wird über den Lastausgleichsdienst des Envoy-Diensts zur Verfügung gestellt, der im Namespace tanzu-system-ingress im Cluster ausgeführt wird. Damit Benutzer eine Verbindung zur Harbor-Benutzeroberfläche herstellen können, müssen Sie die Adresse des Lastausgleichsdiensts des Envoy-Diensts dem Hostnamen des Harbor-Diensts zuordnen, wie z. B. harbor.yourdomain.com.

  1. Rufen Sie die Adresse des Lastausgleichsdiensts des Envoy-Diensts ab.

    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
    

    In vSphere ohne NSX Advanced Load Balancer (ALB) wird der Envoy-Dienst über NodePort und nicht über LoadBalancer zur Verfügung gestellt, sodass die obige Ausgabe leer ist und Sie stattdessen die IP-Adresse eines beliebigen Worker-Knotens im Cluster verwenden können. In vSphere mit NSX ALB verfügt der Envoy-Dienst über eine Lastausgleichsdienst-IP-Adresse ähnlich 20.54.226.44.

  2. Ordnen Sie die Adresse des Lastausgleichsdiensts des Envoy-Diensts dem Hostnamen des Harbor-Diensts zu. Für Cluster unter vSphere müssen Sie eine Zuordnung von IP zu Hostname in /etc/hosts oder entsprechende A-Datensätze in Ihrem DNS-Server hinzufügen. Wenn die IP-Adresse beispielsweise 10.93.9.100 lautet, fügen Sie Folgendes zu /etc/hosts hinzu:

    10.93.9.100 harbor.yourdomain.com notary.harbor.yourdomain.com
    

    /etc/hosts/ entspricht auf Windows-Maschinen C:\Windows\System32\Drivers\etc\hosts.

Benutzer können sich jetzt mit der Harbor-Benutzeroberfläche verbinden, indem sie zu https://harbor.yourdomain.com in einem Webbrowser navigieren und sich als Benutzer admin mit dem harborAdminPassword anmelden, das in harbor-data-values.yaml konfiguriert wurde.

Weitergeben und Abrufen von Images an und von Harbor

Nach der Einrichtung von Harbor können Sie Images an Harbor weitergeben, um sie für den Abruf durch das Cluster zur Verfügung zu stellen.

  1. Wenn Harbor ein selbstsigniertes Zertifikat verwendet, laden Sie das Harbor-CA-Zertifikat unter https://harbor.yourdomain.com/api/v2.0/systeminfo/getcert herunter und installieren Sie es auf Ihrem lokalen Computer, damit Docker diesem CA-Zertifikat vertrauen kann.

    • Speichern Sie das Zertifikat unter Linux als /etc/docker/certs.d/harbor.yourdomain.com/ca.crt.
    • Führen Sie auf macOS dieses Verfahren aus.
    • Klicken Sie in Windows mit der rechten Maustaste auf die Zertifikatsdatei und wählen Sie Zertifikat installieren (Install Certificate) aus.
  2. Melden Sie sich mit dem Benutzer admin bei der Harbor-Registrierung an. Geben Sie bei Aufforderung das harborAdminPassword ein, das Sie bei der Installation des Harbor-Pakets im Cluster festgelegt haben.

    docker login harbor.yourdomain.com -u admin
    
  3. Kennzeichnen Sie ein vorhandenes Image, das Sie bereits lokal abgerufen haben, wie z. B. nginx:1.7.9.

    docker tag nginx:1.7.9 harbor.yourdomain.com/library/nginx:1.7.9
    
  4. Geben Sie das Image an die Harbor-Registrierung weiter.

    docker push harbor.yourdomain.com/library/nginx:1.7.9
    
  5. Jetzt können Sie das Image aus der Harbor-Registrierung auf allen Maschinen abrufen, auf denen das Harbor-CA-Zertifikat installiert ist.

    docker pull harbor.yourdomain.com/library/nginx:1.7.9
    

Aktualisieren einer ausgeführten Harbor-Bereitstellung

Wenn Sie nach der Bereitstellung Änderungen an der Konfiguration des Harbor-Pakets vornehmen müssen, führen Sie diese Schritte aus, um das bereitgestellte Harbor-Paket zu aktualisieren.

  1. Aktualisieren Sie die Harbor-Konfiguration in harbor-data-values.yaml. Sie können beispielsweise die Menge des Registrierungsspeichers erhöhen, indem Sie den Wert persistence.persistentVolumeClaim.registry.size aktualisieren.

  2. Aktualisieren Sie die Konfiguration des installierten Pakets:

    tanzu package installed update harbor \
    --version INSTALLED-PACKAGE-VERSION \
    --values-file harbor-data-values.yaml \
    --namespace INSTALLED-PACKAGE-NAMESPACE
    

    Dabei gilt:

    • INSTALLED-PACKAGE-VERSION ist die Version des installierten Harbor-Pakets.
    • INSTALLED-PACKAGE-NAMESPACE ist der Namespace, in dem das Harbor-Paket installiert ist.

    Beispiel:

    tanzu package installed update harbor \
    --version 2.7.1+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    

Das Harbor-Paket wird mit dem neuen Wert oder den von Ihnen hinzugefügten Werten abgeglichen. Es kann bis zu fünf Minuten dauern, bis kapp-controller die Änderungen übernommen hat.

Weitere Informationen zum Befehl tanzu package installed update finden Sie unter Aktualisieren eines Pakets in Installieren und Verwalten von Paketen. Sie können diesen Befehl verwenden, um die Version und die Konfiguration eines installierten Pakets zu aktualisieren.

Hinweis

Wenn Sie das Harbor-Paket auf v2.7.1 aktualisieren möchten und zuvor das Harbor Scandata Volume EmptyDir Overlay auf das Paket angewendet haben, müssen Sie die Overlay-Anmerkung aus der PackageInstall-Ressource in Harbor entfernen, bevor Sie die Paketversion aktualisieren. Sie können die Anmerkung entweder manuell oder durch Ausführen von kubectl -n MY-PACKAGES-NAMESPACE annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0- entfernen, wobei MY-PACKAGES-NAMESPACE der Namespace der PackageInstall-Ressource ist.

check-circle-line exclamation-circle-line close-line
Scroll to top icon