Ngajalankeun systemd dina wadah

Kami parantos lami nuturkeun topik ngagunakeun systemd dina wadahna. Deui dina 2014, insinyur kaamanan urang Daniel Walsh nulis artikel Ngajalankeun systemd dina wadah Docker, sarta sababaraha taun engké - sejen, nu disebut Ngajalankeun systemd dina wadah non-hak istimewa, di mana manéhna nyatakeun yén kaayaan geus teu ningkat loba. Khususna, anjeunna nyerat yén "hanjakalna, sanaos dua taun saatosna, upami anjeun google" sistem Docker ", hal anu mimiti muncul nyaéta tulisan anu lami anu sami. Janten waktosna pikeun ngarobih hiji hal. ” Sajaba ti éta, urang geus ngobrol ngeunaan konflik antara Docker sareng pamekar systemd.

Ngajalankeun systemd dina wadah

Dina tulisan ieu kami bakal nunjukkeun naon anu parantos robih kana waktosna sareng kumaha Podman tiasa ngabantosan urang dina masalah ieu.

Aya seueur alesan pikeun ngajalankeun systemd di jero wadah, sapertos:

  1. wadahna multiservice - seueur jalma anu hoyong narik aplikasi multi-layananna tina mesin virtual sareng ngajalankeunana dina wadah. Éta langkung saé, tangtosna, pikeun ngarobih aplikasi sapertos kana microservices, tapi henteu sadayana terang kumaha ngalakukeun ieu atanapi ngan saukur teu gaduh waktos. Ku alatan éta, ngajalankeun aplikasi kayaning jasa dibuka ku systemd tina file unit ngajadikeun rasa sampurna.
  2. File Unit Systemd - Seuseueurna aplikasi anu dijalankeun di jero wadah diwangun tina kode anu saacanna dijalankeun dina mesin virtual atanapi fisik. Aplikasi ieu ngagaduhan file unit anu diserat pikeun aplikasi ieu sareng ngartos kumaha aranjeunna kedah diluncurkeun. Janten éta langkung saé pikeun ngamimitian jasa nganggo metode anu dirojong, tibatan ngarékam jasa init anjeun nyalira.
  3. Systemd mangrupikeun manajer prosés. Éta ngalaksanakeun manajemén jasa (pareuman, ngamimitian deui jasa, atanapi maéhan prosés zombie) langkung saé tibatan alat anu sanés.

Kitu cenah, aya seueur alesan pikeun henteu ngajalankeun systemd dina peti. Anu utama nyaéta systemd / jurnal ngatur kaluaran wadah, sareng alat sapertos Kubernetes atawa openshift nyangka peti nulis log langsung ka stdout na stderr. Kukituna, upami anjeun badé ngokolakeun peti nganggo alat orkestrasi sapertos anu disebatkeun di luhur, anjeun kedah serius mertimbangkeun ngagunakeun wadah dumasar systemd. Salaku tambahan, pamekar Docker sareng Moby sering pisan nentang ngagunakeun systemd dina wadah.

Datangna Podman

Kami bagja ngalaporkeun yén kaayaan tungtungna parantos maju. Tim anu tanggung jawab pikeun ngajalankeun peti di Red Hat mutuskeun pikeun ngembangkeun mesin wadahna sorangan. Anjeunna ngagaduhan nami podman sarta nawarkeun panganteur garis paréntah sarua (CLI) sakumaha Docker. Sareng ampir sadaya paréntah Docker tiasa dianggo dina Podman dina cara anu sami. Urang sering ngayakeun seminar, anu ayeuna disebut Ngarobah Docker ka Podman, sarta slide pisan munggaran nelepon pikeun nulis: alias docker = podman.

Loba jalma ngalakukeun ieu.

Abdi sareng Podman henteu ngalawan wadah basis systemd. Barina ogé, Systemd mangrupikeun subsistem init Linux anu paling sering dianggo, sareng henteu ngamungkinkeun éta tiasa dianggo leres dina wadah hartosna teu malire kumaha rébuan jalma biasa ngajalankeun wadah.

Podman terang naon anu kudu dilakukeun pikeun ngajantenkeun systemd leres dina wadahna. Peryogikeun hal sapertos masang tmpfs on /run sareng /tmp. Anjeunna resep gaduh lingkungan "containerized" diaktipkeun sareng ngarepkeun ijin nyerat kana bagian tina diréktori cgroup sareng kana folder /var/log/journald.

Nalika anjeun ngamimitian wadah dimana paréntah anu munggaran nyaéta init atanapi systemd, Podman otomatis ngonpigurasi tmpfs sareng Cgroups pikeun mastikeun yén systemd dimimitian tanpa masalah. Pikeun meungpeuk modeu peluncuran otomatis ieu, paké pilihan --systemd=false. Punten dicatet yén Podman ngan nganggo mode systemd nalika ningali yén éta kedah ngajalankeun paréntah systemd atanapi init.

Ieu mangrupikeun kutipan tina manual:

lalaki podman ngajalankeun
...

–systemd=leres|palsu

Ngajalankeun wadah dina modeu systemd. Diaktipkeun sacara standar.

Upami anjeun ngajalankeun paréntah systemd atanapi init di jero wadah, Podman bakal ngonpigurasikeun titik gunung tmpfs dina diréktori ieu:

/run, /run/lock, /tmp, /sys/fs/cgroup/systemd, /var/lib/journal

Ogé sinyal eureun standar bakal SIGRTMIN + 3.

Sadaya ieu ngamungkinkeun systemd ngajalankeun dina wadah anu ditutup tanpa modifikasi.

CATETAN: systemd nyobian nyerat kana sistem file cgroup. Nanging, SELinux nyegah wadah tina ngalakukeun ieu sacara standar. Pikeun ngaktipkeun tulisan, aktipkeun parameter boolean container_manage_cgroup:

setsebool -P container_manage_cgroup leres

Ayeuna tingali kumaha rupa Dockerfile pikeun ngajalankeun systemd dina wadah nganggo Podman:

# cat Dockerfile

FROM fedora

RUN dnf -y install httpd; dnf clean all; systemctl enable httpd

EXPOSE 80

CMD [ "/sbin/init" ]

Éta hungkul.

Ayeuna urang ngumpul wadahna:

# podman build -t systemd .

Kami nyarioskeun ka SELinux pikeun ngamungkinkeun systemd ngarobih konfigurasi Cgroups:

# setsebool -P container_manage_cgroup true

Ku jalan kitu, loba jalma poho ngeunaan hambalan ieu. Untungna, ieu ngan ukur kedah dilakukeun sakali sareng setelan disimpen saatos rebooting sistem.

Ayeuna urang ngan ngamimitian wadahna:

# podman run -ti -p 80:80 systemd

systemd 239 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid)

Detected virtualization container-other.

Detected architecture x86-64.

Welcome to Fedora 29 (Container Image)!

Set hostname to <1b51b684bc99>.

Failed to install release agent, ignoring: Read-only file system

File /usr/lib/systemd/system/systemd-journald.service:26 configures an IP firewall (IPAddressDeny=any), but the local system does not support BPF/cgroup based firewalling.

Proceeding WITHOUT firewalling in effect! (This warning is only shown for the first loaded unit using IP firewalling.)

[  OK ] Listening on initctl Compatibility Named Pipe.

[  OK ] Listening on Journal Socket (/dev/log).

[  OK ] Started Forward Password Requests to Wall Directory Watch.

[  OK ] Started Dispatch Password Requests to Console Directory Watch.

[  OK ] Reached target Slices.

…

[  OK ] Started The Apache HTTP Server.

Éta éta, jasa parantos dijalankeun:

$ curl localhost

<html  xml_lang="en" lang="en">

…

</html>

CATETAN: Ulah coba ieu dina Docker! Di dinya anjeun masih kedah nari nganggo rebana pikeun ngaluncurkeun wadah sapertos kieu ngalangkungan daemon. (Widang sareng bungkusan tambahan bakal diperyogikeun pikeun ngajantenkeun ieu sadayana lancar di Docker, atanapi kedah dijalankeun dina wadah anu istimewa. Kanggo detil, tingali artikel.)

Sababaraha hal anu langkung keren ngeunaan Podman sareng systemd

Podman damel langkung saé tibatan Docker dina file unit systemd

Upami wadahna kedah dimimitian nalika sistem boot, maka anjeun ngan saukur tiasa ngalebetkeun paréntah Podman anu pas kana file unit systemd, anu bakal ngamimitian jasa sareng ngawaskeunana. Podman nganggo modél garpu-exec standar. Dina basa sejen, prosés wadahna mangrupakeun barudak tina prosés Podman, jadi systemd bisa kalayan gampang ngawas aranjeunna.

Docker nganggo modél klien-server, sareng paréntah Docker CLI ogé tiasa ditempatkeun langsung dina file unit. Nanging, sakali klien Docker nyambung ka daemon Docker, éta (klien) janten ngan ukur prosés ngolah stdin sareng stdout. Sabalikna, systemd teu gaduh ide ngeunaan sambungan antara klien Docker sareng wadah anu dijalankeun dina kadali daemon Docker, sareng ku kituna, dina modél ieu, systemd dasarna henteu tiasa ngawas jasa éta.

Aktipkeun systemd via stop kontak

Podman nanganan aktivasina via stop kontak leres. Kusabab Podman ngagunakeun modél fork-exec, éta tiasa neraskeun stop kontak ka prosés wadah anakna. Docker teu tiasa ngalakukeun ieu sabab ngagunakeun modél klien-server.

Ladenan varlink anu digunakeun Podman pikeun komunikasi sareng klien jauh ka wadahna sabenerna diaktipkeun via stop kontak. Paket cockpit-podman, ditulis dina Node.js sareng bagian tina proyék kabina, ngamungkinkeun jalma pikeun berinteraksi sareng wadah Podman ngalangkungan antarmuka wéb. Web daemon ngajalankeun cockpit-podman ngirim pesen ka stop kontak varlink nu systemd listens on. Systemd teras ngaktifkeun program Podman pikeun nampi pesen sareng ngawitan ngatur wadah. Ngaktipkeun systemd dina stop kontak ngaleungitkeun kabutuhan daemon anu terus-terusan ngajalankeun nalika nerapkeun API jauh.

Salaku tambahan, urang ngembangkeun klien Podman anu sanés disebut podman-remote, anu ngalaksanakeun Podman CLI anu sami tapi nyauran varlink pikeun ngajalankeun wadah. Podman-jauh bisa ngajalankeun on luhureun sesi SSH, ngamungkinkeun Anjeun pikeun aman berinteraksi sareng peti dina mesin béda. Kana waktosna, kami ngarencanakeun pikeun ngaktifkeun podman-remote pikeun ngadukung MacOS sareng Windows sareng Linux, ku kituna pamekar dina platform-platform éta tiasa ngajalankeun mesin virtual Linux sareng Podman varlink jalan sareng gaduh pangalaman lengkep yén wadahna dijalankeun dina mesin lokal.

SD_NOTIFY

Systemd ngamungkinkeun anjeun pikeun nunda peluncuran jasa bantu dugi ka jasa wadahna anu diperyogikeun dimimitian. Podman tiasa neraskeun stop kontak SD_NOTIFY ka layanan containerized supados layanan ngabéjaan systemd yén éta téh siap beroperasi. Sareng deui, Docker, anu nganggo modél klien-server, teu tiasa ngalakukeun ieu.

Dina rencana

Urang rencanana pikeun nambahkeun paréntah podman ngahasilkeun systemd CONTAINERID, nu bakal ngahasilkeun file Unit systemd pikeun ngatur wadah husus dieusian. Ieu kedah dianggo dina modeu root sareng rootless pikeun wadah anu teu boga hak istimewa. Kami malah ningali pamundut pikeun runtime systemd-nspawn anu cocog sareng OCI.

kacindekan

Ngajalankeun systemd dina wadah mangrupikeun kabutuhan anu kaharti. Sareng hatur nuhun kana Podman, kami tungtungna gaduh runtime wadah anu henteu bertentangan sareng systemd, tapi ngagampangkeun dianggo.

sumber: www.habr.com

Tambahkeun komentar