Running systemd f'kontenitur

Ilna nsegwu s-suġġett tal-użu ta 'systemd f'kontenituri għal żmien twil. Lura fl-2014, l-inġinier tas-sigurtà tagħna Daniel Walsh kiteb artiklu It-tħaddim tas-sistema fi ħdan Docker Container, u ftit snin wara - ieħor, li kien jissejjaħ Tmexxija systemd f'kontenitur mhux privileġġjat, li fiha stqarr li s-sitwazzjoni ma tantx tjiebet. B'mod partikolari, huwa kiteb li "sfortunatament, anke sentejn wara, jekk inti google "sistema Docker", l-ewwel ħaġa li toħroġ huwa l-istess artiklu antik tiegħu. Allura wasal iż-żmien li nibdlu xi ħaġa.” Barra minn hekk, diġà tkellimna dwarhom kunflitt bejn Docker u l-iżviluppaturi tas-systemd.

Running systemd f'kontenitur

F'dan l-artiklu se nuru x'inbidel maż-żmien u kif Podman jista' jgħinna f'din il-kwistjoni.

Hemm ħafna raġunijiet biex tħaddem systemd ġewwa kontenitur, bħal:

  1. Kontenituri b'ħafna servizzi – ħafna nies iridu jiġbdu l-applikazzjonijiet multi-servizz tagħhom minn magni virtwali u jmexxuhom f'kontenituri. Ikun aħjar, ovvjament, li applikazzjonijiet bħal dawn jinqasam f'mikroservizzi, iżda mhux kulħadd għadu jaf kif jagħmel dan jew sempliċement m'għandux il-ħin. Għalhekk, it-tħaddim ta 'applikazzjonijiet bħal servizzi mnedija minn systemd minn fajls ta' unità jagħmel sens perfett.
  2. Fajls tal-Unità Systemd – Il-biċċa l-kbira tal-applikazzjonijiet li jaħdmu ġewwa kontenituri huma mibnija minn kodiċi li qabel kien jaħdem fuq magni virtwali jew fiżiċi. Dawn l-applikazzjonijiet għandhom unit file li nkiteb għal dawn l-applikazzjonijiet u jifhem kif għandhom jiġu varati. Għalhekk huwa xorta aħjar li tibda s-servizzi bl-użu ta 'metodi appoġġjati, aktar milli hacking is-servizz init tiegħek stess.
  3. Systemd huwa maniġer tal-proċess. Jiġġestixxi s-servizzi (twaqqaf, jerġa’ jibda s-servizzi, jew joqtol il-proċessi ta’ zombie) aħjar minn kwalunkwe għodda oħra.

Cela dit, hemm ħafna raġunijiet biex ma titħaddemx systemd f'kontenituri. Il-wieħed ewlieni huwa li systemd/journald jikkontrolla l-output ta 'kontenituri, u għodod simili Kubernetes jew openshift jistennew li l-kontenituri jiktbu log direttament lil stdout u stderr. Għalhekk, jekk se timmaniġġja l-kontenituri permezz ta 'għodod ta' orkestrazzjoni bħal dawk imsemmija hawn fuq, għandek tikkunsidra serjament li tuża kontenituri bbażati fuq systemd. Barra minn hekk, l-iżviluppaturi ta' Docker u Moby ta' spiss kienu jopponu bil-qawwa l-użu ta' systemd f'kontenituri.

Il-Miġja ta' Podman

Aħna kuntenti li nirrapportaw li s-sitwazzjoni fl-aħħar imxiet 'il quddiem. It-tim responsabbli mit-tmexxija tal-kontejners f'Red Hat iddeċieda li jiżviluppa il-magna tal-kontenitur tiegħek stess. Huwa kiseb isem podman u joffri l-istess interface tal-linja tal-kmand (CLI) bħal Docker. U kważi l-kmandi Docker kollha jistgħu jintużaw f'Podman bl-istess mod. Ħafna drabi nwettqu seminars, li issa jissejħu Nibdlu Docker għal Podman, u l-ewwel slide jitlob għall-kitba: alias docker=podman.

Ħafna nies jagħmlu dan.

Il-Podman tiegħi u jien bl-ebda mod mhu kontra l-kontenituri bbażati fuq is-systemd. Wara kollox, Systemd hija s-subsistema Linux init l-aktar użata b'mod komuni, u li ma tħallihiex taħdem sew f'kontenituri tfisser li tinjora kif eluf ta 'nies huma mdorrijin imexxu l-kontenituri.

Podman jaf x'għandu jagħmel biex is-systemd jaħdem sew f'kontenitur. Jeħtieġ affarijiet bħall-immuntar ta' tmpfs fuq /run u /tmp. Tħobb li jkollha l-ambjent "containerized" attivat u tistenna permessi tal-kitba fil-parti tagħha tad-direttorju cgroup u fil-folder /var/log/journald.

Meta tibda kontenitur li fih l-ewwel kmand huwa init jew systemd, Podman awtomatikament jikkonfigura tmpfs u Cgroups biex jiżgura li systemd jibda mingħajr problemi. Biex timblokka din il-modalità ta' tnedija awtomatika, uża l-għażla --systemd=false. Jekk jogħġbok innota li Podman juża biss il-mod systemd meta jara li jeħtieġ li jmexxi kmand systemd jew init.

Hawnhekk hawn silta mill-manwal:

man podman run
...

–systemd=veru|falz

Tmexxi kontenitur fil-modalità systemd. Ippermettiet awtomatikament.

Jekk tmexxi kmand systemd jew init ġewwa kontenitur, Podman se kkonfigura tmpfs mount points fid-direttorji li ġejjin:

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

Ukoll is-sinjal ta 'waqfien default se jkun SIGRTMIN+3.

Dan kollu jippermetti li systemd jaħdem f'kontenitur magħluq mingħajr ebda modifika.

NOTA: systemd jipprova jikteb fis-sistema tal-fajls cgroup. Madankollu, SELinux jipprevjeni lill-kontenituri milli jagħmlu dan b'mod awtomatiku. Biex tippermetti l-kitba, ippermetti l-parametru boolean container_manage_cgroup:

setsebool -P container_manage_cgroup veru

Issa ħares lejn kif jidher id-Dockerfile għat-tħaddim ta' systemd f'kontenitur bl-użu ta' Podman:

# cat Dockerfile

FROM fedora

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

EXPOSE 80

CMD [ "/sbin/init" ]

Dak kollox.

Issa niġbru l-kontenitur:

# podman build -t systemd .

Aħna ngħidu lil SELinux biex jippermetti lil systemd jimmodifika l-konfigurazzjoni Cgroups:

# setsebool -P container_manage_cgroup true

Ħafna nies, bil-mod, jinsew dwar dan il-pass. Fortunatament, dan jeħtieġ li jsir darba biss u l-issettjar jiġi ffrankat wara li terġa 'tibda s-sistema.

Issa aħna biss nibdew il-kontenitur:

# 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.

Dak hu, is-servizz qiegħed jaħdem:

$ curl localhost

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

…

</html>

NOTA: Tippruvax dan fuq Docker! Hemm xorta trid tiżfen b'tambourine biex tniedi dawn it-tipi ta 'kontenituri permezz tad-daemon. (Se jkunu meħtieġa oqsma u pakketti addizzjonali biex dan kollu jaħdem bla xkiel f'Docker, jew ikun jeħtieġ li jitħaddem f'kontenitur privileġġjat. Għad-dettalji, ara artikolu.)

Koppja aktar affarijiet friski dwar Podman u systemd

Podman jaħdem aħjar minn Docker fil-fajls tal-unità systemd

Jekk il-kontenituri jeħtieġ li jinbdew meta s-sistema tibda, allura tista 'sempliċement daħħal il-kmandi xierqa tal-Podman fil-fajl tal-unità systemd, li jibda s-servizz u jimmonitorjah. Podman juża l-mudell standard fork-exec. Fi kliem ieħor, il-proċessi tal-kontejners huma tfal tal-proċess Podman, għalhekk systemd jista 'faċilment jimmonitorjahom.

Docker juża mudell klijent-server, u l-kmandi CLI ta 'Docker jistgħu wkoll jitqiegħdu direttament f'fajl ta' unità. Madankollu, ladarba l-klijent Docker jgħaqqad mad-daemon Docker, dan (il-klijent) isir biss proċess ieħor li jimmaniġġja stdin u stdout. Min-naħa tiegħu, systemd m'għandu l-ebda idea dwar il-konnessjoni bejn il-klijent Docker u l-kontenitur li jimxi taħt il-kontroll tad-daemon Docker, u għalhekk, fi ħdan dan il-mudell, systemd fundamentalment ma jistax jimmonitorja s-servizz.

Attivazzjoni tas-sistema permezz tas-socket

Podman jimmaniġġja l-attivazzjoni permezz tas-sokit b'mod korrett. Minħabba li Podman juża l-mudell fork-exec, jista 'jibgħat is-sokit lill-proċessi tal-kontenitur tat-tfal tiegħu. Docker ma jistax jagħmel dan għaliex juża mudell client-server.

Is-servizz varlink li Podman juża biex jikkomunika ma' klijenti remoti għal kontenituri huwa attwalment attivat permezz ta' socket. Il-pakkett cockpit-podman, miktub f'Node.js u parti mill-proġett tal-cockpit, jippermetti lin-nies jinteraġixxu mal-kontenituri Podman permezz ta 'interface tal-web. Id-daemon tal-web li jmexxi cockpit-podman jibgħat messaġġi lil socket varlink li systemd jisma'. Systemd imbagħad jattiva l-programm Podman biex jirċievi messaġġi u jibda jimmaniġġja l-kontenituri. L-attivazzjoni ta' systemd fuq socket telimina l-ħtieġa għal daemon li jaħdem b'mod kostanti meta jiġu implimentati APIs remoti.

Barra minn hekk, qed niżviluppaw klijent Podman ieħor imsejjaħ podman-remote, li jimplimenta l-istess Podman CLI iżda jsejjaħ varlink biex iħaddem kontenituri. Podman-remote jista 'jimxi fuq sessjonijiet SSH, li jippermettilek jinteraġixxu b'mod sigur ma' kontenituri fuq magni differenti. Maż-żmien, qed nippjanaw li nħallu podman-remote biex jappoġġja MacOS u Windows flimkien mal-Linux, sabiex l-iżviluppaturi fuq dawk il-pjattaformi jkunu jistgħu jmexxu magna virtwali Linux b'Podman varlink taħdem u jkollhom l-esperjenza sħiħa li l-kontenituri qed jaħdmu fuq il-magna lokali.

SD_NOTIFY

Systemd jippermettilek li tiddiferixxi t-tnedija tas-servizzi awżiljarji sakemm jibda s-servizz fil-kontejners li jeħtieġu. Podman jista 'jibgħat is-socket SD_NOTIFY lis-servizz fil-kontejners sabiex is-servizz jinnotifika lil systemd li huwa lest biex jopera. U għal darb'oħra, Docker, li juża mudell klijent-server, ma jistax jagħmel dan.

Fil-pjanijiet

Qed nippjanaw li nżidu l-kmand podman generate systemd CONTAINERID, li se jiġġenera fajl ta 'unità systemd biex jimmaniġġja kontenitur speċifiku speċifikat. Dan għandu jaħdem kemm fil-modi għeruq kif ukoll bla għeruq għal kontenituri mhux privileġġjati. Saħansitra rajna talba għal runtime systemd-nspawn kompatibbli mal-OCI.

Konklużjoni

It-tħaddim tas-systemd f'kontenitur huwa ħtieġa li tinftiehem. U grazzi għal Podman, fl-aħħar għandna runtime tal-kontejner li ma jikkonfliġġux ma 'systemd, iżda jagħmilha faċli biex tużah.

Sors: www.habr.com

Żid kumment