Instalacja Rancher do obslugi klastrow Kubernetes

Co potrzebujemy by uruchomić Kubernetes

Poniższy tutorial jest o tym jak stworzyć testowe środowisko Kubernetes. Nie jest to materiał szkoleniowy o samym Kubernetes ani też o pozostałych komponentach które są wymagane dla uzyskania tego środowiska. Kubernetes jest systemem zlożonym i jego poznanie wymaga zaangażowania. 

Kubernetes to system do zarządzania kontenerami, który automatyzuje wdrażanie, skalowanie i zarządzanie aplikacjami kontenerowymi w klastrze. Umożliwia łatwe zarządzanie grupą kontenerów jako jedną jednostką. Dlaczego wymaga środowiska Docker?

  • Platforma Kontenerowa:  Kubernetes wykorzystuje Docker do tworzenia i zarządzania kontenerami.
  • Standardizacja: Kubernetes opiera się na standardach kontenerów, a Docker jest de facto standardem dla tworzenia tych kontenerów.

Kubernetes najczęściej uruchamiany jest z kontenerami Docker, jest systemem orkiestracji kontenerów, ale może wykorzystywać także inne środowiska niż Docker do tworzenia kontenerów. 

Dlaczego uruchamianie Dockera w Windows to bardzo zły pomył?

Choć docker.com udostępnia swoje oprogramowanie także dla systemu operacyjnego Windows, w praktyce nie nadaje się ono nawet do testów nie mówiąc już  produkcyjnej instalacji Dockera. Instalacja Docker'a potrafi się zaorać sama z siebie w Windows w każdym momencie bez właściwie żadnej przyczyny. Oto kilka punktów 'formalnych' dlaczego Docker w Windows to niezbyt wspaniały pomysł:

  1. Wydajność: Docker na Windows wymaga maszyny wirtualnej, co wprowadza dodatkowy narzut i opóźnienia w uruchamianiu kontenerów.

  2. Kompatybilność: Niektóre obrazy są zoptymalizowane dla Linuxa i mogą nie działać poprawnie na Windowsie.

  3. Ograniczone Narzędzia: Mniej narzędzi do zarządzania kontenerami, co utrudnia automatyzację i monitorowanie.

  4. Problemy z Systemem Plików: Różnice w systemach plików mogą prowadzić do problemów z wydajnością i interoperacyjnością.

Dla środowisk produkcyjnych zaleca się korzystanie z systemów Linux.

Zarządzanie klastrami Kubernetes

Zarządzanie wieloma klastrami Kubernetes może być skomplikowane. Dlatego warto wykorzystać system który ułatwia i centralizuje te czynności; Rancher

  • Łatwe Zarządzanie: Umożliwia centralne zarządzanie wieloma klastrami Kubernetes z jednego panelu, upraszczając zarządzanie w dużych środowiskach.

  • Automatyzacja i Skalowanie: Rancher automatyzuje procesy wdrażania, konfiguracji i aktualizacji klastrów, co przyspiesza rozwój i skalowanie aplikacji.

  • Zwiększone Bezpieczeństwo: Zapewnia mechanizmy kontroli dostępu, zarządzania uprawnieniami i bezpieczeństwa, co pomaga chronić klastry przed zagrożeniami.

  • Integracja z Różnymi Środowiskami: Umożliwia zarządzanie klastrami Kubernetes zarówno lokalnie, jak i w chmurach publicznych (multi-cloud).

Instalacja systemu operacyjnego

Dla naszego testowego rozwiązania potrzebujemy systemu operacyjnego Linux. Najłatwiej będzie zainstalować dystrybucję OpenSUSE Leap.

Kilka przydatnych informacji podczas uruchamiania maszyny wirtualnej w Hyper-V:

  • Środowisko Kubernetes lubi pamięć. Obecnie kontenery Kubernetes mogą już działać ze swap systemu operacyjnego. Ale chociaż korzystanie ze swapu w kontenerach Kubernetes jest możliwe, nie jest to zalecane praktyka. W większości przypadków można uniknąć korzystania ze swapu poprzez odpowiednie planowanie zasobów i monitorowanie klastra. Dlatego zarezerwuj maszynie odpowiednią ilość RAM, np 10GB (w produkcyjnym uruchomieniu będzie to zazwyczaj dużo, dużo więcej).
  • Wybierz "Generation 2" jako rodzaj maszyny podczas instalacji w Hyper-V
  • Wyłącz "Enable secure boot" w sekcji "Security" ustawień maszyny wirtualnej Hyper -V przed instalacja Linux
  • Dla niektórych rozdzielczości ekranu konieczne będzie zdefiniowane od strony hosta (Hyper-V) rozmiaru ekranu maszyny wirtualnej. W PowerShell wykonanie komendy:
Set-VMVideo -VMName "Nazwa-Maszyny_Wirtualnej" -HorizontalResolution 2560 -VerticalResolution 1440 -ResolutionType Single

Następnie w konsoli Linux wykonaj polecenie:

gtf 2560 1440 60

To powinno wygenerowac rezultat podobny do ponizszego:

# 2560x1440 @ 60.00 Hz (GTF) hsync: 107.50 kHz; pclk: 60.00 MHz

Modeline "2560x1440_60.00"  60.00  2560 2592 2624 2688  1440 1441 1444 1481 -hsync +vsync

Dodaj modeline do xrandr. Skopiuj linię Modeline (na przykład z gtf) i wprowadź następujące polecenie w terminalu:

xrandr --newmode "2560x1440_60.00"  60.00  2560 2592 2624 2688  1440 1441 1444 1481 -hsync +vsync

Dodaj nową rozdzielczość do odpowiedniego wyjścia. Sprawdź wyjście, które chcesz skonfigurować, za pomocą polecenia xrandr. Zwykle będzie to coś jak Virtual1 lub HDMI-1. Następnie dodaj rozdzielczość:

xrandr --addmode <twoje_wyjście> "2560x1440_60.00"

Ustaw nową rozdzielczość:

xrandr --output <twoje_wyjście> --mode "2560x1440_60.00"

Możesz dodać swój skrypt do folderu xinitrc.d, aby uruchamiał się razem ze startem serwera X.

sudo nano /etc/X11/xinit/xinitrc.d/set_resolution.sh

Wklej następujący kod do skryptu:

#!/bin/bash
xrandr --newmode "2560x1440_60.00"  60.00  2560 2592 2624 2688  1440 1441 1444 1481 -hsync +vsync
xrandr --addmode <twoje_wyjście> "2560x1440_60.00"
xrandr --output <twoje_wyjście> --mode "2560x1440_60.00"

Nadaj skryptowi prawa do wykonywania:

sudo chmod +x /etc/X11/xinit/xinitrc.d/set_resolution.sh
  • Siec. By wirtualna maszyna mogla komunikować się z hostem i światem, niezbędne jest utworzenie Wirtualnego Switcha z opcją 'external'. Pamiętaj by wybierając właściwą kartę sieciową zaznaczyć opcję 'Allow management operating system to share this network adapter'.

W niektórych przypadkach wybranie tego wirtualnego switcha podczas instalacji lub wskazanie go w "Ustawianiach" maszyny wirtualnej i "Network adapter" nie pomaga by maszyna mogla sie komunikować. Należy w "Settings" kliknąć na "Add hardware" i dodać kartę sieciową z wybranym wirtualnych switchem. Robimy to oczywiście na wyłączonej maszynie wirtualnej.

Zainstaluj Docker na maszynie wirtualnej

Posługując się instrukcją opublikowaną na stronie https://en.opensuse.org/Docker zainstaluj Docker i sprawdź czy działa.

Instalowanie Rancher

Na stronie https://www.rancher.com/quick-start znajdziesz opis instalacji. Bardzo prosty proces który polega na uruchomienia kontenera z aplikacją Rancher w Dokerze. Poniższe polecenie wskazuje na jakim porcie znajdziemy zainstalowana aplikację (443)

$ sudo docker run --privileged -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher

Po instalacji wpisz w w przegladarce 'http://adres-wirtualnej-maszyny:443'

Powyższy sposób, gotowy image docker, może być najszybszą metodą instalacji ale zdecydowanie lepiej jest zainstalować Rancher z użyciem instalatora Helm. Niżej opisany sposób zmiany certyfikatu działa kiedy Rancher byl zainstalowany właśnie z helm.

Pierwsze logowanie do Rancher

Po wpisaniu w przeglądarce adresu Rancher zobaczysz stronę:

W polu 'Password' wpisz hasło które uzyskasz wykonując polecenie opisane wyżej; "docker logs ...". Domyślnie Rancher proponuje ustawienie adresu jako 'localhost'. Zastąp ten wpis adresem wirtualnej maszyny by uniknąć problemów w komunikacji. Hasło to znajdziesz także w logu kontenera który właśnie się uruchomił:

docker logs <id_kontenera> 2>&1 | grep "Bootstrap Password:"

Sprawdź Instalację runtime containerd

Runtime containerd jest wymagany by Rancher mógł zarządzać kontenerami w Docker [przeczytaj więcej o tej usłudze]. 

Spradz czy serwis działa poprawnie:

sudo systemctl status containerd

Jeśli  nie, uruchom go:

sudo systemctl start containerd

Aby containerd uruchamiał się automatycznie przy starcie systemu, wykonaj:

sudo systemctl enable containerd

Jeśli serwis containerd nie jest zainstalowany, wykonaj poniższe kroki by go zainstalować:

sudo zypper search containerd

sudo zypper install containerd

Uruchom serwer SSH

Uruchom serwer SSH by łączyć się z hosta do maszyny wiertualnej. W maszynie wirtualnej wykonaj polecenie:

sudo zypper install openssh

Uruchom serwis:

sudo systemctl start sshd

Aby włączyć serwer SSH podczas uruchamiania systemu:

sudo systemctl enable sshd

Aby dodać regułę umożliwiającą połączenia na porcie SSH (domyślnie port 22), wykonaj poniższą komendę:

sudo firewall-cmd --permanent --add-service=ssh

Przeładuj konfigurację firewall:

sudo firewall-cmd --reload

Jeśli w miejsce dotychczasowej maszyny wirtualnej uruchomiłeś nową ze starym IP, usun stary SSH host key na hoście. Wykonaj następującą komendę w PowerShell przed połączeniem:

ssh-keygen -R ip_address

Zaakceptuj przy ponownym polaczeniu z maszyną wirtualną wpisując 'yes':

ssh user@X.X.X.X
The authenticity of host 'X.X.X.X (X.X.X.X)' can't be established.
ED25519 key fingerprint is SHA256:qL+gvIcpVjj9y7f5EMtsP3JOLLRZjxBwu1Z/WF7+VDw.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Tworzenie klastra w Rancher

Zanim przejdziesz do tworzenia klastra Kubernetes w Rancher upewnij się że:

  • serwis Docker jest uruchomiony
  • serwis containerd działa

Po zalogowaniu wybierz 'Home' (masz możliwość ustawienia okna startowego) i powyżej listy istniejących już klastrów (po instalacji będzie tam jeden klaster, ten właśnie zawierający aplikację Rancher o nazwie 'local'). 

Uwaga: tworzenie dwóch klastrów na tej samej maszynie nie jest zalecane z uwagi na konflikt portów, adresów, pamięci, dostęp do cpu.

By utworzyć kolejny klaster kliknij na "Create":

W Rancher masz możliwość tworzenia i zarządzania klastrami w 'chmurach' oraz lokalnymi. By utworzyć lokalny klaster, wybierz opcję "Custom":

Przed przystąpieniem do tworzenia klastra, dowiedz się więcej czym jest Kubernetes i jak zarządza węzłami, klastrami, podami. Ważne jest także zapoznanie się z generowaniem certyfikatów zawierających IP w polu SAN. Jeśli certyfikat nie zawierać będzie wpisu SAN dla adresu IP x.x.x.x, weryfikacja (np Kubectlt) nie powiedzie się i wystąpi błąd: "tls: failed to verify certificate: x509: cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs".

Instalacja Kubectl i Helm

Kubectl i Helm to narzędzia używane w środowiskach Kubernetes. Kubectl służy do bezpośredniego zarządzania klastrem, a Helm do łatwego wdrażania złożonych aplikacji

  • kubectl: to podstawowe narzędzie linii komend służące do zarządzania klastrami Kubernetes. Umożliwia interakcję z klastrem, np. wdrażanie aplikacji, monitorowanie stanu zasobów, zarządzanie kontenerami i uzyskiwanie informacji o klastrze. Jest jak "kontroler" do bezpośredniego wydawania poleceń klastrowi.

  • Helm: to menedżer pakietów dla Kubernetes, który ułatwia instalację, aktualizację i zarządzanie aplikacjami (tzw. "Chartami") w klastrze. Helm działa jak "apt" czy "yum" dla Kubernetes, pomagając w automatyzacji procesu wdrażania i aktualizacji złożonych aplikacji, które składają się z wielu zasobów Kubernetes.

Instalacja Kubectl w openSuse

Instrukcja jest dostępna pod adresem https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/ Aby zainstalować Kubectl wykonaj kolejno:

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"echo "$(cat kubectl.sha256)  kubectl" | sha256sum --checksudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

Po instalacji możesz sprawdzić czy został zainstalowany i się uruchamia:

kubectl version --client

Tworzenie pliku konfiguracyjnego kubect

Wykonaj polecenia z instrukcji na stronie Rancher by utworzyć plik konfiguracyjny. Skonfiguruj kubectl, odwiedzając swój klaster w interfejsie webowym Ranchera, klikając na Kubeconfig, kopiując zawartość i wklejając ją do pliku ~/.kube/config.

Plik konfiguracyjny dla Kube pobierzesz klikajac w Rancher na ikonę 'Home', następnie 'Manage' powyżej listy klastrów; zaznacz klaster/klastry i aktywny stanie się przycisk 'Download KubeConfig'. Kliknij na niego by pobrac plik konfiguracyjny.

Utwórz katalog '~/.kube' poleceniem jak niżej i wklej do niego zawartość pobraną jak wyżej - plik musi nazywać się 'config':

mkdir -p ~/.kube

Instalacja Helm

To narzędzie jest dostępne w Zypper. Możesz przed instalacją wykonać 'sudo zypper refresh' i 'sudo zypper update' a samą instalację wykonać poleceniem:

sudo zypper install helm

A następnie sprawdź czy rzeczywiście został zainstalowany:

helm version

Aby sprawdzić zainstalowaną wersję możesz użyć poniższego polecenia:

helm version

Instalacja certyfikatu TLS

Certyfikat TLS (Transport Layer Security) to cyfrowy certyfikat używany do zabezpieczania komunikacji w internecie. Jest to kluczowy element protokołu TLS, który zapewnia szyfrowanie danych przesyłanych między klientem (np. przeglądarką) a serwerem, co gwarantuje prywatność i integralność tej komunikacji. TLS jest następcą starszego protokołu SSL (Secure Sockets Layer), a certyfikaty TLS są często określane mianem certyfikatów SSL/TLS.

Instalacja openSSL w Linux

Sprawdź czy masz zainstalowany openssl (domyślnie tak):

openssl version

Jeśli go nie masz, aby zainstalować OpenSSL, użyj następującego polecenia w terminalu:

sudo zypper install openssl

Przygotuj plik konfiguracyjny OpenSSL 

Poniżej przykład pliku dla "self-signed certificate" (rancher-openssl.cnf). Nasz testowy certyfikat nie będzie podpisany przez zaufany urząd certyfikacji (CA - Certificate Authority). 

[req]
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
countryName = PL
stateOrProvinceName = S
localityName = Lemingograd
organizationName       = "Test organization"
organizationalUnitName = TestUnit
commonName = 1.1.1.1

[req_ext]
subjectAltName = @alt_names

[v3_req]
subjectAltName = @alt_names

[alt_names]
IP.1 = 1.1.1.1

Wygeneruj certyfikat i klucz:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -config rancher-openssl.cnf

Polecenie wygeneruje klucz prywatnym w formacie PEM (tls.key) oraz certyfikat który zawiera adresy SAN (Subject Alternative Name). W certyfikatach TLS/SSL pole Subject Alternative Name (SAN) jest używane do określenia alternatywnych nazw domen lub adresów IP, dla których certyfikat jest ważny. Jeśli chcesz upewnić się przed użyciem certyfikatu czy na pewno zawiera on IP adresy, wykonaj polecenie:

openssl x509 -in tls.crt -text -noout | grep -A 1 "Subject Alternative Name"

Wgranie certyfikatu

Nastepnym krokiem jest utworzenie sekretu ("secret") TLS w Kubernetes dla certyfikatów. 
Tworzenie sekretu TLS jest standardową praktyką w Kubernetes, niezależnie od tego, czy używasz certyfikatów podpisanych przez zaufane urzędy certyfikacji (CA), czy certyfikatów samopodpisanych.
Po wykonaniu poniższego polecenia:

  • Kubernetes utworzy sekret TLS, który będzie przechowywać certyfikat i klucz prywatny.
  • Będzie można używać tego sekretu do konfiguracji Ingress w Rancherze, aby zapewnić bezpieczne połączenie HTTPS.

Jeśli będziesz posługiwać się kubectl używa on także certyfikatów TLS do zabezpieczenia komunikacji z serwerem API Kubernetes. Po utworzeniu sekretu będziesz musiał skonfigurować zasób Ingress, aby korzystał z tego sekretu, co zwykle odbywa się w pliku YAML Ingress. 

Wykonujemy polecenie (tls.crt - certyfikat, tls.key - klucz prywatny):

kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=tls.crt --key=tls.key

Jeśli używasz prywatnego centrum certyfikacji (CA), Rancher wymaga kopii certyfikatu głównego lub łańcucha certyfikatów prywatnego CA, który agent Ranchera wykorzystuje do walidacji połączenia z serwerem. Utwórz plik o nazwie tls.crt (masz go juz z kroku powyżej), który zawiera tylko certyfikat główny CA lub łańcuch certyfikatów z Twojego prywatnego CA, a następnie użyj kubectl, aby utworzyć sekretny obiekt tls-ca w przestrzeni nazw cattle-system.

kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem=./tls.crt

Zawartość certyfikatu (pole cacerts.pem) w sekrecie tls-ca jest zakodowana w Base64. Aby upewnić się, że certyfikat jest prawidłowy, możesz go zdekodować i sprawdzić:

kubectl -n cattle-system get secret tls-ca -o jsonpath='{.data.cacerts\.pem}' | base64 --decode > test.pem

Pliki tls.crt i test.pem powinny mieć identyczną zawartość.

 

Miłej zabawy!