Private Container-Register mit Harbor auf CREODIAS Kubernetes
Ein grundlegender Bestandteil des Container-Ökosystems sind Container-Registries, die für die Speicherung und Verteilung von Container-Images verwendet werden. Es gibt einige populäre öffentliche Container-Registries, die diesen Zweck in einem Software-as-a-Service-Modell erfüllen. Die meist verbreitete ist DockerHub.
In diesem Artikel verwenden wir Harbor, eine beliebte Open-Source-Lösung für die Ausführung privater Registraturen. Harbor ist konform mit der OCI (Open Container Initiative), was es für die Arbeit mit Standard-Container-Images geeignet macht. Es wird mit zahlreichen operationellen Funktionen ausgeliefert.
Vorteile der Verwendung Ihrer eigenen privaten Container-Registry
Wenn Sie Ihre eigene private Container-Registry einrichten, haben Sie u.a. folgende Vorteile:
volle Kontrolle über die Speicherung Ihrer Images und die Art des Zugriffs auf sie
Datenschutz für proprietäre und private Images
individuelle Konfiguration für Protokollierung, Authentifizierung usw.
Sie können auch die Option Rollenbasierte Zugriffskontrolle des Harbor-Projekts verwenden, um festzulegen, welche Benutzer Berechtigung haben, aktualisierte Images zu veröffentlichen bzw. die verfügbaren Images zu verwenden.
Was wir behandeln werden
Bereitstellung von Harbor Private Registry mit Bitnami-Harbor Helm Chart
Zugriff auf Harbor vom Browser aus
Verknüpfen Sie den A-Eintrag Ihrer Domain mit der IP-Adresse von Harbor.
Ein Projekt in Harbor erstellen
Erstellen Sie eine Dockerdatei für unser benutzerdefiniertes Image.
Erstellen einer vertrauensvollen (trusted) Verbindung von unserer lokalen Docker-Instanz
Unser Image lokal erstellen
Hochladen eines Docker-Images auf Ihre Harbor-Instanz
Herunterladen eines Docker-Images von Ihrer Harbor-Instanz
Voraussetzungen
Nr. 1 Konto
Sie benötigen ein CREODIAS Konto mit Horizon-Schnittstelle https://cloud.fra1-1.cloudferro.com/auth/login/?next=/.
Nr. 2 Ein Cluster auf der Creodias Cloud
Ein Kubernetes Cluster auf der Creodias Cloud erstellen Sie analog zu dem Artikel /kubernetes/How-to-Create-a-Kubernetes-Cluster-Using-Creodias-OpenStack-Magnum.
Nr. 3 kubectl operationell
kubectl CLI-Tool ist installiert und verweist über die Umgebungsvariable KUBECONFIG auf Ihren Cluster. Artikel /kubernetes/How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-Creodias-OpenStack-Magnum bietet weitere Anleitungen.
Nr. 4 Kenntnisse über den Einsatz von Helm-Karten
Siehe diesen Artikel:
Einsatz von Helm Charts auf Magnum Kubernetes-Clustern auf der CREODIAS FRA1-1 Cloud
Nr. 5 Eingetragene Domain
Sie sollten eine Domain besitzen, die Sie bei einem beliebigen Registrar (Domain-Reseller) erworben haben. Der Bezug einer Domain von Registrierstellen wird in diesem Artikel nicht behandelt.
Nr. 6 Nutzen Sie den DNS-Dienst in Horizon, um den Harbor-Dienst mit dem Domainnamen zu verknüpfen
Dies ist optional. Hier ist der Artikel mit detaillierten Informationen:
DNS als Dienst auf CREODIAS FRA1-1
Nr. 7 Docker ist auf Ihrem Rechner installiert
See /cloud/How-to-use-Docker-on-Creodias.
Einsatz von Harbor Private Registry mit Bitnami-Harbor Helm Chart
Der erste Schritt zur Bereitstellung der privaten Harbor-Registry besteht darin, einen dedizierten namespace zum Hosten der Harbor-Artefakte zu erstellen:
kubectl create ns harbor
Dann fügen wir das Bitnami-Repository zu Helm hinzu:
helm repo add bitnami https://charts.bitnami.com/bitnami
Dann bereiten wir eine Konfigurationsdatei vor, mit der wir verschiedene Parameter unserer Bereitstellung steuern können. Wenn Sie einen Überblick über alle möglichen Konfigurationsparameter haben möchten, können Sie die Standardkonfiguration values.yaml herunterladen:
helm show values bitnami/harbor > values.yaml
Sie sehen die Konfigurationsparameter mit
cat values.yaml
Um mit dem Artikel fortzufahren, verwenden Sie den Editor nano, um eine neue Datei harbor-values.yaml zu erstellen.
nano harbor-values.yaml
Fügen Sie den folgenden Inhalt ein:
externalURL: mysampledomain.info
nginx:
tls:
commonName: mysampledomain.info
adminPassword: Harbor12345
Mit diesen Einstellungen wird das Harbor-Portal als Dienst vom Typ LoadBalancer bereitgestellt, und die SSL-Terminierung wird an NGINX delegiert, das als Kubernetes-Pod bereitgestellt wird.
Warnung
Wir verwenden mysampledomain.info nur zu Demonstrationszwecken. Bitte ersetzen Sie diese durch eine echte Domain, die Sie besitzen, wenn Sie den Code in diesem Artikel ausführen.
Im Beispiel verwenden wir auch ein einfaches Passwort, das nach der ersten Anmeldung ersetzt werden kann.
Installieren Sie nun das Diagramm mit dem folgenden Befehl:
helm install harbor bitnami/harbor --values harbor-values.yaml -n harbor
Die Ausgabe sollte in etwa so aussehen:
NAME: harbor
LAST DEPLOYED: Tue Aug 1 15:48:44 2023
NAMESPACE: harbor-bitnami
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: harbor
CHART VERSION: 16.6.5
APP VERSION: 2.8.1
** Please be patient while the chart is being deployed **
1. Get the Harbor URL:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
Watch the status with: 'kubectl get svc --namespace harbor-bitnami -w harbor'
export SERVICE_IP=$(kubectl get svc --namespace harbor-bitnami harbor --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
echo "Harbor URL: http://$SERVICE_IP/"
2. Login with the following credentials to see your Harbor application
echo Username: "admin"
echo Password: $(kubectl get secret --namespace harbor-bitnami harbor-core-envvars -o jsonpath="{.data.HARBOR_ADMIN_PASSWORD}" | base64 -d)
Zugang zu Harbor vom Browser aus
Wenn Sie die vorherigen Schritte befolgt haben, sollten Sie in der Lage sein, auf das Harbor-Portal zuzugreifen. Mit dem folgenden Befehl werden alle bereitgestellten Dienste angezeigt:
kubectl get services -n harbor
Hier sind sie:
$ kubectl get services -n harbor-bitnami
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
harbor LoadBalancer 10.254.208.73 64.225.133.148 80:32417/TCP,443:31448/TCP,4443:31407/TCP 4h2m
harbor-chartmuseum ClusterIP 10.254.11.204 <none> 80/TCP 4h2m
harbor-core ClusterIP 10.254.209.231 <none> 80/TCP 4h2m
harbor-jobservice ClusterIP 10.254.228.203 <none> 80/TCP 4h2m
harbor-notary-server ClusterIP 10.254.189.61 <none> 4443/TCP 4h2m
harbor-notary-signer ClusterIP 10.254.81.205 <none> 7899/TCP 4h2m
harbor-portal ClusterIP 10.254.217.77 <none> 80/TCP 4h2m
harbor-postgresql ClusterIP 10.254.254.0 <none> 5432/TCP 4h2m
harbor-postgresql-hl ClusterIP None <none> 5432/TCP 4h2m
harbor-redis-headless ClusterIP None <none> 6379/TCP 4h2m
harbor-redis-master ClusterIP 10.254.137.87 <none> 6379/TCP 4h2m
harbor-registry ClusterIP 10.254.2.234 <none> 5000/TCP,8080/TCP 4h2m
harbor-trivy ClusterIP 10.254.249.99 <none> 8080/TCP 4h2m
Es würde den Rahmen dieses Artikels sprengen, den Zweck der verschiedenen Artefakte zu erklären. Der wichtigste Dienst, der uns in diesem Stadium interessiert, ist Harbor, der als LoadBalancer-Typ mit der öffentlichen IP 64.225.134.148 bereitgestellt wurde.
Verknüpfen Sie den A-Eintrag Ihrer Domain mit der IP-Adresse von Harbor
Der letzte Schritt besteht darin, den A-Eintrag Ihrer Domäne mit der IP-Adresse von Harbor zu verknüpfen.
- Erstellen oder bearbeiten Sie den A-Eintrag über Ihren Domain-Registrar
Die genauen Schritte variieren von einem Registrar zum anderen, so dass es den Rahmen dieses Artikels sprengen würde, sie zu erläutern.
- Erstellen oder bearbeiten Sie den A-Eintrag über den Dienst DNS, der in Ihrem Konto CREODIAS verfügbar ist.
Dies wird in Voraussetzung Nr. 6 erklärt. Verwenden Sie die Befehle DNS –> Zonen und wählen Sie den Namen der Website, die Sie anstelle von mysampledomain.info verwenden, und klicken Sie dann auf Eintragssätze. In der Spalte Typ finden Sie den Typ A - Adressdatensatz und klicken Sie auf das Feld Aktualisieren auf der rechten Seite, um den Wert in dieser Zeile einzugeben oder zu ändern:

In diesem Screenshot ist der Wert 64.225.134.148 bereits in das Feld Update eingetragen - Sie werden hier natürlich Ihren eigenen IP-Wert eingeben.
Nach Abschluss der obigen Schritte können Sie von der erwarteten URL aus auf harbor zugreifen, in unserem Fall: https://mysampledomain.info. Da das Diagramm selbstsignierte Zertifikate erzeugt hat, müssen Sie zunächst die vom Browser ausgegebene Warnung “ Not Secure “ akzeptieren:

Bemerkung
Diese Warnung ist von Browser zu Browser unterschiedlich.
Um sich bei Ihrer Instanz anzumelden, verwenden Sie die folgenden Anmeldedaten
login
admin
password
Harbor12345
Ein Projekt in Harbor erstellen
Wenn Sie sich bei Harbor anmelden, gelangen Sie in den Bereich Projects.:

Ein Projekt in Harbor ist ein separater Bereich, in dem Container platziert werden können. Ein Image muss in einem Bereich eines bestimmten Projekts platziert werden. Als Harbor-Administrator können Sie auch Rollenbasierte Zugriffskontrolle auf der Harbor-Projektebene anwenden, so dass nur bestimmte Benutzer auf einen Bereich eines bestimmten Projekts zugreifen oder bestimmte Operationen durchführen können.
Um ein neues Projekt zu erstellen, klicken Sie auf die Schaltfläche Neues Projekt. In diesem Artikel werden wir ein public image hochladen, auf das jeder zugreifen kann, und es einfach myproject nennen:

Erstellen einer Dockerdatei für unser benutzerdefiniertes Image
Der Harbor-Dienst läuft und wir können ihn zum Hochladen unserer Docker-Images verwenden. Wir werden ein minimales Image erzeugen, also erstellen Sie einfach einen leeren Ordner mit dem Namen helloharbor und einer einzigen Docker-Datei (Dockerfile)
Dockerfile erzeugen
mkdir helloharbor
cd helloharbor
nano Dockerfile
mit dem Inhalt:
FROM alpine
CMD ["/bin/sh", "-c", "echo 'Hello Harbor!'"]
Trusted Verbindung von unserer lokalen Docker-Instanz sicherstellen
Um in weiteren Schritten unser Docker-Image zu erstellen und dieses Image zu Harbor hochzuladen, müssen wir die Kommunikation unserer lokalen Docker-Instanz mit Harbor sicherstellen. Um dieses Ziel zu erreichen, gehen wir wie folgt vor:
Docker-Trust sicherstellen - Schritt 1. Umgehen der Docker-Validierung des Domänenzertifikats
Umgehen Sie die Validierung des Domänenzertifikats durch Docker, das auf die Harbor-Domäne verweist. Docker würde diesem Zertifikat nicht vertrauen, da es selbstsigniert ist. Um diese Validierung zu umgehen, erstellen Sie eine Datei namens daemon.json im Verzeichnis /etc/docker auf Ihrem lokalen Rechner:
sudo chmod 777 /etc/docker
Da Sie sudo verwenden, werden Sie ggf. aufgefordert, das Passwort einzugeben. Erstellen Sie nun die Datei:
nano /etc/docker/daemon.json
und mit dem u.a. Inhalt ausfüllen, dann speichern mit Ctrl-X, Y:
{
"insecure-registries" : [ "mysampledomain.info" ]
}
Ersetzen Sie wie immer mysampledomain.info durch Ihre eigene Domain.
Für die Produktion sollten Sie ein eigenes HTTPS-Zertifikat für die Domäne einrichten.
Sicherstellen des Vertrauens von Docker - Schritt 2. Sicherstellen, dass Docker der Zertifizierungsstelle des Hafens vertraut
Dazu laden wir die Datei ca.crt von unserer Harbor-Portalinstanz aus der Projektansicht myproject herunter:

Die genaue Art und Weise der Installation des Zertifikats hängt von der Umgebung ab, in der Sie Docker ausführen:
- Installation des Zertifikats unter Linux
Erstellen Sie einen verschachtelten Verzeichnispfad /etc/docker/certs.d/mysampledomain.info und laden Sie in diesen Ordner die Datei ca.crt hoch:
sudo mkdir -p /etc/docker/certs.d/mysampledomain.info sudo cp ~/ca.crt /etc/docker/certs.d/mysampledomain.info
- Installieren Sie das Zertifikat auf WSL2 unter Windows 10 oder 11
Auf der WSL2 müssen Sie das Zertifikat in folgender Reihenfolge in den Windows ROOT CA-Speicher hochladen:
Klicken Sie auf Start und geben Sie Computerzertifikate verwalten ein.
Klicken Sie mit der rechten Maustaste auf Vertrauenswürdige Stammzertifizierungsstellen, dann auf Alle Aufgaben und Importieren.
Navigieren Sie zum Speicherort der Datei ca.crt und drücken Sie dann weiter auf Next, um den Assistenten abzuschließen
Starten Sie Docker über das Menü Docker Desktop neu.
Sicherstellen von Docker-Trust - Schritt 3. Docker neu starten
Starten Sie Docker neu mit:
sudo systemctl restart docker
Unser Image lokal aufbauen
Nach diesen Schritten können wir unser Image markieren und lokal erstellen (von dem Ort aus, an dem sich die Dockerdatei befindet):
docker build -t mysampledomain.info/myproject/helloharbor .
Als Nächstes können wir uns im Harbor-Portal mit unserem admin-Login und dem Passwort Harbor12345 anmelden:
docker login mysampledomain.info
Laden Sie ein Docker-Image auf Ihre Harbor-Instanz hoch
Zum Schluss pushen Sie das Image in das Repository:
docker push mysampledomain.info/myproject/helloharbor
Das Ergebnis wird in etwa wie folgt aussehen:

Laden Sie ein Docker-Image von Ihrer Harbor-Instanz herunter
Um das Herunterladen von Images aus unserem Harbor-Repository zu demonstrieren, können wir zunächst das lokale Docker-Image löschen, das wir zuvor erstellt haben.
docker image rm mysampledomain.info/myproject/helloharbor
Um dies zu überprüfen, sehen Sie sich an, dass es nicht auf unserer lokalen Image-Liste steht:
docker images
Dann ziehen Sie das Image aus der Harbor-Registry:
docker pull mysampledomain.info/myproject/helloharbor