Skip to main content
  • »
  • KUBERNETES »
  • Prywatne rejestry kontenerów z Harbor na NSIS Kubernetes

Prywatne rejestry kontenerów z Harbor na NSIS Kubernetes

Podstawowym składnikiem ekosystemu opartego na kontenerach są rejestry kontenerów, wykorzystywane do przechowywania i dystrybucji obrazów kontenerów. Istnieje kilka popularnych publicznych rejestrów kontenerów, które służą temu celowi w modelu software-as-a-service, a najpopularniejszym z nich jest DockerHub.

W tym artykule używamy Harbor, który jest popularną opcją open-source do uruchamiania prywatnych rejestrów. Jest on zgodny z OCI (Open Container Initiative), dzięki czemu nadaje się do pracy ze standardowymi obrazami kontenerów. Jest dostarczany z wieloma funkcjami gotowymi do użycia w przedsiębiorstwach.

Korzyści z korzystania z własnego prywatnego rejestru kontenerów

Gdy wdrożysz swój własny prywatny rejestr kontenerów, korzyści będą między innymi następujące:

  • pełna kontrola nad przechowywaniem zdjęć i sposobem uzyskiwania do nich dostępu

  • Prywatność zastrzeżonych i prywatnych obrazów

  • niestandardowa konfiguracja logowania, uwierzytelniania itp.

Można również użyć Kontroli dostępu opartej na rolach na poziomie projektu Harbor, aby określić i wymusić, którzy użytkownicy mają uprawnienia do publikowania zaktualizowanych obrazów, korzystania z dostępnych itd.

Co będziemy omawiać

  • Wdrożenie prywatnego rejestru Harbor za pomocą wykresu Bitnami-Harbor Helm

  • Dostęp do Harbor z poziomu przeglądarki

  • Powiązanie rekordu A domeny z adresem IP Harbor

  • Utwórz projekt w aplikacji Harbor

  • Utwórz plik Dockerfile dla naszego niestandardowego obrazu

  • Zapewnienie zaufania z naszej lokalnej instancji Docker

  • Buduj nasz wizerunek lokalnie

  • Prześlij obraz Docker do instancji Harbor

  • Pobranie obrazu Docker z instancji Harbor

Wymagania wstępne

Nr 1 Hosting

Potrzebne jest konto hostingowe NSIS z interfejsem Horizon https://horizon.cloudferro.com.

Nr 2 Klaster na NSIS-Cloud chmurze

Klaster Kubernetes w chmurze NSIS. Postępuj zgodnie ze wskazówkami zawartymi w tym artykule Jak utworzyć klaster Kubernetes przy użyciu NSIS OpenStack Magnum.

Nr 3 kubectl operational

kubectl Narzędzie CLI zainstalowane i wskazujące na klaster poprzez zmienną środowiskową KUBECONFIG. Artykuł Jak uzyskać dostęp do klastra Kubernetes po wdrożeniu przy użyciu Kubectl na NSIS OpenStack Magnum? zawiera dalsze wskazówki.

Nr 4 Znajomość obsługi wykresów Helm

Zobacz ten artykuł:

Wdrażanie Helm Charts na klastrach Magnum Kubernetes w chmurze NSIS Cloud

Nr 5 Domena zakupiona od rejestratora

Powinieneś posiadać domenę zakupioną od dowolnego rejestratora (odsprzedawcy domen). Uzyskanie domeny od rejestratorów nie jest przedmiotem tego artykułu.

Nr 6 Użyj usługi DNS w Horizon, aby połączyć usługę Harbor z nazwą domeny.

Jest to opcjonalne. Tutaj znajduje się artykuł ze szczegółowymi informacjami:

DNS jako usługa na NSIS Cloud Hosting

Nr 7 Docker zainstalowany na komputerze

Zobacz Jak zainstalować i używać Dockera na Ubuntu 24.04.

Wdrożenie prywatnego rejestru Harbor za pomocą wykresu Bitnami-Harbor Helm

Pierwszym krokiem do wdrożenia prywatnego rejestru Harbor jest utworzenie dedykowanej przestrzeni nazw do hostowania artefaktów Harbor:

kubectl create ns harbor

Następnie dodajemy repozytorium Bitnami do Helm:

helm repo add bitnami https://charts.bitnami.com/bitnami

Następnie przygotujemy plik konfiguracyjny, którego możemy użyć do kontrolowania różnych parametrów naszego wdrożenia. Jeśli chcesz mieć wgląd we wszystkie możliwe parametry konfiguracyjne, możesz pobrać domyślną konfigurację values.yaml:

helm show values bitnami/harbor > values.yaml

Następnie można wyświetlić parametry konfiguracji za pomocą

cat values.yaml

W przeciwnym razie, aby kontynuować artykuł, użyj edytora nano, aby utworzyć nowy plik harbor-values.yaml.

nano harbor-values.yaml

i wklej następującą zawartość:

externalURL: mysampledomain.info
nginx:
  tls:
    commonName: mysampledomain.info
adminPassword: Harbor12345

Te ustawienia wdrażają portal Harbor jako usługę typu LoadBalancer, a zakończenie SSL jest delegowane do NGINX, który jest wdrażany jako kapsuła Kubernetes.

Ostrzeżenie

Używamy mysampledomain.info tylko w celach demonstracyjnych. Zastąp ją prawdziwą domeną, którą posiadasz podczas uruchamiania kodu w tym artykule.

Do celów demonstracyjnych używamy również prostego hasła, które można zmienić po pierwszym logowaniu.

Teraz zainstaluj wykres za pomocą następującego polecenia:

helm install harbor bitnami/harbor --values harbor-values.yaml -n harbor

Wynik powinien być podobny do poniższego:

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=__DOLLAR_SIGN__(kubectl get svc --namespace harbor-bitnami harbor --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
    echo "Harbor URL: http://__DOLLAR_SIGN__SERVICE_IP/"

2. Login with the following credentials to see your Harbor application

  echo Username: "admin"
  echo Password: __DOLLAR_SIGN__(kubectl get secret --namespace harbor-bitnami harbor-core-envvars -o jsonpath="{.data.HARBOR_ADMIN_PASSWORD}" | base64 -d)

Dostęp do Harbor z poziomu przeglądarki

Po wykonaniu poprzednich kroków powinieneś być w stanie uzyskać dostęp do portalu Harbor. Poniższe polecenie wyświetli wszystkie wdrożone usługi:

kubectl get services -n harbor

Oto one:

__DOLLAR_SIGN__ 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

Wyjaśnienie przeznaczenia kilku artefaktów wykracza poza zakres tego artykułu. Kluczową usługą, która interesuje nas na tym etapie, jest harbor, który został wdrożony jako LoadBalancer z publicznym IP 64.225.134.148.

Powiązanie rekordu A domeny z adresem IP Harbor

Ostatnim krokiem jest powiązanie rekordu A domeny z adresem IP portu.

Utwórz lub edytuj rekord A za pośrednictwem rejestratora domeny.

Dokładne kroki będą się różnić w zależności od rejestratora, więc ich wyjaśnienie wykracza poza zakres tego artykułu.

Utwórz lub edytuj rekord A za pośrednictwem usługi DNS dostępnej na koncie NSIS Cloud.

Zostało to wyjaśnione w warunku wstępnym nr 6. Użyj poleceń DNS –> Strefy i wybierz nazwę witryny, której używasz zamiast mysampledomain.info, a następnie kliknij Zestawy rekordów. W kolumnie Type pojawi się typ A - Address record i kliknij pole Update po prawej stronie, aby wprowadzić lub zmienić wartość w tym wierszu:

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

Na tym zrzucie ekranu wartość 64.225.134.148 jest już wprowadzona w polu Update - oczywiście zamiast tego należy podać własną wartość IP.

Po wykonaniu powyższych kroków można uzyskać dostęp do harbor z oczekiwanego adresu URL, w naszym przypadku: https://mysampledomain.info. Ponieważ wykres wygenerował samopodpisane certyfikaty, należy najpierw zaakceptować ostrzeżenie „Not Secure” wyświetlane przez przeglądarkę:

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

Informacja

Ostrzeżenie to będzie się różnić w zależności od przeglądarki.

Aby zalogować się do instancji, użyj tych danych jako danych logowania

login

administrator

hasło

Harbor12345

Utwórz projekt w aplikacji Harbor

Po zalogowaniu się do Harbor przechodzimy do sekcji Projekty:

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

projekt w Harbor to oddzielna przestrzeń, w której można umieszczać kontenery. Obraz musi być umieszczony w zakresie określonego projektu. Jako administratoristrator Harbor możesz również zastosować Role-Based Access Control na poziomie projektu Harbor, dzięki czemu tylko określeni użytkownicy mogą uzyskać dostęp lub wykonywać określone operacje w zakresie danego projektu.

Aby utworzyć nowy projekt, kliknij przycisk New Project. W tym artykule prześlemy publiczny obraz, do którego każdy będzie miał dostęp, i nazwiemy go po prostu myproject:

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

Utwórz plik Dockerfile dla naszego niestandardowego obrazu

Usługa Harbor jest uruchomiona i możemy jej użyć do przesłania naszych obrazów Docker. Wygenerujemy minimalny obraz, więc wystarczy utworzyć pusty folder o nazwie helloharbor, z pojedynczym plikiem Docker (o nazwie Dockerfile)

**Plik dokujący

mkdir helloharbor
cd helloharbor
nano Dockerfile

a jego zawartość to:

FROM alpine
CMD ["/bin/sh", "-c", "echo 'Hello Harbor!'"]

Zapewnienie zaufania z naszej lokalnej instancji Docker

Aby zbudować nasz obraz Docker w dalszych krokach i przesłać ten obraz do Harbor, musimy zapewnić komunikację naszej lokalnej instancji Docker z Harbor. Aby osiągnąć ten cel, wykonaj następujące czynności:

Zapewnienie zaufania Docker - krok 1. Obejście walidacji certyfikatu domeny przez Docker

Obejście walidacji przez Dockera certyfikatu domeny wskazującego na domenę, w której działa Harbor. Docker nie ufa temu certyfikatowi, ponieważ jest on podpisany samodzielnie. Aby ominąć tę walidację, należy utworzyć plik o nazwie daemon.json w katalogu /etc/docker na komputerze lokalnym:

sudo chmod 777 /etc/docker

Używasz sudo, więc zostaniesz poproszony o podanie hasła. Teraz utwórz plik:

nano /etc/docker/daemon.json

i wypełnij tą treścią, a następnie zapisz za pomocą Ctrl-X, Y:

{
    "insecure-registries" : [ "mysampledomain.info" ]
}

Jak zawsze, zastąp mysampledomain.info własną domeną.

W przypadku produkcji należy raczej skonfigurować odpowiedni certyfikat HTTPS dla domeny.

Zapewnienie zaufania Docker - krok 2. Upewnij się, że Docker ufa urzędowi certyfikacji portu.

Aby to zrobić, pobieramy plik ca.crt z naszej instancji portalu Harbor z widoku projektu myproject:

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

Dokładny sposób instalacji certyfikatu będzie zależał od środowiska, w którym uruchomiony jest Docker:

Instalacja certyfikatu w systemie Linux

Utwórz zagnieżdżony katalog /etc/docker/certs.d/mysampledomain.info i prześlij do niego plik ca.crt:

sudo mkdir -p /etc/docker/certs.d/mysampledomain.info
sudo cp ~/ca.crt /etc/docker/certs.d/mysampledomain.info
Zainstaluj certyfikat na WSL2 działającym w systemie Windows 10 lub 11

W WSL2 należy przesłać certyfikat do magazynu Windows ROOT CA w następującej kolejności:

  • Kliknij przycisk Start i wpisz Zarządzaj certyfikatami komputera.

  • Kliknij prawym przyciskiem myszy Zaufane główne urzędy certyfikacji, a następnie Wszystkie zadania i Importuj.

  • Przejdź do lokalizacji pliku ca.crt, a następnie naciśnij przycisk Next, aby ukończyć kreatora.

  • Uruchom ponownie Dockera z menu Docker Desktop

Zapewnienie zaufania Docker - Krok 3. Ponowne uruchomienie Docker

Uruchom ponownie Dockera za pomocą:

sudo systemctl restart docker

Buduj nasz wizerunek lokalnie

Po tych krokach możemy oznaczyć nasz obraz i zbudować go lokalnie (z lokalizacji, w której znajduje się plik Dockerfile):

docker build -t mysampledomain.info/myproject/helloharbor .

Następnie możemy zalogować się do portalu Harbor za pomocą loginu administrator i hasła Harbor12345:

docker login mysampledomain.info

Prześlij obraz Docker do instancji Harbor

Na koniec prześlij obraz do repozytorium:

docker push mysampledomain.info/myproject/helloharbor

Wynik będzie podobny do poniższego:

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

Pobranie obrazu Docker z instancji Harbor

Aby zademonstrować pobieranie obrazów z naszego repozytorium Harbor, możemy najpierw usunąć lokalny obraz Docker, który utworzyliśmy wcześniej.

docker image rm mysampledomain.info/myproject/helloharbor

Aby to sprawdzić, zobacz, że nie ma go na naszej lokalnej liście obrazów:

docker images

Następnie pociągnij z pilota Harbor:

docker pull mysampledomain.info/myproject/helloharbor