GNU/Linux >> Belajar Linux >  >> Linux

Cara menjalankan pod sebagai layanan systemd dengan Podman

Podman terkenal dengan integrasinya yang mulus ke dalam sistem Linux modern, dan mendukung systemd adalah landasan dalam upaya ini. Linux biasanya menggunakan sistem init systemd untuk mengelola layanan lokal seperti server web, mesin kontainer, daemon jaringan, dan semua ketergantungannya. Memperluas praktik administrasi sistem Linux yang lebih tradisional ini dengan dunia container modern adalah evolusi alami.

Ada dua kasus penggunaan umum untuk menggabungkan systemd dan container:

  • Menjalankan systemd di dalam wadah
  • Menggunakan systemd untuk menjalankan aplikasi dalam container

Skenario pertama adalah menjalankan systemd di dalam sebuah wadah. Seperti yang dijelaskan Dan Walsh, menjalankan systemd di dalam wadah semudah mungkin saat menggunakan Podman. Podman secara otomatis menyiapkan beberapa mount dalam container, dan systemd siap digunakan. Meskipun fitur Podman relatif kecil, ini merupakan lompatan besar untuk menjalankan beban kerja dalam container saat diperkenalkan.

Secara historis, alat penampung lainnya belum mendukung systemd. Pengguna menghadapi tantangan menulis skrip init kustom, yang rentan terhadap kesalahan dan beban dukungan bagi vendor perangkat lunak. Dengan Podman, semua masalah ini hilang. Pengguna dapat menggunakan systemd untuk menginstal dan menjalankan aplikasi mereka dalam wadah, sama seperti di tempat lain, dan vendor perangkat lunak tidak akan menghadapi tantangan dalam menangani skrip init khusus yang ditulis oleh penggunanya.

Skenario kedua menggunakan systemd untuk menjalankan dan mengelola aplikasi kemas. Itu berarti systemd memulai aplikasi kemas dan mengelola seluruh siklus hidupnya. Podman menyederhanakan ini dengan podman generate systemd perintah, yang menghasilkan file unit systemd untuk wadah atau pod tertentu. Podman v1.7 dan yang lebih baru mendukung pembuatan unit semacam itu. Seiring waktu, tim kami telah meningkatkan fitur ini dan menghasilkan file unit systemd yang dapat berjalan di mesin lain, mirip dengan menggunakan Kubernetes YAML atau file Compose. Selanjutnya, integrasi yang erat dengan systemd meletakkan dasar untuk pembaruan otomatis dan rollback sederhana, yang didukung sejak Podman v3.4.

Meskipun ada banyak blog dan artikel sebelumnya tentang menghasilkan unit systemd untuk container, tidak ada satu pun untuk menghasilkan unit ini untuk pod. Namun sebelum membahas detail ini, saya ingin mengulas apa itu pod.

[ Memulai container? Lihat kursus gratis ini. Menyebarkan aplikasi kemas:Tinjauan teknis. ]

Apa itu pod?

Ada beberapa bagian berbeda dalam sebuah pod, dan menurut saya Brent Baude menjelaskannya paling baik dengan gambar hebat di bawah ini:

Hal pertama yang harus diperhatikan adalah bahwa pod terdiri dari satu atau lebih container. Grup berbagi grup kontrol (cgroups) dan ruang nama tertentu seperti PID, jaringan, dan ruang nama IPC. Cgroup bersama memastikan bahwa semua kontainer memiliki batasan sumber daya yang sama. Ruang nama bersama memungkinkan wadah untuk berkomunikasi satu sama lain dengan lebih mudah (seperti melalui localhost atau komunikasi antarproses).

Anda juga dapat melihat wadah infra khusus. Tujuan utamanya adalah untuk menahan sumber daya tertentu yang terkait dengan pod terbuka, seperti port, namespace, atau cgroup. Wadah infra adalah wadah tingkat atas pod, dan dibuat sebelum wadah lain dan dihancurkan terakhir. Anda menggunakan wadah infra saat membuat unit systemd untuk sebuah pod, jadi ingatlah bahwa wadah ini berjalan sepanjang masa pakai pod. Ini juga menyiratkan bahwa Anda tidak dapat menghasilkan unit systemd untuk pod tanpa wadah infra (seperti --infra=false ).

Last but not least, Anda melihat beberapa conmon proses berjalan, satu per kontainer. "Common" adalah kependekan dari container monitor, yang merangkum fungsi utamanya. Itu juga menangani penerusan log dan melakukan tindakan pembersihan setelah wadah keluar. conmon proses dimulai sebelum container dan menginstruksikan runtime container yang mendasarinya (seperti runc atau crun ) untuk membuat dan memulai penampung. Itu juga keluar dengan kode keluar wadah yang memungkinkan untuk menggunakannya sebagai proses utama layanan systemd.

Membuat unit systemd untuk pod

Podman menghasilkan tepat satu unit sistem untuk sebuah wadah. Setelah terinstal, gunakan systemctl untuk memulai, menghentikan, dan memeriksa layanan. PID utama dari setiap unit adalah proses umum container. Dengan cara ini, systemd dapat membaca kode keluar container dan bertindak sesuai dengan kebijakan restart yang dikonfigurasi. Untuk detail selengkapnya tentang unit, lihat Menjalankan container dengan Podman dan layanan systemd yang dapat dibagikan dan Peningkatan systemd Podman dengan Podman 2.0.

Menghasilkan unit untuk pod sangat mirip dengan memulai wadah. Setiap container dalam pod memiliki unit systemd khusus, dan setiap unit bergantung pada unit systemd utama pod. Dengan cara ini, Anda dapat terus menggunakan systemctl untuk memulai, menghentikan, dan memeriksa layanan utama pod; systemd akan menangani (kembali) memulai dan menghentikan layanan container bersama dengan layanan utama.

Contoh ini membuat pod dengan dua kontainer, menghasilkan file unit untuk pod, dan kemudian menginstal file untuk pengguna saat ini:

$ 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

Seperti yang diharapkan, Podman menghasilkan tiga .service file, satu untuk setiap wadah ditambah yang tingkat atas untuk pod. Silakan merujuk ke lampiran di akhir artikel untuk melihat seluruh isi file unit. Unit yang dihasilkan untuk dua kontainer terlihat seperti unit kontainer standar ditambah dependensi systemd berikut:

  • BindsTo=pod-my-pod.service :Unit kontainer "terikat" ke unit pod. Jika unit pod dihentikan, unit ini juga akan dihentikan.
  • After=pod-my-pod.service :Unit kontainer dimulai setelah unit pod.

Dependensi layanan utama pod selanjutnya memastikan bahwa jika unit container tidak berhasil dijalankan, unit utama pod utama juga akan gagal.

Itu saja yang perlu Anda ketahui tentang membuat unit systemd untuk pod dengan Podman. Setelah Anda memuat ulang systemd melalui systemctl --user daemon-reload , mulai dan hentikan pod.service sesuka hati. Lihat:

# 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 

Bagus, semuanya bekerja seperti yang diharapkan. Anda dapat menggunakan systemctl untuk memulai layanan, dan Podman mendaftar pod dan wadahnya dengan benar. Demi konsistensi, lihat cara terakhir untuk menghentikan layanan 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 

Pesan yang dibawa pulang adalah bahwa Podman menghasilkan unit systemd untuk pod seperti halnya untuk container. Dependensi di antara unit-unit ini diatur sedemikian rupa sehingga Anda hanya perlu berinteraksi dengan unit utama pod, dan systemd menangani memulai dan menghentikan unit container.

Lampiran

Podman menghasilkan file unit berikut untuk sebuah pod dan dua kontainer terkait.

layanan pod-saya-pod.

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. Cara menggunakan Podman di dalam wadah

  2. Linux – Bagaimana Cara Menjalankan Script Dengan Systemd Tepat Sebelum Shutdown?

  3. Cara Menjalankan MySQL Dalam Wadah Docker

  1. Bagaimana cara menghapus layanan systemd

  2. Bagaimana cara menjalankan skrip sebelum yang lainnya dimatikan dengan systemd?

  3. Bagaimana cara menjalankan skrip dengan systemd tepat sebelum dimatikan?

  1. Cara Menggunakan Perintah Docker Run dengan Contoh

  2. Cara Mengelola Layanan Systemd dengan Systemctl di Linux

  3. Bagaimana Cara Menjalankan Perintah Di Dalam Wadah Systemd yang Berjalan?