GNU/Linux >> Znalost Linux >  >> Linux

Jak spouštět pody jako systémové služby s Podmanem

Podman je dobře známý svou bezproblémovou integrací do moderních linuxových systémů a podpora systemd je základním kamenem tohoto úsilí. Linux běžně používá systém systemd init ke správě místních služeb, jako jsou webové servery, kontejnerové stroje, síťové démony a všechny jejich vzájemné závislosti. Rozšíření těchto tradičnějších postupů správy systému Linux o moderní svět kontejnerů je přirozeným vývojem.

Existují dva běžné případy použití pro kombinaci systemd a kontejnerů:

  • Spuštění systemd uvnitř kontejneru
  • Použití systemd ke spouštění kontejnerizovaných aplikací

První scénář je spuštění systemd uvnitř kontejneru. Jak vysvětluje Dan Walsh, spuštění systemd uvnitř kontejneru je tak jednoduché, jak jen může být při používání Podman. Podman automaticky nastaví několik držáků v kontejneru a systemd je dobré jít. I když je to poměrně malá funkce Podman, byl to obrovský skok pro spouštění kontejnerových úloh, když byla představena.

Historicky jiné kontejnerové nástroje nepodporovaly systemd. Uživatelé čelili výzvě psaní vlastních init skriptů, které jsou náchylné k chybám a zatěžují dodavatele softwaru. S Podmanem všechny tyto problémy zmizí. Uživatelé mohou pomocí systemd instalovat a spouštět své aplikace v kontejnerech, stejně jako kdekoli jinde, a dodavatelé softwaru nebudou čelit výzvám při práci s vlastními init skripty napsanými jejich uživateli.

Druhý scénář využívá systemd ke spouštění a správě kontejnerizovaných aplikací. To znamená, že systemd spustí kontejnerizovanou aplikaci a spravuje celý její životní cyklus. Podman to zjednodušuje pomocí podman generate systemd příkaz, který generuje soubor systemd unit pro zadaný kontejner nebo pod. Podman v1.7 a novější podporují generování takových jednotek. Postupem času náš tým tuto funkci vylepšil a vygeneroval soubory systemd unit, které lze spustit na jiných počítačích, podobně jako při použití souboru Kubernetes YAML nebo souboru Compose. Kromě toho těsná integrace se systemd položila základ pro automatické aktualizace a jednoduché vrácení zpět, které jsou podporovány od verze Podman v3.4.

I když existuje mnoho dřívějších blogů a článků o generování systémových jednotek pro kontejnery, neexistují žádné pro generování těchto jednotek pro pody. Než se však pustím do těchto podrobností, chci si zopakovat, co je pod.

[ Začínáte s kontejnery? Podívejte se na tento bezplatný kurz. Nasazení kontejnerových aplikací:technický přehled. ]

Co je pod?

V modulu je několik různých částí a myslím, že Brent Baude to nejlépe vysvětluje pomocí skvělé postavy níže:

První věc, kterou si všimnete, je, že lusk se skládá z jedné nebo více nádob. Skupina sdílí řídicí skupiny (cgroups) a specifické jmenné prostory, jako je PID, síť a jmenný prostor IPC. Sdílené skupiny cgroups zajišťují, že všechny kontejnery mají stejná omezení zdrojů. Sdílené jmenné prostory umožňují kontejnerům snadněji komunikovat mezi sebou (například prostřednictvím localhost nebo meziprocesní komunikace).

K vidění je i speciální infra kontejner. Jeho primárním účelem je uchovávat specifické zdroje spojené s otevřeným modulem, jako jsou porty, jmenné prostory nebo skupiny cgroups. Infra kontejner je kontejner nejvyšší úrovně modulu a je vytvořen před ostatními kontejnery a zničen jako poslední. Infra kontejner používáte při generování systémových jednotek pro modul, takže mějte na paměti, že tento kontejner běží po celou dobu životnosti modulu. To také znamená, že nemůžete generovat systémové jednotky pro pody bez infra kontejneru (jako je --infra=false ).

V neposlední řadě vidíte několik conmon běžící procesy, jeden na kontejner. „Common“ je zkratka pro kontejnerový monitor, což shrnuje jeho hlavní funkce. Postará se také o předávání protokolů a provádění akcí čištění, jakmile kontejner opustí. conmon proces začíná před kontejnerem a dává pokyn základnímu běhovému prostředí kontejneru (například runc nebo crun ) pro vytvoření a spuštění kontejneru. Ukončí se také s výstupním kódem kontejneru, což umožňuje jeho použití jako hlavního procesu služby systemd.

Generování systémových jednotek pro modul

Podman generuje přesně jednu systémovou jednotku pro kontejner. Po instalaci použijte systemctl spustit, zastavit a zkontrolovat službu. Hlavním PID každé jednotky je společný proces kontejneru. Tímto způsobem může systemd přečíst kód ukončení kontejneru a jednat podle nakonfigurované zásady restartování. Další podrobnosti o jednotkách najdete v části Spuštění kontejnerů s Podmanem a sdílenými službami systemd a Vylepšený systémový Podman s Podmanem 2.0.

Generování jednotek pro modul je velmi podobné spouštění kontejneru. Každý kontejner v modulu má vyhrazenou systémovou jednotku a každá jednotka závisí na hlavní systémové jednotce modulu. Tímto způsobem můžete pokračovat v používání systemctl ke spuštění, zastavení a kontrole hlavní služby modulu; systemd se postará o (re)spuštění a zastavení služeb kontejnerů spolu s hlavní službou.

Tento příklad vytvoří modul se dvěma kontejnery, vygeneruje soubory jednotek pro modul a poté nainstaluje soubory pro aktuálního uživatele:

$ podman pod create --name=my-pod
635bcc5bb5aa0a45af4c2f5a508ebd6a02b93e69324197a06d02a12873b6d1f7

$ podman create --pod=my-pod --name=container-a -t centos top
c04be9c4ac1c93473499571f3c2ad74deb3e0c14f4f00e89c7be3643368daf0e

$ podman create --pod=my-pod --name=container-b -t centos top
b42314b2deff99f5877e76058ac315b97cfb8dc40ed02f9b1b87f21a0cf2fbff

$ cd $HOME/.config/systemd/user

$ podman generate systemd --new --files --name my-pod
/home/vrothberg/.config/systemd/user/pod-my-pod.service
/home/vrothberg/.config/systemd/user/container-container-b.service
/home/vrothberg/.config/systemd/user/container-container-a.service

Podle očekávání vygeneroval Podman tři .service soubory, jeden pro každý kontejner plus jeden pro pod. Celý obsah souborů jednotek naleznete v příloze na konci článku. Jednotky vygenerované pro dva kontejnery vypadají jako standardní kontejnerové jednotky plus následující systémové závislosti:

  • BindsTo=pod-my-pod.service :Jednotka kontejneru je „svázána“ s jednotkou podu. Pokud se jednotka podu zastaví, zastaví se i tato jednotka.
  • After=pod-my-pod.service :Kontejnerová jednotka začíná za jednotkou podu.

Závislosti hlavní služby modulu dále zajišťují, že pokud se kontejnerová jednotka nespustí úspěšně, selže i hlavní jednotka hlavního modulu.

To je vše, co potřebujete vědět o generování systemd jednotek pro moduly s Podmanem. Jakmile znovu načtete systemd pomocí systemctl --user daemon-reload , spusťte a zastavte pod.service na přání. Podívejte se:

# Reload the daemon
$ systemctl --user daemon-reload

# Start the pod service and make sure the service is running
$ systemctl --user start pod-my-pod.service

$ systemctl --user is-active pod-my-pod.service
active

# Make sure the pod and its containers are running
$ podman pod ps
POD ID    	NAME    	STATUS  	CREATED    	INFRA ID  	# OF CONTAINERS
6dd1090d4ca6  my-pod  	Running 	2 minutes ago  85f760a5cfe5  3
user $ podman container ps
CONTAINER ID  IMAGE                                	COMMAND 	CREATED    	STATUS        	PORTS   	NAMES
85f760a5cfe5  localhost/podman-pause:4.0.2-1646319369          	5 minutes ago  Up 5 minutes ago          	6dd1090d4ca6-infra
44a7e60b9563  quay.io/centos/centos:latest         	top     	5 minutes ago  Up 5 minutes ago          	container-b
31f24bdff747  quay.io/centos/centos:latest         	top     	5 minutes ago  Up 5 minutes ago          	container-a

Skvělé, vše funguje podle očekávání. Můžete použít systemctl pro spuštění služeb a Podman správně vypíše pody a jejich nádoby. V zájmu konzistence se na závěr podívejte, jak zastavit službu pod.

# Stop the pod service
$ systemctl --user stop pod-my-pod.service

# Make sure the pod and its containers are removed
$ podman pod ps -q

$ podman container ps -q

# Make sure the services are inactive
$ systemctl --user is-active pod-my-pod.service container-container-a.service container-container-b.service
inactive
inactive
inactive

Zpráva je taková, že Podman generuje systémové jednotky pro moduly stejně jako pro kontejnery. Závislosti mezi těmito jednotkami jsou nastaveny tak, že stačí komunikovat s hlavní jednotkou modulu a systemd se postará o spouštění a zastavování jednotek kontejnerů.

Příloha

Podman vygeneruje následující soubory jednotek pro modul a dva související kontejnery.

pod-my-pod.service

Description=Podman pod-my-pod.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=
Requires=container-container-a.service container-container-b.service
Before=container-container-a.service container-container-b.service

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStartPre=/bin/rm -f %t/pod-my-pod.pid %t/pod-my-pod.pod-id
ExecStartPre=/usr/bin/podman pod create --infra-conmon-pidfile %t/pod-my-pod.pid --pod-id-file %t/pod-my-pod.pod-id --name=my-pod --replace
ExecStart=/usr/bin/podman pod start --pod-id-file %t/pod-my-pod.pod-id
ExecStop=/usr/bin/podman pod stop --ignore --pod-id-file %t/pod-my-pod.pod-id -t 10
ExecStopPost=/usr/bin/podman pod rm --ignore -f --pod-id-file %t/pod-my-pod.pod-id
PIDFile=%t/pod-my-pod.pid
Type=forking

[Install]
WantedBy=default.target

container-container-a.service

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

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStartPre=/bin/rm -f %t/%n.ctr-id
ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --cgroups=no-conmon --rm --pod-id-file %t/pod-my-pod.pod-id --sdnotify=conmon -d --replace --name=container-a -t centos top
ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
Type=notify
NotifyAccess=all

[Install]
WantedBy=default.target

container-container-b.service

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

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStartPre=/bin/rm -f %t/%n.ctr-id
ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --cgroups=no-conmon --rm --pod-id-file %t/pod-my-pod.pod-id --sdnotify=conmon -d --replace --name=container-b -t centos top
ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
Type=notify
NotifyAccess=all

[Install]
WantedBy=default.target


Linux
  1. Jak spravovat služby Systemd pomocí Systemctl v systému Linux

  2. Jak spustit příkaz uvnitř spuštěného kontejneru Systemd?

  3. Jak spustím skript před vším ostatním při vypnutí pomocí systemd?

  1. Jak používat Podman uvnitř kontejneru

  2. Linux – Jak spustit skript pomocí Systemd těsně před vypnutím?

  3. Jak spustit MySQL v kontejneru Docker

  1. Jak používat příkaz Docker Run s příklady

  2. Jak odstranit systémové služby

  3. Jak spustit skript s systemd těsně před vypnutím?