Kontenery jako usługi w systemie EuroLinux 8

Kontenery jako usługi w systemie EuroLinux 8

W systemie EuroLinux 8 możemy tworzyć jednostki systemd uruchamiające kontenery wraz ze startem serwera i kończące pracę kontenerów wraz z jego wyłączeniem. Jednostki te można tworzyć nawet dla kontenerów uruchamianych w trybie „rootless”, zwiększając tym samym bezpieczeństwo serwera i całej infrastruktury.

Wdrażając usługi serwerowe jako kontenery, zazwyczaj wymaga się, aby były one uruchamiane automatycznie podczas startu serwera. W systemie EuroLinux 8, tak jak w innych systemach Linux klasy Enterprise, możemy tworzyć jednostki systemd uruchamiające kontenery wraz ze startem serwera i kończące pracę kontenerów wraz z jego wyłączeniem. Jednostki te można tworzyć nawet dla kontenerów uruchamianych w trybie „rootless” (bez wymogu korzystania z poziomu użytkownika uprzywilejowanego), zwiększając tym samym bezpieczeństwo serwera i całej infrastruktury.

Oprócz zarządzania usługami systemowymi systemd może zarządzać również usługami użytkownika. Dzięki usługom systemd użytkownicy mogą tworzyć pliki jednostkowe dla własnych usług i zarządzać nimi za pomocą poleceń systemctl, bez konieczności posiadania dostępu do konta roota. Jednak, aby zmusić włączone przez użytkownika usługi do startu wraz z uruchomieniem serwera i do zatrzymywania tych usług podczas jego wyłączania, należy wcześniej uruchomić polecenie loginctl enable-linger. W celu zapoznania się z aktualnym statusem można użyć polecenia loginctl show-user nazwa_użytkownika.

Aby zdefiniować usługi użytkownika, należy w pierwszej kolejności utworzyć katalog służący do przechowywania plików jednostek:

mkdir -p ~/.config/systemd/user/

Składnia tych plików jest taka sama, jak plików jednostek systemowych. Aby kontrolować nowe usługi użytkownika, możemy użyć polecenia systemctl z opcją user. Uruchamianie kontenerów tą metodą, jest przydatne głównie dla podstawowych i małych wdrożeń, które nie muszą być skalowalne.

Tworzenie pliku jednostki systemd

Na początek utwórzmy kontener, korzystając z zasobów EuroLinux i nazwijmy go elident:

podman create -p 8080:80 --name elident eurolinuxid/cntident

Z istniejącego już kontenera, polecenie podman może wygenerować plik jednostkowy systemd, w identyfikacji posiłkując się utworzoną wcześniej nazwą elident.

[eurolinux@el84 ~]$ cd ~/.config/systemd/user/
[eurolinux@el84 user]$ podman generate systemd --name elident --files --new

Przyjrzyjmy się tak wygenerowanemu plikowi jednostki systemd:

[eurolinux@el84 user]$ cat container-elident.service
# container-elident.service
# autogenerated by Podman 3.2.3
# Sun Oct 24 16:07:10 CEST 2021

[Unit]
Description=Podman container-elident.service
Documentation=man:podman-generate-systemd(1)
Wants=network.target
After=network-online.target
RequiresMountsFor=%t/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStartPre=/bin/rm -f %t/container-elident.pid %t/container-elident.ctr-id
ExecStart=/usr/bin/podman run --conmon-pidfile %t/container-elident.pid --cidfile %t/containe
r-elident.ctr-id --cgroups=no-conmon -d --replace -p 8080:80 --name elident eurolinuxid/cntid
ent
ExecStop=/usr/bin/podman stop --ignore --cidfile %t/container-elident.ctr-id -t 10
ExecStopPost=/usr/bin/podman rm --ignore -f --cidfile %t/container-elident.ctr-id
PIDFile=%t/container-elident.pid
Type=forking

[Install]
WantedBy=multi-user.target default.target

Polecenie podman generate systemd używa kontenera, jako modelu do utworzenia pliku konfiguracyjnego. Po utworzeniu pliku możemy usunąć kontener, ponieważ systemd oczekuje, że kontener będzie nieobecny – wszystkie informacje niezbędne do jego utworzenia, są już zawarte w powyższym pliku jednostki systemd.

Polecenie podman generate systemd korzysta z następujących opcji:

  • --name nazwa_kontenera – określa nazwę istniejącego kontenera, który ma zostać użyty jako model do generowania pliku jednostkowego. Podman używa również tej nazwy do tworzenia nazwy pliku jednostki
  • --new – nakazuje Podmanowi skonfigurowanie usługi systemd do tworzenia kontenera – gdy usługa się uruchamia i usuwania go – gdy usługa się zatrzyma. W tym trybie kontener jest efemeryczny. Bez opcji --new, Podman skonfiguruje usługę do uruchamiania i zatrzymywania istniejącego kontenera, nie usuwając go
  • --files – nakazuje Podmanowi wygenerowanie pliku jednostki w bieżącym katalogu. Bez tej opcji Podman wyświetla plik na swoim standardowym wyjściu.

W naszym przykładzie (z wykorzystaniem opcji --new) przy starcie serwera systemd wykonuje polecenie podman run, aby utworzyć, a następnie uruchomić nowy kontener. W momencie zatrzymania serwera systemd wykonuje polecenie podman stop, aby zatrzymać kontener. Po zatrzymaniu kontenera systemd usuwa kontener za pomocą polecenia podman rm.

Kontenery zarządzane za pomocą polecenia systemctl są kontrolowane przez systemd. Monitoruje on status kontenerów i restartuje je, jeśli zawiodą. Nie należy używać polecenia podman do uruchamiania lub zatrzymywania tych kontenerów, ponieważ może to zakłócać monitoring oparty na systemd.

Domyślnie włączone usługi użytkownika systemd startują, gdy użytkownik otwiera pierwszą sesję i zatrzymują się, gdy użytkownik zamyka ostatnią sesję (np. ssh).
Aby usługi użytkownika startowały automatycznie wraz z serwerem, wykonajmy teraz wspomniane wcześniej polecenie loginctl enable-linger.

Aby kontener uruchamiał się przy starcie serwera, użyjmy jeszcze polecenia
systemctl --user enable container-nazwa_kontenera, czyli w naszym przypadku:

[eurolinux@el84 ~]$ systemctl --user enable container-elident

Następnie zrestartujmy serwer.

Po restarcie powinniśmy zobaczyć stronę, będącą wynikiem pracy kontenera elident:

Aby wyłączyć uruchamianie kontenera przy starcie serwera, użyjmy polecenia systemctl
z opcją disable:

[eurolinux@el84 ~]$ systemctl --user disable container-elident

Zarządzanie kontenerami uruchamianymi z poziomu użytkownika root

Kontenery, które mają być uruchamiane z poziomu administratora, również można skonfigurować tak, aby były zarządzane za pomocą plików jednostek systemd. Skonfigurowane pliki będą wtedy działały dokładnie tak, jak zwykłe systemowe pliki jednostek. Procedura konfiguracji jest podobna do tej, którą opisano wcześniej dla kontenerów root-less, z następującymi różnicami:

  • podczas konfigurowania usługi kontenera za pomocą systemctl, nie należy używać opcji --user
  • kiedy będzie tworzony plik jednostki za pomocą polecenia podman generate systemd, należy wykonać to polecenie w katalogu /etc/systemd/, zamiast w katalogu ~/.config/systemd/user
  • nie trzeba uruchamiać polecenia loginctl enable-linger.

Podsumowanie

Konteneryzacja jest ważną częścią dzisiejszych rozwiązań technologicznych, a systemowa możliwość monitoringu automatycznie uruchamianych, bezpiecznych kontenerów root-less, jest atutem systemów klasy Enterprise – w tym również EuroLinux 8. Właśnie w tych systemach Podman jest domyślnym silnikiem konteneryzacyjnym, a jego instalacja ogranicza się do wprowadzenia polecenia: dnf install podman. Więcej informacji o Podmanie można znaleźć w naszym wcześniejszym artykule Podman kontra Docker – bezpieczna konteneryzacja.

Autorzy

Artykuły na blogu są pisane przez osoby z zespołu EuroLinux. 80% treści zawdzięczamy naszym developerom, pozostałą część przygotowuje dział sprzedaży lub marketingu. Dokładamy starań, żeby treści były jak najlepsze merytorycznie i językowo, ale nie jesteśmy nieomylni. Jeśli zauważysz coś wartego poprawienia lub wyjaśnienia, będziemy wdzięczni za wiadomość.