Private Container-Register mit Harbor auf CODE-DE 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 CODE-DE Konto mit Horizon-Schnittstelle https://cloud.fra1-1.cloudferro.com/auth/login/?next=/.

Nr. 2 Ein Cluster auf der CODE-DE Cloud

Ein Kubernetes Cluster auf der CODE-DE Cloud erstellen Sie analog zu dem Artikel Erstellen eines Kubernetes-Clusters mit CODE-DE OpenStack Magnum.

Nr. 3 kubectl operationell

kubectl CLI-Tool ist installiert und verweist über die Umgebungsvariable KUBECONFIG auf Ihren Cluster. Artikel Zugriff auf Kubernetes-Cluster nach der Bereitstellung mit Kubectl auf CODE-DE 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 CODE-DE 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 CODE-DE FRA1-1

Nr. 7 Docker ist auf Ihrem Rechner installiert

See Wie Docker verwendet wird.

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 CODE-DE 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:

../_images/image2023-8-2_16-7-51.png

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:

../_images/image2023-8-2_16-11-43.png

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.:

../_images/image2023-8-2_16-36-11.png

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:

../_images/image2023-8-2_16-44-28.png

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:

../_images/image2023-8-3_14-41-56.png

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:

../_images/image2023-8-3_15-11-48.png

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