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