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

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 das standard-Paket-Repository noch nicht auf dem Cluster installiert ist, 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 tanzu-standard --url PACKAGE-REPOSITORY-ENDPOINT --namespace tkg-system
    

    Dabei ist PACKAGE-REPOSITORY-ENDPOINT die URL des Paket-Repositorys standard. Für diese Version lautet die URL projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1.

    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.6.3_vmware.1-tkg.1.

    Beispiel:

    imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:v2.6.3_vmware.1-tkg.1 -o /tmp/harbor-package-v2.6.3_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.6.3 beispielsweise folgenden Befehl aus:

        image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.2.6.3+vmware.1-tkg.1 -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
        imgpkg pull -b $image_url -o /tmp/harbor-package-2.6.3
        bash /tmp/harbor-package-2.6.3/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.6.3+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.6.3+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    
  5. Wenn Sie ebs.csi.aws.com als storageClass verwenden, gehen Sie wie folgt vor:

    • Ändern Sie die Speicherklasse VolumeBoundMode von Immediate in WaitForFirstConsumer.

      • Beachten Sie, dass es sich hierbei um einen clusterweiten Vorgang handelt, der neben Harbor auch andere Dienste betreffen kann.
    • Patchen Sie das Harbor Scandata Volume EmptyDir Overlay folgendermaßen. Dieses Overlay verwandelt das Scandata-Volume in ein leeres Verzeichnis, um die Scandata-Exportfunktion nicht zu beeinträchtigen und einen AZ-Konflikt zu vermeiden, wenn das jobLog- und scandata-Volume im selben Jobservice-Pod bereitgestellt werden:

      1. Erstellen Sie eine Datei scandata-empty-dir-overlay.yaml mit dem unten stehenden Code für Harbor Scandata Volume EmptyDir Overlay.

      2. Erstellen Sie einen generischen geheimen Schlüssel mit dem Overlay:

        kubectl -n test  create secret generic scandata-empty-dir-overlay -o yaml --dry-run=client --from-file=scandata-emptyDir-overlay.yaml | kubectl apply -f -
        
      3. Patchen Sie das Harbor-Paket mit dem geheimen Schlüssel:
        kubectl -n test annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0=scandata-empty-dir-overlay
        
      4. Überprüfen Sie, ob der Paketstatus auf isReconciling lautet:
        kubectl get pkgi harbor -n my-packages
        
      5. Wenn der Paketstatus nicht isReconciling lautet, löschen Sie die vorhandenen Harbor-Pods, damit sie neu erstellt werden:
        kubectl delete pods --all -n my-packages
        
  6. 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.

  7. 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
    
  8. 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
    [...]
    
  9. 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
    

    Erstellen Sie eine Kopie der Ausgabe.

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.6.3+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.

Harbor Scandata Volume EmptyDir Overlay

scandata-empty-dir-overlay.yaml:

#@ load("@ytt:overlay", "overlay")
​
#@overlay/match by=overlay.and_op(overlay.subset({"kind": "Deployment"}), overlay.subset({"metadata": {"name": "harbor-jobservice"}}))
---
spec:
  template:
    spec:
      volumes:
        #@overlay/match by="name"
        #@overlay/remove
        - name: job-scandata-exports
        #@overlay/append
        - name: job-scandata-exports
          emptyDir:
            sizeLimit: 500Mi
check-circle-line exclamation-circle-line close-line
Scroll to top icon