Jak zainstalować Rancher RKE2 Kubernetes na NSIS
RKE2 - Rancher Kubernetes Engine w wersji 2 - to dystrybucja Kubernetes dostarczana przez SUSE. Uruchomienie samodzielnie zarządzanego klastra RKE2 w chmurze NSIS jest realną opcją, szczególnie dla tych, którzy szukają płynnej integracji z platformą Rancher i opcji dostosowywania.
Klaster RKE2 można aprowizować z poziomu Rancher GUI. W tym artykule wykorzystujemy jednak Terraform, który umożliwia usprawnione, zautomatyzowane tworzenie klastrów. Używamy również OpenStack Cloud Controller Manager (CCM) do integracji klastra RKE2 z szerszym środowiskiem OpenStack. Korzystanie z niestorazardowej wersji CCM pozwala nam korzystać z natywnych dla chmury funkcji NSIS. Efekt końcowy to
udostępniony klaster RKE2
działający pod OpenStack, z
zintegrowany OpenStack Cloud Controller Manager.
Zilustrowaliśmy również zastosowane techniki kodowania, na wypadek gdybyś chciał dalej ulepszać implementację RKE2.
Co będziemy omawiać
Przeprowadzenie wstępnej konfiguracji
Utwórz nowy projekt
Tworzenie poświadczeń aplikacji
Czy para kluczy działa
Uwierzytelnienie w nowo utworzonym projekcie
Użyj konfiguracji Terraform dla RKE2 z repozytorium GitHub CloudFerro
Udostępnianie klastra RKE2
Demonstracja wbudowanego równoważenia obciążenia natywnego dla chmury
Szczegóły implementacji
Dalsze dostosowywanie
Kod został przetestowany na Ubuntu 22.04.
Wymagania wstępne
Nr 1 Konto
Potrzebne jest konto hostingowe NSIS z dostępem do interfejsu Horizon: https://horizon.cloudferro.com.
Nr 2 Terraform dostępny w lokalnym wierszu poleceń
Zobacz /openstackdev/Generating-oraz-authorizing-Terraform-using-Keycloak-user-on-NSIS-Cloud
Nr 3 Środowisko wirtualne Python
Jak zainstalować Python virtualenv lub virtualenvwrapper na NSIS Cloud
Nr 4 OpenStack CLI zainstalowany lokalnie
Po zainstalowaniu będziesz miał dostęp do polecenia openstack i będziesz mógł komunikować się z chmurą OpenStack:
Jak aktywować dostęp OpenStack CLI do chmury NSIS przy użyciu uwierzytelniania dwuskładnikowego
Nr 5 narzędzie kubectl zainstalowane lokalnie
Storazardowe typy instalacji kubectl są opisane na stronie `Install Tools<https://kubernetes.io/docs/tasks/tools/>`_ oficjalnej strony Kubernetes.
Nr 6 Dostępna para kluczy w OpenStack
Jak utworzyć parę kluczy w OpenStack Dashboard na NSIS Cloud.
Nr 7 Poświadczenia aplikacji
Poniższy artykuł opisuje sposób tworzenia i używania poświadczeń aplikacji przy użyciu interfejsu CLI:
Jak wygenerować lub użyć poświadczeń aplikacji za pośrednictwem CLI na NSIS Cloud
W tym artykule utworzymy poświadczenia aplikacji za pośrednictwem Horizon, ale z określonym wyborem ról użytkowników.
Nr 8 Projekty, role, użytkownicy i grupy
Opcja Identity wyświetla listę dostępnych projektów, ról, użytkowników i grup. Zobacz Co to jest projekt OpenStack na NSIS Cloud.
Nr 9 Doświadczenie z Kubernetes i Helm
Aby kontynuować ten artykuł, powinieneś mieć ogólną wiedzę na temat Kubernetes. Posiadanie rzeczywistego doświadczenia w korzystaniu z niego w chmurze NSIS byłoby jeszcze lepsze. Aby zapoznać się z serią artykułów na temat Kubernetes, zobacz KUBERNETES.
Aby wykonać instalację wymaganą w tym artykule, jednym z kroków będzie utworzenie Helm CRD i użycie go. Ten artykuł pokazuje podstawy korzystania z Helm Wdrażanie Helm Charts na klastrach Magnum Kubernetes w chmurze NSIS Cloud.
Nr 10 Cloud Controller Manager
W ogólnym środowisku Kubernetes, „Cloud Controller Manager (CCM) <https://kubernetes.io/docs/concepts/architecture/cloud-controller/>`_ pozwala Kubernetes na integrację z API dostawcy chmury. Abstrahuje on logikę specyficzną dla chmury oraz zarządza i synchronizuje zasoby między Kubernetes a bazową infrastrukturą chmury. Zapewnia również kontrolery dla węzłów, tras, usług i woluminów.
W ramach OpenStack, CCM integruje się z interfejsami API OpenStack. Użyty tutaj kod pochodzi z konkretnego repozytorium dla Cloud Controller Manager – https://github.com/kubernetes/cloud-provider-openstack Implementuje on wyżej wymienione (jak również) inne integracje OpenStack-Kubernetes.
Nr 11 rke2-terraform repozytorium
Będziesz musiał pobrać następujące repozytorium
w celu zainstalowania manifestów Terraform dla provisioningu RKE2 na NSIS przy użyciu Terraform.
Nr 12 Dostosuj konfigurację chmury dla Terraform
Jednym z plików pobranych z powyższego linku będzie variables.tf. Zawiera on definicje regionu, nazwy klastra i wielu innych zmiennych. Domyślną wartością dla regionu jest WAW3-2, więc należy ją dostosować do własnej chmury.
Krok 1 Przeprowadzenie wstępnej konfiguracji
Naszym celem jest stworzenie klastra Kubernetes działającego w środowisku chmurowym. Pakiety oprogramowania RKE2 zostaną zainstalowane na maszynach wirtualnych w chmurze, pełniących role węzłów głównych i roboczych Kubernetes. Utworzonych zostanie również kilka innych zasobów OpenStack.
W ramach wstępnej konfiguracji udostępniania tych zasobów będziemy:
Utwórz dedykowany projekt OpenStack, aby odizolować wszystkie zasoby dedykowane dla klastra.
Tworzenie poświadczeń aplikacji
Upewnij się, że para kluczy jest włączona dla projektu.
Źródło lokalnie plik RC dla tego projektu
Poniżej znajduje się instrukcja instalacji projektu, poświadczeń, pary kluczy i źródła lokalnie w pliku RC.
Krok przygotowawczy 1 Utwórz nowy projekt
Pierwszym krokiem jest utworzenie nowego projektu przy użyciu interfejsu Horizon UI. Kliknij Tożsamość → Projekty. Wpisz nazwę projektu w pierwszej zakładce:
W drugiej zakładce upewnij się, że użytkownik, z którym pracujesz, został dodany jako członek projektu z rolami: „member”, „load-balancer_member” i „creator” role.
Następnie kliknij „Utwórz projekt”. Po utworzeniu projektu przejdź do kontekstu tego projektu z menu w lewym górnym rogu:
Krok przygotowawczy 2 Tworzenie poświadczeń aplikacji
Następnym krokiem jest utworzenie poświadczeń aplikacji, które będą używane do uwierzytelniania OpenStack Cloud Controller Manager (używanego do automatycznego dostarczania load balancera). Aby je utworzyć, przejdź do menu Identity → Application Credentials. Wypełnij formularz zgodnie z poniższym przykładem, przekazując wszystkie dostępne role („member”, „load-balancer_member”, „creator”, „reader”) do tego poświadczenia. Ustaw datę wygaśnięcia na datę w przyszłości.
Po kliknięciu na Create Application Credential należy skopiować w bezpieczne miejsce zarówno identyfikator aplikacji, jak i sekret poświadczeń. Okno zostanie wyświetlone tylko raz, więc najlepszym rozwiązaniem jest pobranie plików openrc i clouds.yaml, które będą zawierały wymagane wartości.
Warunek wstępny nr 7 zawiera kompletny przewodnik po poświadczeniach aplikacji.
Krok przygotowawczy 3 Para kluczy działa
Przed kontynuowaniem upewnij się, że masz dostępną parę kluczy. Jeśli masz już parę kluczy w głównym projekcie, będzie ona dostępna także dla nowo utworzonego projektu. Jeśli jeszcze jej nie masz, utwórz ją z lewego menu Project → Compute → Key Pairs. Aby uzyskać więcej informacji, odwiedź Wymagania wstępne nr 6.
Krok przygotowawczy 4 Uwierzytelnienie w nowo utworzonym projekcie
Na koniec należy pobrać plik RC odpowiadający nowemu projektowi z interfejsu graficznego Horizon, a następnie uruchomić ten plik w lokalnym terminalu Linux. Zobacz warunek wstępny nr 4.
Krok 2 Użyj konfiguracji Terraform dla RKE2 z repozytorium GitHub CloudFerro
Dodaliśmy folder rke2-terraform do repozytorium CloudFerro K8s-samples GitHub, z wymagania wstępnego nr 11. Ten projekt zawiera pliki konfiguracyjne do dostarczania klastra RKE2 w chmurach CloudFerro i może być używany jako pakiet startowy do dalszych dostosowań do konkretnych wymagań.
W tej sekcji krótko przedstawiamy to repozytorium, wyjaśniając zawartość i przeznaczenie określonych plików konfiguracyjnych. Pliki te są rzeczywistymi poleceniami dla Terraform i są zdefiniowane w jego storazardowych plikach z rozszerzeniem .tf.
- variables.tf
Zawiera kluczowe zmienne, które określają konfigurację naszego klastra, np. liczba węzłów roboczych, region chmury, w którym zostanie umieszczony klaster, nazwa klastra. Większość z tych zmiennych ma ustawione wartości domyślne i można je modyfikować bezpośrednio w pliku. Zmienne bez wartości domyślnych (tajne, wrażliwe dane) powinny mieć swoje wartości dostarczone osobno, za pomocą pliku tfvars, co wyjaśniono w następnej sekcji.
- providers.tf
Służy do deklarowania i konfigurowania dostawców Terraform. W naszym przypadku używamy tylko dostawcy OpenStack, który udostępnia zasoby chmurowe tworzące klaster.
- main.tf
Zawiera deklarację zasobów, które mają zostać utworzone przez Terraform. Do utworzenia klastra wymaganych jest kilka zasobów OpenStack, np. sieć, podsieć, router, maszyny wirtualne i inne. Przejrzyj plik, aby uzyskać szczegółowe informacje i dostosuj go do swoich preferencji.
- security-groups.tf
Zawiera deklarację grup zabezpieczeń i reguł grup zabezpieczeń używanych w OpenStack do otwierania określonych portów na maszynach wirtualnych tworzących klaster. W ten sposób komunikacja z wybranych źródeł zostaje włączona na każdej maszynie wirtualnej. Zmodyfikuj plik, aby dostosować go do własnych potrzeb.
- cloud-init-masters.yml.tpl
oraz
- cloud-init-workers.yml.tpl
Są to pliki szablonów używane do tworzenia plików cloud-init, które z kolei są używane do uruchamiania utworzonych maszyn wirtualnych:
upewniając się, że określone pakiety są zainstalowane na tych maszynach wirtualnych,
tworzenie i uruchamianie na nich skryptów itp.
Zawartość tych szablonów jest wypełniana na podstawie sekcji user-data w deklaracjach maszyn wirtualnych w main.conf.
Jedną z podstawowych funkcji każdego pliku cloud-init jest instalacja rke2 zarówno na węzłach głównych, jak i roboczych.
Krok 3 Udostępnienie klastra RKE2
Przeprowadźmy teraz aprowizację klastra RKE2 Kubernetes. Będzie się to składać z następujących kroków:
Klonowanie repozytorium github
Dostosuj wartości domyślne w pliku variables.tf.
Utwórz plik terraform.tfvars, zawierający sekrety
Inicjowanie, planowanie i stosowanie konfiguracji Terraform
Użyj pobranego kubeconfig, aby uzyskać dostęp do klastra za pomocą kubectl.
Pierwszym krokiem jest sklonowanie repozytorium github. Klonujemy całe repozytorium, ale pozostawiamy tylko folder rke2-terraform za pomocą poniższych poleceń:
git clone https://github.com/CloudFerro/K8s-samples
mkdir ~/rke2-terraform
mv ~/K8s-samples/rke2-terraform/* ~/rke2-terraform
rm K8s-samples/ -rf
cd rke2-terraform
Jak wspomniano w warunku wstępnym nr 12, sprawdź i ewentualnie zmień wartość ustawień domyślnych w variables.tf, np. zmień nazwę klastra, region chmury lub ustawienia maszyny wirtualnej.
W naszym przypadku trzymamy się ustawień domyślnych.
Informacja
Wysoce dostępna płaszczyzna kontroli nie jest obecnie objęta tym repozytorium. Ponadto ustawienie liczby węzłów nadrzędnych na wartość inną niż 1 jest :strong:`nieobsługiwane.
Wprowadź dane do pliku terraform.tfvars
Następnym krokiem jest utworzenie pliku terraform.tfvars o następującej zawartości:
ssh_keypair_name = "your_ssh_keypair_name"
project_id = "your_project_id"
public_key = "your_public_key"
application_credential_id = "your_app_credential_id"
application_credential_secret = "your_app_credential_secret"
- Get ssh_keypair_name
Wybierz jeden z listy wyświetlanej po Compute -> Key Pairs.
- Uzyskaj identyfikator projektu
Aby uzyskać project_id, najprostszym sposobem jest wyświetlenie listy wszystkich projektów z Identity -> Projects, kliknięcie nazwy projektu i odczytanie ID.
- Pobierz klucz publiczny
Aby uzyskać public_key, wykonaj Compute -> Key Pairs i kliknij nazwę pary kluczy, którą wprowadziłeś dla zmiennej ssh_keypair_name.
- Pobierz application_credential_id
Pobierz poświadczenie aplikacji ID z jednego z plików openrc lub clouds.yaml.
- Pobierz application_credential_secret
To samo, tylko w tajemnicy.
Uruchom Terraform, aby udostępnić klaster RKE2
To kończy część konfiguracyjną. Możemy teraz uruchomić storazardowe polecenia Terraform - init, plan i apply - aby utworzyć nasz klaster RKE2. Polecenia powinny być wykonywane w podanej poniżej kolejności. Wpisz yes, gdy jest to wymagane, aby ponownie potwierdzić kroki zaplanowane przez Terraform.
terraform init
terraform plan
terraform apply
Tworzenie zasobów zajmie kilka minut (ok. 5-10 minut dla małego klastra). W konsoli zostaną wydrukowane dzienniki potwierdzające utworzenie każdego zasobu. Oto przykładowy wynik końcowy polecenia terraform apply:
W ramach procesu provisioningu plik kubeconfig kubeconfig.yaml zostanie skopiowany do lokalnego katalogu roboczego. Wyeksportuj zmienną środowiskową wskazującą lokalną instalację kubectl do tej lokalizacji kubeconfig (zastąp ścieżkę w przykładowym poleceniu poniżej):
export KUBECONFIG=/path_to_your_kubeconfig_file/kubeconfig.yaml
Następnie sprawdź, czy klaster jest dostępny za pomocą:
kubectl get nodes
Widzimy, że w naszym przypadku klaster jest aprowizowany poprawnie, a zarówno węzeł główny, jak i węzły robocze są gotowe:
Krok 4 Zademonstrowanie integracji natywnej dla chmury objętej repozytorium
Możemy zweryfikować automatyczne dostarczanie load balancerów i publicznego Floating IP poprzez wystawienie usługi typu LoadBalancer. Poniższe polecenia kubectl wdrożą i udostępnią serwer nginx w domyślnej przestrzeni nazw naszego klastra RKE2:
kubectl create deployment nginx-deployment --image=nginx:latest
kubectl expose deployment nginx-deployment --type=LoadBalancer --port=80 --target-port=80
Udostępnienie FIP i LoadBalancera zajmuje około 2-3 minut. Po uruchomieniu tego polecenia:
kubectl get services
Po tym czasie powinieneś zobaczyć wynik podobny do poniższego, gdzie EXTERNAL-IP został poprawnie wypełniony:
Podobnie, można zweryfikować obecność utworzonego load balancera w interfejsie Horizon poprzez menu po lewej stronie: Project → Network → LoadBalancers.
i Project → Network → Floating IPs:
Ostatecznie możemy sprawdzić, czy usługa działa jako usługa publiczna w naszej przeglądarce z przypisanym zmiennym adresem IP:
Szczegóły implementacji
Wyjaśnienie wszystkich technik, które zostały wykorzystane do produkcji repozytorium RKE2 z wymagania nr 11, wykracza poza zakres tego artykułu. Poniżej znajduje się jednak ilustracja tego, jak zaimplementowano co najmniej jedną funkcję.
Przyjrzyjmy się plikowi cloud-init-masters.yml.tpl, a konkretnie jego części pomiędzy liniami 53 i 79:
- path: /var/lib/rancher/rke2/server/manifests/rke2-openstack-cloud-controller-manager.yaml
permissions: "0600"
owner: root:root
content: |
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: openstack-cloud-controller-manager
namespace: kube-system
spec:
chart: openstack-cloud-controller-manager
repo: https://kubernetes.github.io/cloud-provider-openstack
targetNamespace: kube-system
bootstrap: True
valuesContent: |-
nodeSelector:
node-role.kubernetes.io/control-plane: "true"
cloudConfig:
global:
auth-url: https://keystone.cloudferro.com:5000
application-credential-id: "${application_credential_id}"
application-credential-secret: "${application_credential_secret}"
region: ${region}
tenant-id: ${project_id}
loadBalancer:
floating-network-id: "${floating_network_id}"
subnet-id: ${subnet_id}
Obejmuje on tworzenie definicji yaml dla HelmChart CRD
rke2-openstack-cloud-controller-manager.yaml
w lokalizacji
/var/lib/rancher/rke2/server/manifests/
na węźle głównym. Po utworzeniu klastra aprowizator RKE2 automatycznie przechwytuje ten plik i wdraża pod odpowiedzialny za aprowizację takich load balancerów. Można to zweryfikować, sprawdzając pody w przestrzeni nazw kube-system:
kubectl get pods -n kube-system
Jednym z wpisów jest wspomniany wcześniej pod:
NAME READY STATUS RESTARTS AGE
...
openstack-cloud-controller-manager-bz7zt 1/1 Running 1 (4h ago) 26h
...
Dalsze dostosowywanie
W zależności od przypadku użycia wymagane będzie dalsze dostosowanie dostarczonego przykładowego repozytorium w celu dostrojenia konfiguracji Terraform w celu zapewnienia klastra RKE2. Sugerujemy ocenę następujących ulepszeń:
Włączenie wysokiej dostępności płaszczyzny sterowania
Integracja z CSI Cinder w celu umożliwienia zautomatyzowanego aprowizowania blokowej pamięci masowej za pomocą persistent volume claims (PVCs).
Zintegruj wtyczkę urządzenia NVIDIA, aby umożliwić natywną integrację maszyn wirtualnych z vGPU.
Wdrożenie autoskalera węzłów w celu uzupełnienia natywnego dla Kubernetes Horizontal Pod Autoscaler (HPA).
Wdrożenie reguł affinity i anti-affinity dla umieszczania węzłów podrzędnych i nadrzędnych.
Aby wdrożyć te funkcje, należałoby jednocześnie dostosować definicje zarówno dla zasobów Terraform, jak i Kubernetes. Omówienie tych kroków wykracza zatem poza zakres tego artykułu.
Co robić dalej
W tym artykule stworzyłeś odpowiednie rozwiązanie Kubernetes, używając klastra RKE2 jako podstawy.
Można również rozważyć tworzenie klastrów Kubernetes przy użyciu Magnum w ramach OpenStack:
Jak utworzyć klaster Kubernetes przy użyciu NSIS OpenStack Magnum