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