Czym jest openstack?

Jako alternatywę dla płatnych dostępów do usług cloud computingowych szczególnie warto wyróżnić OpenStack. Projekt OpenStack ma swoje korzenie w 2010 roku jako wspólne dzieło Rackspace Hosting i Narodowej Agencji Kosmicznej. Najnowsza wersja stabilna została wydana w maju 2015 roku. Jest to innowacyjna technologia implementująca model IaaS. OpenStack powstał na licencji Apache License 2.0, jest oprogramowaniem open-sourcowym, zarządzanym przez OpenStack Foundation, organizację o statusie non-profit. Technologia OpenStack składa się z wielu powiązanych ze sobą projektów w różnych dziedzinach Cloud Computingu. Dotyczy on gromadzenia danych, zasobami sieciowymi i przede wszystkim zarządzania procesem wirtualizacji. Zarządzanie może odbywać się za pomocą przeglądarki internetowej z konta użytkownika, z poziomu komend lub udostępnianego do obsługi protokołem REST API.

Wymienione projekty są ze sobą zintegrowane, każdy z nich grupuje szereg funkcjonalności niezbędnych do zarządzania w chmurze. Elementy można powielać uzyskując jak najbardziej optymalną wydajność. Programiści przyczyniający się do tworzenia głównego kodu OpenStacka, mają intencję stworzenia nowego, wolnego standardu chmury, co analogią mógłby być Internet. Rozwiązania dostarczane przez OpenStack miałyby stać się alternatywą dla zamkniętych prywatnych i publicznych rozwiązań chmurowych. OpenStack posiada wiele zalet. Przede wszystkim gwarantuje bezpieczeństwo danych, kiedy można problem ich przechowywania rozwiązać chmurą hybrydową i przechowywać dane w chmurze publicznej a krytyczne w lokalnej chmurze prywatnej. Platforma OpenStack jest skalowalna, moc chmury można dopasować do własnych potrzeb. Używanie technologii OpenStack podnosi efektywność zarządzania cyklem życia poszczególnych instancji, takich jak uruchamiania, przebudowywanie, usuwanie. Udostępnione jest również wygodne zarządzanie bazą obrazów systemowych, ich importowanie i tworzenie. Zarządzanie sieciami jest również elastyczne i pozwala dostosować infrastrukturę pod konkretne aplikacje. Bezpieczeństwo może zostać dodatkowo wzmocnione poprzez definiowanie grup bezpieczeństwa określających poziom dostępu do instancji dla przypisanych użytkowników. Istnieją różne usługi udostępnione w ramach używania oprogramowania OpenStack. Można z jego pomocą budować aplikacje typu SaaS, zarówno poprzez nowe wdrożenie jak i zastąpienie istniejącego rozwiązania w firmie. Z pomocą OpenStack możliwe jest budowania aplikacji typu “self-service storage”, które charakteryzują się przechowywaniem danych w chmurze jak główna funkcjonalność. Dane mogą być przechowywane w postaci obiektów lub bloków. Firma, która korzystała z oprogramowania VMware, może zastąpić je technologią KVM (Kernel-based Virtual Machine) wspieraną przez OpenStack. OpenStack jest szeroko wspierany przez światowe korporacje, z których można wymienić Cisco, Dell, HP, IBM, Red Hat i VMware. W skład projektu OpenStack wchodzi wiele komponentów, niektóre z nich zostaną omówione w artykule pod względem działania i implementacji.

OpenStack

Wiele firm zaufało technologii OpenStack i na jej podstawie również firmy zajmujące się hostingiem stworzyły własne rozwiązanie umożliwiające klientom korzystanie z serwerów, których zarządzanie odbywa się w technologii OpenStack. Przykładem takiej firmy są serwery.pl, w której możliwe jest elastyczne rozliczanie za używane godziny, dzięki wykorzystaniu dobrych rozwiązań.

OpenStack API

Kod projektu OpenStack został napisany w Pythonie, więc OpenStack API udostępnia bibliotekę do tworzenia chmury w języku programowania Python. Wystarczy biblioteka Python, narzędzie CLI i po zainstalowaniu pakietów projektów OpenStacka można rozpocząć tworzenie systemu Cloud, który będzie pod względem wielu czynności zautomatyzowany. Z API OpenStack można komunikować się za pomocą narzędzia cURL, który jest sieciową biblioteką programistyczną umożliwiającą wysyłanie zapytań HTTP ułatwiając tworzenie aplikacji korzystających z protokołu HTTP. Można go używać z wiersza poleceń lub z dowolnego języka programowania, który obsługuje bibliotekę cURL, może to być również Python. Kolejnym sposobem komunikacji mogą być narzędzia dostarczane przez OpenStack, czyli wspomniane komunikowanie się z linii poleceń w konsoli po instalacji projektu.

Keystone

Keystone należy do podstawowych komponentów OpenStacka umożliwiający zarządzanie użytkownikami oraz przede wszystkim ich autoryzacją. Jest odpowiedzialny za usługę potwierdzania tożsamości. Zawiera listę użytkowników i listę uprawnień. Za jego pośrednictwem odbywa się uwierzytelnianie dostępu do poszczególnych chmur. Poniżej posłużono się modelem jednej z dostępnych identyfikacji, tzw. v2, w którego skład wchodzą zabezpieczenia w postaci: posiadaczy – tenants, użytkowników – users, uprawnień – roles, usług – services, endpoints – adres dostępu do interfejsu. Keystone jest pierwszym komponentem, od którego zaczyna się korzystanie z API, ponieważ do wykonywania operacji na chmurze potrzebna jest autoryzacja. Keystone zwraca unikalny token wygenerowany dla klienta.

Podstawową implementacją skryptu wykorzystującego Keystone, jest stworzenie instancji klienta z posiadanymi wcześniej danymi do uwierzytelnienia. Można logować się przez hasło lub bardziej polecane: poprzez użycie tokena, którego podaje się jako jeden z parametrów w trakcie tworzenia instancji Client. Jeżeli dany użytkownik miał przypisaną rolę admin, zyskuje on swobodny dostęp do przeglądania danych związanych z cloudem. Admin, czyli administrator, tworzy nowe uprawnienia, grupy użytkowników, a także wraz z dołączaniem kolejnych modułów przegląda listy obrazów, maszyn, sieci i inne obiekty udostępniane w komponentach OpenStacka

Wymieniona w trzeciej linijce kodu lista tenant jest grupą projektową, do której przynależą użytkownicy danej chmury. Można wykonywać zapytania również o inne listy:

  • Flavor – możliwe konfiguracje serwera (keystone.flavors.list())
  • User – listy użytkowników
  • Tenant – projekt z id i przypisanymi do niego użytkownikami
  • Role – przywileje i uprawnienia, przypisywane użytkownikom
  • Service – chmury utworzone przez hipervisore’a
  • Endpoint – interfejsy w postaci adresu URL

Są dwa sposoby na logowanie się z wykorzystaniem keystone: jako administrator z tzw. “tokenem”, który zostanie wygenerowany dla administratora jako ciąg znaków, oraz na publiczną maszynę z nazwą użytkownika i hasłem jako pośredni użytkownik. Wartość tokena jest określona w pliku konfiguracyjnym keystona keystone.conf jako jedna z opcji, plik powinien znajdować się w /etc/keystone. Należy również się upewnić, że poprzez url administratora loguję się na port: 355357, a użytkownik na port: 5000.

>>> auth_url='http://192.168.206.130:5000/v2.0' >>>
			keystone = client.Client(username=username, password=password, ...
			tenant_name=tenant_name, auth_url=auth_url)

Requesty w danej sesji po pierwszej autoryzacji powinny być wykonywane z użyciem tokena zamiast hasła.

Nova

Komponent Nova odpowiada zarządzaniu instancjami. Nova może być traktowana jako główny komponent OpenStacka, ponieważ praktycznie po dokonaniu autoryzacji wszelkie zarządzanie obrazami, sieciami i innymi zależnościami w chmurze może dokonywać za pomocą odwołania do obiektu klienta z Nova Client.

W używaniu Novej zaleca się używania baz danych bazujących na SQLu, które są rozpoznawane przez wszystkie komponenty systemu. Ilość zagłębień danych dopasowuje się do bazy danych. Dla małych zapotrzebowań jest to optymalne rozwiązanie, dla większych, zwłaszcza gdy klient koncentruje się na bezpieczeństwie, Nova będzie przeniesiona na wiele magazynów udostępnionych przez system zarządzający. Nova składa się z kilku kluczowych komponentów.

Nova Servers

Odwołanie do obiektu klasy Nova o nazwie Servers daje możliwość działań listowania, tworzenia, pytania o szczegóły, edycji właściwości i dodawnia/usuwania serwerów. Operacje będą wykonywane poprzez odwołanie z class novaclient.v2.servers. Moduł Nova Servers pozwala określić dla serwera metadane, o maksymalnym rozmiarze dla każdego słownika metadanych 255 bajtów.

Dla prostych potrzeb Nova może zarządzać sieciami, może określać z jakim innym serwerem może się łączyć instancja. Można tworzyć wiele sieci. Użytkownik ustalający sieć może również określić port i prywatny adres IP instancji. Dopuszczalny jest zarówno standard IPv4 jak i IPv6. Z pomocą Nova Server można przesłać pliki systemowe do instancji, np. klucze SSH, pliki konfiguracyjne, albo bazę danych, z której chce się korzystać będąc w danej instancji. Ważne jest, aby po lub przed przeniesieniem plików sprawdzić, czy plik o danej nazwie w katalogu nie istniał, ponieważ w przeciwnym razie plik zostanie skopiowany, ale uzyska rozszerzenie .bak. Po przeniesieniu warto również sprawdzić prawa do plików, ponieważ po wysłaniu do osobistych plików dostęp będzie dla zwykłych użytkowników tylko na zasadzie odczytu.

Nova Flavors

Określa możliwe konfiguracje sprzętowe dla serwera. Przy pomocy Flavor określa się zasoby fizyczne dla tworzonej instancji. W procesie tworzenia takiej konfiguracji definiuje się po kolei: nazwę konfiguracji – treściwie opisującą dany flavor, ram – dostępność zasobu ram w MB, vcpus – numer vcpus, rozmiar dysku – w GB, opcjonalne ID – możliwe domyślne “auto”, swap – w MB, RX/TX factor. Każdy obiekt z listy flavors jest unikalną kombinacją przestrzeni dyskowej i pojemności pamięci. Oprócz tworzenia można wydobywać listy oraz pytać o szczegóły konfiguracji.

Nova Images

Nova Images reprezentuje obraz systemu, jest zbiorem plików, które używamy aby przebudować lub zainstalować system na serwerze. Domyślnie jest dostarczany system operacyjny, ale można wybrać własny, np. Ubuntu, Linux Mint (polecam), Windows 10 (nie polecam).

Glance

Komponent Glance dotyczy załączania, tworzenia, zarządzania obrazami wirtualnych maszyn. Obrazy instancji mogą być gromadzone w różnych lokacjach dla prostego systemu plików w sposób, aby mogły być zintegrowane z używaniem komponentu OpenStack Swift. Projekt Glance dostarcza usługę, kiedy użytkownik może wysyłać aktywa danych, które są używane przez inne komponenty. Glance ma architekturę działającą po stronie serwera. Posiadany obraz maszyny użytkownik chmury przesyła na zdalny serwer (glance.upload()). Podczas procedury przesyłania zabezpiecza się proces wbudowaną konstrukcją “with” charakterystyczną dla Pythona w sposób przedstawiony w poniższym skrypcie, który pokazuje proces od zalogowania klienta obsługującego moduł Glance poprzez upload do usunięcia obrazu.

>>> from glanceclient import Client >>> glance =
			Client('1', endpoint=OS_IMAGE_ENDPOINT, token=OS_AUTH_TOKEN) >>>
			image = glance.images.create(name="My Test Image") >>> print
			image.status 'queued' >>> image.update(data=open('/tmp/myimage.iso',
			'rb')) >>> print image.status 'active' >>>
			image.update(properties=dict(my_custom_property='value')) >>> with
			open('/tmp/copyimage.iso', 'wb') as f: for chunk in image.data():
			f.write(chunk >>> image.delete()

Powyższy przykład pozwala również zapoznać się z cyklem statusu obrazu. Po stworzeniu obrazu jego status jest ‘queued’ – kolejkowany, czeka na uzupełnienie i zatwierdzenie, ponieważ sam proces tworzenia to stworzenie obiektu z atrybutem ‘name’. Obiekt uzupełniono o obraz zapisany w formacie .iso. Obraz jest aktywny i gotowy do użycia. Ostatni etap, przesłanie, wgrywa system do chmury. Teraz przy logowaniu do urla maszyny użytkownik zobaczy przygotowany system operacyjny gotowy do użycia. Z zakresu zarządzania obrazami istotne są kwestie dostępności obrazu. Obraz można wgrać jako publiczny i będzie widoczny dla każdego użytkownika tworzonej chmury lub prywatny i użytkownik chmury proszący o listę obrazów nie zobaczy prywatnego obrazu nie będąc w grupie ‘admin’. Podobnie próba usunięcia przez zwykłego użytkownika dla prywatnego obrazu zwróci błąd 404, ponieważ zasób o podany Id nie zostanie znaleziony.

Obrazy tworzone przez Glance mają szereg parametrów, po których może odbywać się filtracja podczas wyszukiwania obrazu. Podstawowymi atrybutami obrazu są nazwa obrazu, format dysku, status, rozmiar minimalny i maksymalny obrazu, dostępność. Zapytania o szczegóły obrazu przy użyciu REST odbywają się poprzez zapytania typu GET /v1/images/details. Glance jest kompatybilne zarówno z formatem JSON jak i XML, przykład zwróconej odpowiedzi zakodowanej w JSONie może wyglądać następująco:

{'images': [ {'uri':
			'http://glance.example.com/v1/images/71c675ab-d94f-49cd-a114-e12490b328d9',
			'name': 'Ubuntu 10.04 Plain 5GB', 'disk_format': 'vhd',
			'container_format': 'ovf', 'size': '5368709120', 'checksum':
			'c2e5db72bd7fd153f53ede5da5a06de3', 'created_at': '2010-02-03
			09:34:01', 'updated_at': '2010-02-03 09:34:01', 'deleted_at': '',
			'status': 'active', 'is_public': true, 'min_ram': 256, 'min_disk': 5,
			'owner': null, 'properties': {'distro': 'Ubuntu 10.04 LTS'}}, ...]}

Trove

Przechodząc do utrzymywania bazy danych w chmurze warto wspomnieć o Trove, który jest usługą tzw. database-as-a-service. Celem Trove jest pozwolenie użytkownikiem na szybkie i łatwe używanie baz danych bez ciężaru obsługi złożonych zadań administracyjnych. W ramach Trove Openstack dostarcza relacyjny i nierelacyjny silnik do obsługi baz danych w chmurze. Kiedy Trove wysyła komendy, aby stworzyć instancję potrzebuje współpracy z Nova do stworzenia instancji i Glance do przesłania poprawnego obrazu.

Neutron

Neutron jest usługą dostarczającą połączenie sieciowe tzw. “network connectivity as a service”. Pozwala na zarządzanie połączeniami pomiędzy interfejsami urządzeń a innymi usługami OpenStacka, przede wszystkim dla instancji utworzonych przez Nova. OpenStack Neutron dostarcza możliwość łagodzenia obciążenia sieci w środowisku chmurowym, pozwala łatwiej dostarczać usługi typu Network as a Service w chmurze. Pozwala właścicielom na tworzenie wielu prywatnych sieci i ustalania puli adresów IP dla nich. W rezultacie zyskuje się dodatkową kontrolę nad bezpieczeństwem i jakością usług (QoS), monitorowaniem, rozwiązywaniem problemów poprzez wdrażanie zaawansowanych usług sieciowych takich jak blokady sieciowe (firewall), wsykrywanie włamań, VPN. Z praktycznej strony po autoryzacji przy użyciu tokena administratora otrzymuje się dostęp do zarządzania siecią. Przykład stworzenia sieci, wylistowanych po nazwie i pytania o detale reprezentuje fragment poniższego skryptu:

import logging >>> from neutronclient.neutron import
			client >>> logging.basicConfig(level=logging.DEBUG) >>> neutron =
			client.Client('2.0', endpoint_url=OS_URL, token=OS_TOKEN) >>>
			neutron.format = 'json' >>> network = {'name': 'mynetwork',
			'admin_state_up': True} >>>
			neutron.create_network({'network':network}) >>> networks =
			neutron.list_networks(name='mynetwork') >>> print networks >>>
			network_id = networks['networks'][0]['id'] >>>
			neutron.delete_network(network_id)

Jak można zauważyć formatem do komunikacji z neutronem stał się json, a kluczowym atrybutem tworzonej sieci jest “id” konieczny do odwołań w celu usunięcia lub edycji. Powyższy przykład reprezentuje tworzenie podstawy do tworzenia sieci, ponieważ za pomocą obiektu networks będzie można wykonywać operacje typowe dla zarządzania siecią. Możliwości są bardzo rozbudowane. Zaczynają się od przypisywania instancji do danej sieci i przypisywaniu IP, przez ustalanie podsieci, masek podsieci, ruterów po przypisywanie publicznego IP i testowanie połączeń między instancji zbudowany w różnych podsieciach i sieciach.

Podsumowanie

OpenStack zdobywa coraz większą popularność, zwłaszcza wśród korporacji. Poniżej zamieszczono listę firm, które oficjalnie się przyznają do korzystania z technologii OpenStack.

OpenStack

Dane z grudnia 2014 roku mówią o 198 firmach, które wdrażają rozwiązania OpenStacka. OS Foundation opiekująca się projektem podaje, iż system posiada ponad 22 miliony linii kodu, napisane przez 21 tysięcy programistów. Ktoś nawet policzył, że gdyby jeden programista miał napisać całego OpenStacka samodzielnie musiałby zacząć pracę ok. roku 1600. Myślę, że te liczby potwierdzają, że warto zainteresować się tą technologią, zwłaszcza, jeżeli ktoś planuję pracę w IT. Chmury obliczeniowe to przyszłość informatyki, a OpenStack zdecydowanie zyskuje na popularności, nawet w stosunku do komercyjnych rozwiązań jak Eucalyptus Amazona.

Źródła

  • http://docs.openstack.org/developer/
  • http://blog.integratedsolutions.pl/is-news/openstack-jak-stworzyc-chmure/
  • http://www.computerworld.pl/news/397000/Cz.i.jak.male.i.srednie.firmy.moga.wdrazac.chmury.OpenStack.html
  • https://wiki.openstack.org/wiki/Trove
  • https://www.sdxcentral.com/resources/open-source/what-is-openstack-quantum-neutron/

  • Kamil Koczurek

    “co analogią mógłby być Internet”, “w klokalnej chmurze”, “definiowanie grub bezpieczeństwa”, “Podstawowa implementacja skryptu wykorzystującego Keystone jest stworzenie instancji klienta”, “Można kogować się”, “Zapytania o szczegóły obrazy”, “firmach, któe wdrażają”. Poza tym miło się czytało. ;)

    • Sebastian

      Wystarczyłby formularz do zgłaszania literówek. Też w oczy rzuciło mi się kilka, błędy typowe dla zmęczenia.

    • Kamil Koczurek

      Nom, byłoby fajnie. Słyszycie tam na górze? ;)

  • mm

    Instalowałem, konfigurowałem, a później próbowałem rozwijać OpenStacka. Trauma do końca życia :)

  • xbartx

    “loguje się na port: 355357” ?