18.12.2019 | 09:47

redakcja

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.

Powrót

Komentarze

  • 2019.12.19 02:22 Michal

    Jak to jakaś czarna magia dla mnie i muszę projekt zrobić mikroserwisów na studia :/

    Odpowiedz
    • 2019.12.19 17:53 M2

      O, a na jakiej to uczelni uczą o mikroserwisach?

      Odpowiedz
      • 2019.12.20 14:06 Michal

        Studiuje w UK, mam uzyc mikroserwisow do stworzenia projektu bazujacego na architekturze Netflix’a przy pomocy Docker’a.

        Odpowiedz
    • 2019.12.20 17:32 wk

      @Michal

      „Wszystko jest trudne zanim stanie się łatwe” :) Nauczysz się.

      Odpowiedz
  • 2019.12.29 00:32 John Smith

    Smiech na sali. Po piersze uzywamy dnf od ladnych kilku lat. Trzeba miec naprawde bardzo stary komputer zeby uzywac Red Hat ze sredniowiecznym krenelem (tak widze to po uzyci yum). Fedora uzywa dnf. Tacy z was experci jak z koziej d…y traba.

    Wyjasniam:
    $ 'dnf update’ to NIEPRAWIDLOWA komenda. $ dnf update jest „deprecated”
    Prawidlowa komenda/polecenie to wg Fedory (wiki, docs, strona dnf)”
    $ „dnf upgrade’ mozna dodac -y jako yes na wszystko (niezalecane u Archa dla pacman, gdzie przelacznik to –noconfirm).

    Wg expertow jednak prawidlowe polecenie to (tworca dnf nie informuje nas o tym…):
    $ 'dnf –refresh upgrade’ i potwierdzamy 'y’ (zeby widziec co potwirdzamy a nie bezmyslnie potwierdzac za wczasu).

    Tacy z was specjalisci jak z koziej dupy traba. Zreszta nikt nie uzywa Fedory bo ma ona problemy z bootowaniem „kernel-core’. „kernel-core” jest bootowany przez uwaga: systemd, a nie jak blednie niektorzy mysla GRUB2. Po updacie kernela mozna sie spodziewac ze nowy kernel nie bedzie widoczny w grubie i wszelkie manipulacje GRUBEM (typu „grub update’ czy jakies tam update balahblah.cfg czy extremalna edycja NIE POMOGA!). Poza tym network manager (nm-network czy jak mu tam jest tylko kompatybilny z GNOME, ale z KDE ma problemy z associate (po zalogowaniu trwa to wieki). VMLINUZ crashes. Masakra. Najwolniejsza dystrybucja swiata.

    Tacy z was eksperci jak z koziej d…y traba!

    Odpowiedz
  • 2019.12.29 00:50 John Woodoo

    A po wuj wam html5 canvas? A po za tym to kto uzywa aplikacji snap. Uzywa sie dla bezpieczenstwa shared libraries. Nie bedziemy lazic po necie i sciagac aplikacji tylko domyslnie uzywamy kluczy pgp jak co instalujemy z repo. Jak bym za kazdym razem mial sprawdzac w kazdej aplikacjie typu „self contained” czy akurat jest tam prawidlowa zaktulalizowana wersja jakiejs tam zaleznosci z zalatanym bledem/0dayem to bym zwariowal. Eksperci kurna.

    Odpowiedz
  • 2020.01.06 20:06 Maciej

    @John Smith – z koziej dupy to Ty chyba wypadłeś – prosto w to co ta koza wcześniej zrobiła. Poczytaj dziecko o dystrybucji CentOS i jak się ona ma do serii RHEL…

    Odpowiedz
  • 2020.01.07 22:33 asdf

    Niestety Docker Machine wygląda na zatrzymany projekt, na oficjalnej stronie Dockera jest w dziale „Superseded products and tools”: https://docs.docker.com/machine/reference/create/

    Odpowiedz

Zostaw odpowiedź do John Smith

Jeśli chcesz zwrócić uwagę na literówkę lub inny błąd techniczny, zapraszamy do formularza kontaktowego. Reagujemy równie szybko.

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

Komentarze