Skip to main content

Prywatne rejestry kontenerów z Harbor na Kubernetes w NSIS Cloud

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

Zalety 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 obrazów i sposobem uzyskiwania do nich dostępu

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

  • spersonalizowana 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 obrazów itd.

Co zostanie omówione?

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

  • Dostęp do Harbor z poziomu przeglądarki

  • Powiązanie rekordu A domeny z adresem IP Harbor

  • Utworzenie projektu w aplikacji Harbor

  • Utworzenie pliku Dockerfile dla naszego niestandardowego obrazu

  • Zapewnienie zaufania z naszej lokalnej instancji Docker

  • Zbudawanie obrazu lokalnie

  • Przesłanie obrazu Docker do instancji Harbor

  • Pobranie obrazu Docker z instancji Harbor

Wymagania wstępne

Nr 1 Hosting

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

Nr 2 Klaster w chmurze NSIS Cloud

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

Nr 3 Działający kubectl

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

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

Zobacz artykuł

/kubernetes/Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-NSIS-Cloud

Nr 5 Domena wykupiona od rejestratora

Musisz mieć domenę zakupioną od dowolnego rejestratora (sprzedawcy domen). Uzyskanie domeny od rejestratorów nie jest przedmiotem tego artykułu.

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

Jest to opcjonalne. Szczegółowe informacje znajdują się w artykule

DNS jako usługa na NSIS Cloud Hosting

Nr 7 Docker zainstalowany na komputerze

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

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

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ą polecenia

cat values.yaml

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

nano harbor-values.yaml

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 load balancer, a zakończenie SSL jest delegowane do NGINX, który jest wdrażany jako pod Kubernetes.

Ostrzeżenie

Używamy nazwy domeny mysampledomain.info tylko w celach demonstracyjnych. Podczas uruchamiania kodu w tym artykule. Zastąp ją prawdziwą nazwą domeną, którą masz.

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 powinno być możliwe uzyskanie dostępu do portalu Harbor. Poniższe polecenie wyświetli wszystkie wdrożone usługi:

kubectl get services -n harbor

Oto one:

NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
harbor                  LoadBalancer   10.254.206.9     46.60.18.178   80:30565/TCP,443:31553/TCP   10m
harbor-core             ClusterIP      10.254.199.215   <none>         80/TCP                       10m
harbor-jobservice       ClusterIP      10.254.187.51    <none>         80/TCP                       10m
harbor-portal           ClusterIP      10.254.88.68     <none>         80/TCP                       10m
harbor-postgresql       ClusterIP      10.254.183.3     <none>         5432/TCP                     10m
harbor-postgresql-hl    ClusterIP      None             <none>         5432/TCP                     10m
harbor-redis-headless   ClusterIP      None             <none>         6379/TCP                     10m
harbor-redis-master     ClusterIP      10.254.124.228   <none>         6379/TCP                     10m
harbor-registry         ClusterIP      10.254.79.106    <none>         5000/TCP,8080/TCP            10m
harbor-trivy            ClusterIP      10.254.113.123   <none>         8080/TCP                     10m

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

Powiązanie rekordu A domeny z adresem IP Harbor

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

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

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

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

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

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

Na tym zrzucie ekranu wartość 46.60.18.178 jest już wprowadzona w polu Update– oczywiście zamiast niej należy podać własną wartość adresu 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 różne w zależności od przeglądarki.

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

login

admin

hasło

Harbor12345

Utworzenie projektu w aplikacji Harbor

Po zalogowaniu się do Harbor przechodzimy do sekcji Projects:

../_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 dostęp będzie miał każdy, i nazwiemy go po prostu myproject:

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

Utworzenie pliku 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 katalog o nazwie helloharbor z pojedynczym plikiem Docker (o nazwie Dockerfile)

Dockerfile

mkdir helloharbor
cd helloharbor
nano Dockerfile

Jego zawartość jest następująca:

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ć go do Harbor, musimy zapewnić komunikację naszej lokalnej instancji Docker z Harbor. W tym celu wykonaj następujące czynności:

Zapewnienie zaufania dla Docker – Krok 1. Obejście walidacji certyfikatu domeny przez Docker

Należy obejść walidację przez Docker 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

Wpisz w pliku następującą treść, a następnie zapisz go za pomocą poleceń Ctrl-X, Y:

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

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

W środowisku produkcyjnym należy raczej skonfigurować dla domeny odpowiedni certyfikat HTTPS.

Zapewnienie zaufania dla Docker – Krok 2. Upewnienie się, że Docker ufa urzędowi certyfikacji Harbor.

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 jest uruchomiony 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
Instalacja certyfikatu na WSL2 działającym w systemie Windows 10 lub 11

W WSL2 należy przesłać certyfikat do magazynu Windows ROOT CA store 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 Dalej, aby ukończyć pracę kreatora.

  • Uruchom ponownie Docker z menu Docker Desktop

Zapewnienie zaufania dla Docker - Krok 3. Ponowne uruchomienie Docker

Uruchom ponownie Docker za pomocą polecenia:

sudo systemctl restart docker

Zbud0wanie obrazu 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żna zalogować się do portalu Harbor za pomocą loginu administrator i hasła Harbor12345:

docker login mysampledomain.info

Przesłanie obrazu 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 został 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 pobierz go ze zdalnego Harbor:

docker pull mysampledomain.info/myproject/helloharbor