Chmura (nie całkiem) wirtualna, czyli orkiestracja kontenerami

dodał 18 grudnia 2019 o 09:47 w kategorii HowTo  z tagami:
Chmura (nie całkiem) wirtualna, czyli orkiestracja kontenerami

Słyszeliście o kontenerach? Na pewno słyszeliście. A skorzystaliście kiedyś? Teraz macie okazję, bo to naprawdę proste. Idea kontenerów podbija świat, a my pokazujemy, jak w prosty sposób podejść do tego tematu.

W ramach cyklu artykułów powstałych przy współpracy z Aruba Cloud przedstawiliśmy pomysły na różne wykorzystanie dostępnych w portfolio tego dostawcy usług i rozwiązań chmurowych. Skupiliśmy się na zaprezentowaniu każdego z produktów i opisaniu scenariusza jego możliwego zastosowania.

Opisane modele wdrożenia były zależne od typu omawianej usługi, a one same zostały skomponowane przez Aruba Cloud z myślą o różnych potrzebach klientów. W obecnej, kończącej ten rok publikacji chcemy na chwilę odejść od dotychczasowego modelu przedstawiania „case study” zależnego od typu instancji czy sposobu ich wirtualizacji. Do tego celu wykorzystamy trochę inne spojrzenie na dostarczanie rozwiązań w postaci systemów czy gotowych aplikacji, jakim jest konteneryzacja.

Sama technologia i związane z nią pojęcie kontenerów nie są niczym nowym. Pierwsze rozwiązania służące do izolacji procesów w systemach Unix były wdrażane już w latach 80., a z pojęciem kontenera spotykaliśmy się już około 15 lat temu, chociażby w systemach Solaris.

Dopiero w ostatnich latach kontenery i rozwiązania tworzone w oparciu o nie zyskują na popularności. Sama technologia posiada wiele zalet, a do najczęściej wymienianych należą: lepsze wykorzystanie zasobów obliczeniowych, prostota migracji oraz skalowanie całego środowiska aplikacyjnego.

Otwarty standard konteneryzacji

Kontener stanowi odrębną od wirtualizacji warstwę abstrakcji. Na temat tej technologii w Internecie znaleźć możemy ogromne ilości artykułów, przewodników czy nawet kompletnych kursów. Powielanie tej wiedzy nie ma sensu, dlatego opracowaliśmy dwa scenariusze przygotowania instancji ArubaCloud, które docelowo będą służyły uruchamianiu kontenerów. Wszystko działa w ramach platformy Docker i gotowych obrazów systemu CentOS 7. Pierwszy z nich jest krótszy i zalecamy go w przypadku uruchomienia pojedynczej instancji chmurowej (np. Cloud VPS Smart). W drugim korzystamy z docker-machine oraz sterownika docker-machine-driver-arubacloud opcja dużo lepsza, gdy docelowo chcemy mieć więcej instancji. Cały proces możecie zobaczyć na poniższym filmie lub przeczytać w formie tekstowej pod nim.

A. Instalacja ręczna

Proces instalacji wymaga utworzenia instancji ArubaCloud z poziomu panelu web – zgodnie z opisem, jaki znajduje się we wcześniejszych publikacjach. Po utworzeniu instancji o oczekiwanych przez nas parametrach logujemy się do niej z wykorzystaniem SSH i w powłoce wydajemy następujący zestaw poleceń:

yum -y update && yum -y upgrade
yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker

Po poprawnie przeprowadzonym procesie instalacji przechodzimy do przetestowania, czy wszystko działa zgodnie z oczekiwaniami. Do tego celu skorzystamy z gotowego obrazu o nazwie hello-world

docker run hello-world

Wynik działania tego polecenia powinien wyglądać zgodnie z poniższym zrzutem:

B. Instalacja z wykorzystaniem docker-machine

Firma Aruba dostarcza otwartoźródłowy sterownik pozwalający w sposób automatyczny na wdrożenie instancji ArubaCloud wyposażonej w silnik Dockera: https://github.com/Arubacloud/docker-machine-driver-arubacloud

Wdrożenie instancji z gotowym do pracy Dockerem sprowadza się do podania poświadczeń oraz zdefiniowania parametrów maszyny (rozmiar oraz typ, np. CloudVPS Smart). W celu wykorzystania sterownika potrzebny jest dowolny system z zainstalowanym i działającym docker-machine. Do tego celu wykorzystany może być nawet dostępny w systemie Windows 10 WSL, czyli Windows Subsystem for Linux lub maszyna wirtualna z tym systemem. W naszym przypadku wykorzystamy lokalnie uruchamiany Ubuntu Server w wersji 18.04:

apt -y update && apt -y upgrade
wget https://github.com/Arubacloud/docker-machine-driver-arubacloud/releases/download/v1.3.0/docker-machine-driver-arubacloud-linux-amd64-v1.3.0.tar.gz
tar -C /usr/local/bin/ -xvzf docker-machine-driver-arubacloud-linux-amd64-v1.3.0.tar.gz
curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` > /tmp/docker-machine \
&&chmod +x /tmp/docker-machine &&sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

Testujemy, czy docker-machine i aruba-driver działają poprawnie:

docker-machine create -d arubacloud --help

Mając już pobrany sterownik i zainstalowane docker-machine, możemy przystąpić do wdrożenia instancji gotowej do uruchamiania kontenerów Dockera. Tak naprawdę potrzebujemy wydać jedno polecenie, zwierając w nim poświadczenia i parametry konfiguracyjne dla instancji:

docker-machine create --driver arubacloud \
--ac_username"username" \
--ac_password"password" \
--ac_endpoint"dc8" \
--ac_template"centos7_x64_1_0" \
--ac_size"Medium" \
--ac_admin_password"admin_password" \
--ac_action"NewPro" \
centosdocker1

Wywołanie powyższego polecenia powinno zakończyć się poprawnym wdrożeniem instancji o nazwie centosdocker1, która będzie również widoczna w webowym panelu ArubaCloud:

UWAGA: Wszystkie dostępne parametry zostały opisane w repozytorium GitHuba, z którego instalowaliśmy sterownik.

Korzystając z docker-machine, możemy wyświetlić listę uruchomionych instancji, a także podłączyć się do nich i wykonywać operacje w samym systemie. Rzecz w tym, że w przypadku wielu instancji będziemy mieli do czynienia z dużą liczbą uruchomionych kontenerów – łączenie się do każdej z nich i zarządzanie Dockerem może okazać się wtedy nieefektywne.

Orkiestracja kontenerami

W jednym z artykułów poświęconych automatyzacji do akceleracji procesów wdrożenia instancji chmurowych, ich konfiguracji, a następnie instalacji skorzystaliśmy z narzędzi takich jak Terraform i Ansible. Pozwoliły nam one przeprowadzić procesy obsługi naszego finalnego rozwiązania zarówno od zewnątrz (instancje), jak i od wewnątrz (system operacyjny, oprogramowanie). Zastosowanie kontenerów w znacznym stopniu zmienia sposób, w jaki patrzymy na tworzenie i obsługę wdrażanego przez nas rozwiązania. Poza samą platformą pozwalającą obsługiwać cykl życia kontenera (Docker) przydatny jest również system centralnego zarządzania kontenerami. W naszym scenariuszu takim narzędziem będzie Kubernetes.

Do celów rozpoczęcia nauki i pracy z orkiestracją kontenerami idealnym rozwiązaniem jest MicroK8s. To projekt firmy Canonical, przygotowany z myślą o wykorzystaniu w środowiskach deweloperskich. To znacznie lżejszy odpowiednik pełnowymiarowego Kubernetesa, zaprojektowany z myślą o obsłudze klastrów z jedną instancją. W przypadku dużych i wielonodowych środowisk Kubernetes jest często wdrażany jako gotowa usługa, taka jak np.Google Kubernetes Engine.

Aby zacząć, MicroK8s musimy doinstalować na wcześniej wdrożonej już instancji Aruba. Przy czym nie ma tutaj potrzeby nawiązywania odrębnego połączenia SSH, wystarczy, że skorzystamy z poleceniadocker-machinessh centosdocker1:

Po zalogowaniu do konsoli systemu uruchamiamy jego aktualizację i następnie przechodzimy do instalacji MicroK8s, wzorując się na oficjalnej dokumentacji:

yum -y install epel-release && yum -y update && yum -y install snapd&&systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
sudosnap install microk8s --classic
sudousermod -a -G microk8s $USER
su - $USER
microk8s.status --wait-ready

Ostatnie polecenie pozwala na zweryfikowanie statusu MicroK8s, jeżeli instalacja przebiegła poprawnie i usługa jest uruchomiona, powinniśmy zobaczyć następujący komunikat:

MicroK8s dostarcza własną wersję wiersza poleceń kubectl, która będzie przez nas wykorzystywana do zarządzania Kubernetesem. Przykładowo poprzez polecenie microk8s.kubectl getnodes możemy zweryfikować stan nodów klastra (w tym wypadku jednego):

W celu przeciwdziałania konfliktom polecenie kubectl działa w ramach przestrzeni poleceń MicroK8s. Aby nie poprzedzać go za każdym razem odpowiednim prefiksem, możemy utworzyć alias i dodać go do ~/.bash_aliases:

echo 'alias kubectl='microk8s.kubectl'' > ~/.bash_aliases
source ~/.bash_aliases

MicroK8s działa teraz lokalnie i pozwala nam na zarządzanie kontenerami uruchomianymi przez Dockera na tej samej instancji.

Aplikacja

Po przygotowaniu całego środowiska finalnie przystąpimy do utworzenia aplikacji. Skorzystamy z gotowego obrazu WordPressa, wydając przez kubectl następujące polecenia:

kubectl create deployment wordpress --image=wordpress
kubectl expose deployment wordpress --port 80 --target-port 80 --type ClusterIP
kubectl get pods
kubectl get services
kubectl describe service wordpress

Wynik przeprowadzonej operacji powinien przedstawiać się zgodnie z poniższym:

Możemy teraz przetestować, łącząc się lokalnie, czy aplikacja działa i jest uruchomiona na automatycznie zdefiniowanym adresie IP klastra MicroK8s:

yum -y installelinks
elinks 10.152.183.208

Podsumowanie

Zaprezentowaliśmy jedynie ułamek możliwości technologii, jakimi są Docker i Kubernetes. Chmura publiczna pozwala w bardzo wygodny sposób uruchamiać środowiska do celów nauki lub pracy z kontenerami. W zasadzie potrzebujemy jedynie docker-machine i aktywnego konta ArubaCloud – cała reszta operacji zostanie przeprowadzona poza naszym lokalnym komputerem. Do celów testowych naszych aplikacji idealnie sprawdzi się model usługi Cloud PRO, którego rozliczenie jest realizowane w modelu czasowego zużycia zasobów obliczeniowych. Pozwoli nam to na przetestowanie wielu kolejnych wersji naszej aplikacji i poniesienia kosztów tylko za czas, w którym aktywnie korzystaliśmy z chmury.