DevStack, OpenStack i OpenStack z Kolla na kontenerach

Tworzenie prywatnej czy to publicznej chmury nigdy nie było takie łatwe. Pojawienie się rozwiązania OpenStack na rynku w roku 2010 zrobiło pewną rewolucję w tej dziedzinie. 

DevStack

Zaczęcie zabawy z OpenStack jest bardzo prostę. Dzięki rozwiązaniu DevStack czyli środowiska deweloperskiego możemy bez specjalistycznej wiedzy zainstalować i testować OpenStack. Choć wymaga to od nas choć podstawowych umiejętności obsługi systemu Linux z cli. Po pierwsze musimy zainstalować czystą wersje systemu Ubuntu / CentOS. Po drugie mieć na tyle umiejętności by poruszać się po konsoli w celu pobrania repozytorium projektu z git i uruchomić je. Choć dobrze pójść o krok dalej i ustawić trochę wartości w pliku konfiguracyjnym by nie zastanawiać się jakie jest hasło do Dashboard modułu Horizon.

Uruchomienie jest proste i nie będzie tajemnicą jeżeli będę bazował na instrukcji z oficjalnej dokumentacji DevStack 

Po instalacji "czystej" wersji systemu Ubuntu / CentOS musimy upewnić się co do adresów w naszej sieci gdyż DevStack (OpenStack też) będzie wykorzystywał te adresy i przydzielał je według własnego serwera DHCP. Co wprzypadku działania w sieci drugiego takiego serwera może powodować konflikty adresów IP. Gdy nasz serwer DHCP z routera będzie przydzielał ten sam adres który, wybierze sobie DevStack. Najlepszym rozwiązaniem jest, jeżeli chcemy podłączyć DevStack do istniejącej sieci bez separacji NAT o wydzielenie puli dla serwera DHCP w naszym DevStack. Kolejnym sposobem podłączenie do innego rutera czyli osobnej sieci lub w samym DevStack utworzenie sieci NAT.

Instalacje zaczynamy od utworzenia użytkownika:

useradd -s /bin/bash -d /opt/stack -m stack

Instalujemy pakiet sudo i dodajemy użytkownika stack jako użytkownika uprawnionego do używania sudo bez podawania hasła.

apt install sudo -y
echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

Instalujemy też pakiet git. Przełączamy się na użytkownika stack. Klonujemy repo DevStack i przechodzimy do utworzonego repo.

sudo apt install git -y
sudo su - stack
git clone <span id=<span class="hljs-string">"<span id="https://git.openstack.org/openstack-dev/devstack">https://git.openstack.org/openstack-dev/devstack</span>"</span>>https://git.openstack.org/openstack-dev/devstack</span>
cd devstack

Samo uruchomienie DevStack to już tylko wydanie polecenia ./stack.sh

Można pokusić się o dodatkową konfigurację i zdefiniować swoje hasło i ustawienia IP w pliku devstack/samples/local.conf. Plik konfiguracyjny local.conf kopiujemy do tego samego katalogu gdzie znajduje się stack.sh

  • Ustawienie FLOATING_RANGE to zakres adresów IP nie używany w Twojej sieci podany wraz z maską np 192.168.1.1/24
  • Ustawienie FIXED_RANGE and FIXED_NETWORK_SIZE to ustawienie adresów IP wewnątrz sieci DevStack.
  • Ustawienie FLAT_INTERFACE to ustawienie interfejsu sieciowego takiego który, ma dostęp do Internetu.
  • Ustawienie hasła administracyjnego używanego dla konta admin i demo.
  • Ustawienie hasła administracyjnego do MySQL administrative password.
  • Ustawienie hasła do RabbitMQ.
  • Ustawienie hasła do usług. Używany przez OpenStack services (Nova, Glance, itp) do autoryzacji w Keystone.

Przykładowy plik local.conf zaprezentowany poniżej.

[[local|localrc]]
FLOATING_RANGE=192.168.1.224/27
FIXED_RANGE=10.11.12.0/24
FIXED_NETWORK_SIZE=256
FLAT_INTERFACE=eth0
ADMIN_PASSWORD=supersecret
DATABASE_PASSWORD=iheartdatabases
RABBIT_PASSWORD=flopsymopsy
SERVICE_PASSWORD=iheartksl

Konfiguracja od momentu wydania polecenia (uruchomienie skryptu) stack.sh wykonuje całą pracę automatycznie. W przypadku braku pliku konfiguracyjnego zostaniemy poproszeni o podanie hasła do wyżej wymienionych usług.

Dla lubiących oglądać i słuchać:

Po całej konfiguracji otrzymamy monit o dostępie dashboard pod adresem "wyplutym" przez konsolę. Przechodzimy pod adres i naszym oczom pokaże się

Operacje w dashboard przedstawię w osobnym wpisie. Przejdźmy teraz do innego modelu OpenStack All in one - opartego na kontenerach.

OpenStack Kolla na dockerach (All in one)

Projekt Kolla OpenStack to trochę inne spojrzenie na wdrożenie chmury. Nie wymaga on wysokich umiejętności od osoby przeprowadzającej wdrożenie. Proces jest automatyzowany dzięki ansible. Jednak nie można lekceważyć go jako pełno prawnego produktu. Gdyż przeniesieni środowiska na kontenery daje nam pewną elastyczność na rozwój środowiska i jego rozbudowę. Backup, wymiana uszkodzonych modułów/kontenerów też jest prostsza.

Spójrzmy zatem jak przeprowadzić konfigurację i wdrożenie OpenStack AIO z Kolla. Wersję którą weźmiemy na warsztat to wersja Pike OpenStack. 

Przygotowania

Będziemy potrzebowali "czystej" wersji systemu Ubuntu Server najlepiej 16.04 LTS z dwoma fizycznymi interfejsami sieciowymi (choć to też nie problem). Instalację i konfigurację niżej przedstawioną możemy przeprowadzić na fizycznym komputerze lub maszynie wirtualnej takiej jak VirtualBox, KVM, QEMU, VMware, Hyper-V itp. Ja instalacje wykonałem w VirtualBox.

Poniższy materiał zawiera trochę teorii oraz przeprowadza nas przez proces konfiguracji maszyny wirtualnej.

Pozwolicie, że proces instalacji systemu Ubuntu pominę w tym opisie i przejdziemy od razu do konfiguracji środowiska. Dla mniej wprawionych z VirtualBox zapraszm do innych moich wpisów lub materiału video poniżej

A zatem mamy nasz system Ubuntu.

Musimy zaktualizować nasz system i listę pakietów.

sudo apt update && sudo apt upgrade -y && sudo apt full-upgrade -y

Do środowiska OpenStack potrzebować będziemy dwie karty sieciowe dalej opisywane jako internal network i neutron external network, musimy je odpowiednio skonfigurować. Karta pierwsza może przyjąć adres DHCP lub static oczywiście z puli adresowej waszej sieci - u mnie to adres 10.255.255.2/24. W przypadku DHCP warto zadbać o to by adres zawsze był przydzielany ten sam, by po restarcie nie okazało się, że nasz OpenStack przestanie działać.

Druga karta będzie zarządzana przez OpenStack. Nie jest to żadna wiedza tajemna, a informacja o tym jest w pliku konfiguracyjnym. Dlatego wiec ustawimy ja w trybie manual. Da nam to pewność, że interface będzie zawsze UP po restarcie maszyny. Zatem konfigurujemy nasze karty sieciowe.

sudo nano /etc/network/interfaces

Plik interfaces może wyglądać podobnie do przedstawionego poniżej.

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet static
  address 10.255.255.3
  netmask 255.255.255.0
  gateway 10.255.255.1
  dns-nameservers 208.67.222.222 213.155.166.100 1.1.1.1 1.0.0.1

auto enp0s8
iface enp0s8 inet manual

Re starujemy sieć lub system 

sudo systemctl restart networking
# lub
sudo reboot

Może się tak zdarzyć, że po restarcie interfejsu (usługi networking) otrzymamy dwa adresy IP na interfejsie naszej karty sieciowej.

Wtedy wydajemy polecenia:

sudo ip a f dev <nazwa_interfejsu_sieciowego>; sudo systemctl restart networking

Po zmianie adresu IP może nas wyrzucić z konsoli SSH, jeżeli adres statyczny ustawimy na inny niż ten z DHCP po którym mamy aktywną sesję.

Pozostaje nam zainstalowanie tylko brakującej części oprogramowania a która, jest wymagana do uruchomienia środowiska.

sudo apt install python-jinja2 python-pip libssl-dev -y
sudo -H pip install -U pip ansible kolla-ansible

Konfiguracja

Kopiujemy przykładowe pliki konfiguracyjne (lepiej nazwać je wzorcowe) i dokonujemy ich edycji. 

sudo cp -r /usr/local/share/kolla-ansible/etc_examples/kolla /etc/kolla
sudo nano /etc/kolla/globals.yml

Bardziej szczegółowo plik omawiam w filmie poniżej

kolla_base_distro: "ubuntu"
kolla_install_type: "binary"
openstack_release: "pike"
kolla_internal_vip_address: "10.255.255.4"
kolla_external_vip_address: "10.255.255.5"
network_interface: "[nazwa pierwszej karty sieciowej]"
neutron_external_interface: "[nazwa drugiej karty sieciowej]"
kolla_enable_tls_external: "yes"
kolla_external_fqdn_cert: "{{ node_config_directory }}/certificates/haproxy.pem"

Powyżej zamiana opcji/miejsc, która w tym ćwiczeniu powinna nas interesować.

Dodatkowo tworzymy plik konfiguracyjny dla naszego modułu nova.

sudo mkdir -p /etc/kolla/config/nova
sudo vim /etc/kolla/config/nova/nova-compute.conf
# w pliku nova-compute dodajemy poniższą zawartość
[libvirt]
virt_type = qemu
cpu_mode = none

Jeżeli daliśmy yes dla TSL (nie jest on wymagany, możemy dać "no") to musimy wygenerować certyfikaty:

sudo kolla-ansible certificates

Możemy też wygenerować sobie certyfikaty let's encrypt by nasz certyfikat był rozpoznawany. Wystarczy tylko wygenerowane przez let's certyfikaty nazwać idenctycznie jak te wygenerowane przez kolla-ansible

Generujemy hasła dla naszego środowiska (plik po wygenerowaniu można edytować przed rozpoczęciem konfiguracji naszego środowiska w celu ustawienia prostszego hasła dla konta administratora itp).

sudo kolla-genpwd

Przygotowanie serwera czyli bootstrap. Zainstaluje on wszystkie niezbędne skłądniki sprawdzi też czy konfiguracja jest prawidłowa:

sudo kolla-ansible -i /usr/local/share/kolla-ansible/ansible/inventory/all-in-one bootstrap-servers

Pobieramy obrazy Dockera oraz po zakończeniu sprawdzamy czy mamy je wszystkie.

sudo kolla-ansible pull
sudo docker images

Dokonujemy sprawdzenia przed finalnym wdrożeniem. Zweryfikuje poprawność plików konfiguracyjnych pakietów itp.

sudo kolla-ansible prechecks -i /usr/local/share/kolla-ansible/ansible/inventory/all-in-one

Wdrożenie

Nasze wdrożenie. Tu będą już stawiane kontenery i odpowiednio konfigurowane.

sudo kolla-ansible deploy -i /usr/local/share/kolla-ansible/ansible/inventory/all-in-one

Sprawdzamy kontenery - wszystkie powinny mieć cały czas status UP

sudo docker ps -a

Generujemy plik admin-openrc który jest plikiem konfiguracyjnym. Na podstawie tego pliku będziemy przełączać się na odpowiedni kontekst do projektów w OpenStack i wydawać komendy w CLI. 

sudo kolla-ansible post-deploy

Instalujemy klienta CLI dla OpenStack.

sudo -H pip install -U python-openstackclient

Edytujemy plik /usr/local/share/kolla-ansible/init-runonce

sudo /usr/local/share/kolla-ansible/init-runonce

Konfigurację tego pliku ustawiamy na:

EXT_NET_CIDR='10.255.225.0/24'
EXT_NET_RANGE='start=10.255.255.6,end=10.255.255.36'
EXT_NET_GATEWAY='10.255.255.1'

Oczywiście jeżeli chcecie możecie zwiększyć ilość urządzeń w sieci. Uzyskamy to po przez podanie większego zakresu w zmiennej EXT_NET_RANGE.

Przełączamy się na root i ładujemy kontekst pracy z OpenStack i uruchamiamy edytowany przed chwilą skrypt.

sudo su -
source /etc/kolla/admin-openrc.sh
cd /usr/local/share/kolla-ansible/
./init-runonce
exit

Horizon jest dostępny pod adresem podanym w kolla_external_vip_address: a hasło dla konta admin możemy po brać stąd:

sudo grep keystone_admin_password /etc/kolla/passwords.ym

W kolejnym odcinku poruszamy się po naszym dashboard :)

Bibliografia

All in One :)