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.
HinweisIn 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.
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.
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.
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).
kubectl
und die Carvel-Tools installiert. Anweisungen finden Sie unter Installieren der Tanzu CLI und anderer Tools zur Verwendung mit einem vSphere with Tanzu Supervisor oder Installieren der Tanzu CLI und anderer Tools für die Verwendung mit eigenständigen Verwaltungsclustern.tanzu login
angemeldet.So bereiten Sie einen Cluster für die Harbor-Bereitstellung vor:
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
Wenn das standard
-Paket-Repository noch nicht auf dem Cluster installiert ist, installieren Sie es:
HinweisWenn 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 Namespacetanzu-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.
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.
(Optional) Installieren Sie das ExternalDNS-Paket. Anweisungen finden Sie unter Installieren von ExternalDNS für die Diensterkennung.
Fahren Sie mit Bereitstellen von Harbor in einem Cluster im Folgenden fort.
Führen Sie dieses Verfahren durch, um Harbor in einem Arbeitslastcluster oder einem Cluster für gemeinsam genutzte Dienste bereitzustellen:
Bestätigen Sie, dass das Harbor-Paket im Cluster verfügbar ist:
tanzu package available list -A
Rufen Sie die Version des verfügbaren Pakets ab:
tanzu package available list harbor.tanzu.vmware.com -A
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
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
Geben Sie weitere Einstellungen in der Datei harbor-data-values.yaml
an.
hostname
auf den Hostnamen fest, den Sie für den Zugriff auf Harbor verwenden möchten. Beispiel: harbor.yourdomain.com
.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.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.HinweisMit 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
Entfernen Sie alle Kommentare in der Datei harbor-data-values.yaml
:
yq -i eval '... comments=""' harbor-data-values.yaml
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
.
--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.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
Wenn Sie ebs.csi.aws.com
als storageClass
verwenden, gehen Sie wie folgt vor:
Ändern Sie die Speicherklasse VolumeBoundMode
von Immediate
in WaitForFirstConsumer
.
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:
Erstellen Sie eine Datei scandata-empty-dir-overlay.yaml
mit dem unten stehenden Code für Harbor Scandata Volume EmptyDir Overlay.
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 -
kubectl -n test annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0=scandata-empty-dir-overlay
isReconciling
lautet:kubectl get pkgi harbor -n my-packages
isReconciling
lautet, löschen Sie die vorhandenen Harbor-Pods, damit sie neu erstellt werden:kubectl delete pods --all -n my-packages
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.
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
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
[...]
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.
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
.
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
.
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.
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.
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.
/etc/docker/certs.d/harbor.yourdomain.com/ca.crt
.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
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
Geben Sie das Image an die Harbor-Registrierung weiter.
docker push harbor.yourdomain.com/library/nginx:1.7.9
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
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.
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.
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.
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