Kouri systemd nan yon veso

Nou te swiv sijè a nan itilize systemd nan resipyan pou yon tan long. An 2014, enjenyè sekirite nou an Daniel Walsh te ekri yon atik Kouri systemd nan yon Container Docker, ak yon koup la ane pita - yon lòt, ki te rele Kouri systemd nan yon veso ki pa privilejye, nan ki li te deklare ke sitiyasyon an pa te amelyore anpil. An patikilye, li te ekri ke "malerezman, menm de ane pita, si ou google "Docker system", premye bagay ki vini se menm atik li fin vye granmoun. Se konsa, li lè pou chanje yon bagay." Anplis de sa, nou te deja pale sou konfli ant Docker ak devlopè systemd.

Kouri systemd nan yon veso

Nan atik sa a nou pral montre sa ki te chanje sou tan ak ki jan Podman ka ede nou nan zafè sa a.

Gen anpil rezon pou kouri systemd andedan yon veso, tankou:

  1. Kontenè pou plizyè sèvis – anpil moun vle rale aplikasyon milti-sèvis yo soti nan machin vityèl epi kouri yo nan resipyan. Li ta pi bon, nan kou, kraze aplikasyon sa yo nan mikwosèvis, men se pa tout moun konnen ki jan fè sa ankò oswa tou senpleman pa gen tan an. Se poutèt sa, kouri aplikasyon sa yo tankou sèvis te lanse pa systemd soti nan dosye inite fè sans pafè.
  2. Systemd fichye inite yo – Pifò aplikasyon ki kouri andedan resipyan yo bati nan kòd ki te deja kouri sou machin vityèl oswa fizik. Aplikasyon sa yo gen yon fichye inite ki te ekri pou aplikasyon sa yo epi konprann ki jan yo ta dwe lanse. Se konsa, li toujou pi bon yo kòmanse sèvis lè l sèvi avèk metòd sipòte, olye ke Hacking pwòp sèvis init ou.
  3. Systemd se yon manadjè pwosesis. Li jere sèvis (fèmen, rekòmanse sèvis, oswa touye pwosesis zonbi) pi byen pase nenpòt lòt zouti.

Sa te di, gen anpil rezon pou pa kouri systemd nan kontenè. Yon sèl prensipal la se ke systemd/journald kontwole pwodiksyon an nan resipyan, ak zouti tankou Kubernetes oswa openshift espere kontenè yo ekri log dirèkteman nan stdout ak stderr. Se poutèt sa, si ou pral jere resipyan atravè zouti orchestration tankou sa yo mansyone pi wo a, ou ta dwe seryezman konsidere itilize resipyan ki baze sou systemd. Anplis de sa, devlopè Docker ak Moby yo te souvan opoze ak itilizasyon systemd nan resipyan yo.

Vini nan Podman

Nou kontan rapòte ke sitiyasyon an finalman avanse. Ekip ki responsab pou kouri kontenè nan Red Hat te deside devlope motè kontenè pwòp ou a. Li te gen yon non podman epi li ofri menm koòdone liy lòd (CLI) kòm Docker. Ak prèske tout kòmandman Docker ka itilize nan Podman nan menm fason an. Nou souvan fè seminè, ki kounye a yo rele Chanje Docker pou Podman, ak premye glisad la mande pou ekri: alyas docker=podman.

Anpil moun fè sa.

Podman mwen ak mwen pa nan okenn fason kont resipyan ki baze sou systemd. Apre yo tout, Systemd se pi souvan itilize Linux init subsystem, epi pa pèmèt li travay byen nan resipyan vle di inyore ki jan dè milye de moun yo abitye kouri kontenè.

Podman konnen kisa pou l fè pou sistèmd travay byen nan yon veso. Li bezwen bagay tankou monte tmpfs sou /run ak /tmp. Li renmen gen anviwònman an "containerized" aktive epi li espere ekri otorizasyon nan pati li nan anyè cgroup la ak nan katab /var/log/journald la.

Lè ou kòmanse yon veso kote premye kòmandman an se init oswa systemd, Podman otomatikman configured tmpfs ak Cgroups pou asire ke systemd kòmanse san pwoblèm. Pou bloke mòd lansman oto sa a, sèvi ak opsyon --systemd=false. Tanpri sonje ke Podman itilize mòd systemd sèlman lè li wè ke li bezwen kouri yon kòmand systemd oswa init.

Isit la se yon ekstrè nan manyèl la:

man podman kouri
...

–systemd=vre|fo

Kouri yon veso nan mòd systemd. Aktive pa default.

Si ou kouri yon kòmand systemd oswa init andedan yon veso, Podman pral configured pwen mòn tmpfs nan anyè sa yo:

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

Epitou siyal sispann default la pral SIGRTMIN + 3.

Tout sa pèmèt systemd kouri nan yon veso ki fèmen san okenn modifikasyon.

REMAK: systemd eseye ekri nan sistèm dosye cgroup la. Sepandan, SELinux anpeche veso yo fè sa pa default. Pou pèmèt ekriti, aktive paramèt boolean container_manage_cgroup:

setsebool -P container_manage_cgroup vre

Koulye a, gade kisa Dockerfile a sanble pou kouri systemd nan yon veso lè l sèvi avèk Podman:

# cat Dockerfile

FROM fedora

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

EXPOSE 80

CMD [ "/sbin/init" ]

Se tout.

Koulye a, nou rasanble veso a:

# podman build -t systemd .

Nou di SELinux pou pèmèt systemd modifye konfigirasyon Cgroups la:

# setsebool -P container_manage_cgroup true

By wout la, anpil moun bliye sou etap sa a. Erezman, sa sèlman bezwen fè yon fwa epi anviwònman an sove apre rdemare sistèm lan.

Koulye a, nou jis kòmanse veso a:

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

Sa a se li, sèvis la ap fonksyone:

$ curl localhost

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

…

</html>

REMAK: Pa eseye sa a sou Docker! La ou toujou bezwen danse ak yon tanbourin pou lanse kalite kontenè sa yo atravè demon an. (Y ap mande lòt jaden ak pakè pou fè tout bagay sa yo travay san pwoblèm nan Docker, oswa li pral bezwen kouri nan yon veso privilejye. Pou plis detay, gade Atik.)

Yon koup plis bagay fre sou Podman ak systemd

Podman travay pi byen pase Docker nan fichye inite systemd

Si resipyan yo bezwen kòmanse lè sistèm lan kòmanse, lè sa a ou ka tou senpleman mete kòmandman Podman apwopriye yo nan dosye inite systemd la, ki pral kòmanse sèvis la epi kontwole li. Podman sèvi ak modèl estanda fouchèt-exec. Nan lòt mo, pwosesis veso yo se pitit pwosesis Podman, kidonk systemd ka fasilman kontwole yo.

Docker sèvi ak yon modèl kliyan-sèvè, ak kòmandman Docker CLI kapab tou mete dirèkteman nan yon dosye inite. Sepandan, yon fwa kliyan Docker la konekte ak demon Docker la, li (kliyan an) vin jis yon lòt pwosesis k ap okipe stdin ak stdout. Nan vire, systemd pa gen okenn lide sou koneksyon ki genyen ant kliyan an Docker ak veso a ki kouri anba kontwòl demon an Docker, ak Se poutèt sa, nan modèl sa a, systemd fondamantalman pa ka kontwole sèvis la.

Aktive systemd atravè priz

Podman okipe deklanchman atravè priz kòrèkteman. Paske Podman itilize modèl fork-exec la, li ka voye priz la nan pwosesis veso timoun li yo. Docker pa ka fè sa paske li itilize yon modèl kliyan-sèvè.

Sèvis varlink ke Podman itilize pou kominike ak kliyan aleka nan resipyan yo aktyèlman aktive atravè yon priz. Pake cockpit-podman, ekri nan Node.js ak yon pati nan pwojè cockpit la, pèmèt moun yo kominike avèk resipyan Podman atravè yon koòdone entènèt. Daemon entènèt ki kouri cockpit-podman voye mesaj nan yon priz varlink ki systemd koute. Lè sa a, Systemd aktive pwogram Podman pou resevwa mesaj epi kòmanse jere veso yo. Aktive systemd sou yon priz elimine nesesite pou yon demon ki toujou ap kouri lè w ap aplike API aleka.

Anplis de sa, nou ap devlope yon lòt kliyan Podman ki rele podman-remote, ki aplike menm Podman CLI a men ki rele varlink pou kouri kontenè. Podman-remote ka kouri sou tèt sesyon SSH, sa ki pèmèt ou byen kominike avèk resipyan sou diferan machin. Apre yon sèten tan, nou planifye pou pèmèt podman-remote sipòte MacOS ak Windows ansanm ak Linux, pou devlopè sou tribin sa yo ka kouri yon machin vityèl Linux ak Podman varlink kouri epi yo gen eksperyans konplè ke veso yo ap kouri sou machin lokal la.

SD_NOTIFY

Systemd pèmèt ou ranvwaye lansman sèvis oksilyè jiskaske sèvis kontenè yo mande a kòmanse. Podman kapab voye priz SD_NOTIFY a bay sèvis kontenè a pou sèvis la notifye systemd ke li pare pou opere. Epi ankò, Docker, ki sèvi ak yon modèl kliyan-sèvè, pa ka fè sa.

Nan plan yo

Nou planifye pou ajoute kòmand podman generate systemd CONTAINERID, ki pral jenere yon fichye inite systemd pou jere yon veso espesifik espesifye. Sa a ta dwe travay nan tou de mòd rasin ak rasin pou resipyan ki pa gen privilèj. Nou te menm wè yon demann pou yon tan exécution systemd-nspawn ki konpatib OCI.

Konklizyon

Kouri systemd nan yon veso se yon bezwen konprann. Ak gras a Podman, finalman nou gen yon tan exekutif veso ki pa konfli ak systemd, men ki fè li fasil pou itilize.

Sous: www.habr.com

Add nouvo kòmantè