ஒரு கொள்கலனில் systemd இயங்குகிறது

systemdஐ கண்டெய்னர்களில் பயன்படுத்துவது என்ற தலைப்பை நீண்ட நாட்களாக பின்பற்றி வருகிறோம். 2014 இல், எங்கள் பாதுகாப்பு பொறியாளர் டேனியல் வால்ஷ் ஒரு கட்டுரை எழுதினார் டோக்கர் கொள்கலனுக்குள் systemd இயங்குகிறது, மற்றும் ஓரிரு ஆண்டுகளுக்குப் பிறகு - இன்னொன்று, அழைக்கப்பட்டது சிறப்புரிமை இல்லாத கொள்கலனில் systemd இயங்குகிறது, அதில் நிலைமை பெரிதாக முன்னேற்றம் அடையவில்லை என்று கூறினார். குறிப்பாக, "துரதிர்ஷ்டவசமாக, இரண்டு ஆண்டுகளுக்குப் பிறகு, நீங்கள் "டாக்கர் சிஸ்டம்" என்று கூகிள் செய்தால், முதலில் வருவது அவரது அதே பழைய கட்டுரைதான். எனவே எதையாவது மாற்ற வேண்டிய நேரம் இது." கூடுதலாக, நாங்கள் ஏற்கனவே பேசினோம் டோக்கர் மற்றும் சிஸ்டம் டெவலப்பர்களுக்கு இடையே மோதல்.

ஒரு கொள்கலனில் systemd இயங்குகிறது

இந்த கட்டுரையில் காலப்போக்கில் என்ன மாறிவிட்டது என்பதையும், இந்த விஷயத்தில் பாட்மேன் எவ்வாறு நமக்கு உதவ முடியும் என்பதையும் காண்பிப்போம்.

ஒரு கொள்கலனுக்குள் systemd ஐ இயக்க பல காரணங்கள் உள்ளன, அவை:

  1. பல சேவை கொள்கலன்கள் - பலர் தங்கள் மல்டி-சர்வீஸ் அப்ளிகேஷன்களை மெய்நிகர் இயந்திரங்களிலிருந்து வெளியே இழுத்து அவற்றை கொள்கலன்களில் இயக்க விரும்புகிறார்கள். நிச்சயமாக, இதுபோன்ற பயன்பாடுகளை மைக்ரோ சர்வீஸாக உடைப்பது நல்லது, ஆனால் இதை எப்படி செய்வது என்று அனைவருக்கும் இன்னும் தெரியாது அல்லது நேரம் இல்லை. எனவே, யூனிட் கோப்புகளிலிருந்து systemd ஆல் தொடங்கப்பட்ட சேவைகள் போன்ற பயன்பாடுகளை இயக்குவது சரியான அர்த்தமுள்ளதாக இருக்கும்.
  2. Systemd அலகு கோப்புகள் - கன்டெய்னர்களுக்குள் இயங்கும் பெரும்பாலான பயன்பாடுகள் முன்பு மெய்நிகர் அல்லது இயற்பியல் கணினிகளில் இயங்கிய குறியீட்டிலிருந்து உருவாக்கப்பட்டவை. இந்த அப்ளிகேஷன்கள் இந்த அப்ளிகேஷன்களுக்காக எழுதப்பட்ட யூனிட் பைலைக் கொண்டுள்ளன, மேலும் அவை எவ்வாறு தொடங்கப்பட வேண்டும் என்பதைப் புரிந்துகொள்ளும். எனவே உங்கள் சொந்த init சேவையை ஹேக் செய்வதை விட, ஆதரிக்கப்படும் முறைகளைப் பயன்படுத்தி சேவைகளைத் தொடங்குவது இன்னும் சிறந்தது.
  3. Systemd ஒரு செயல்முறை மேலாளர். இது வேறு எந்த கருவியையும் விட சிறப்பாக சேவைகளை நிர்வகிக்கிறது (நிறுத்துகிறது, சேவைகளை மறுதொடக்கம் செய்கிறது அல்லது ஜாம்பி செயல்முறைகளை அழிக்கிறது).

கண்டெய்னர்களில் systemd ஐ இயக்காமல் இருப்பதற்கு பல காரணங்கள் உள்ளன. இதில் முக்கியமானது, systemd/journald, கொள்கலன்கள் மற்றும் கருவிகளின் வெளியீட்டைக் கட்டுப்படுத்துகிறது Kubernetes அல்லது ஓப்பன்ஷிஃப்ட் கொள்கலன்கள் stdout மற்றும் stderr க்கு நேரடியாக பதிவை எழுதும் என்று எதிர்பார்க்கலாம். எனவே, மேலே குறிப்பிட்டுள்ளதைப் போன்ற ஆர்கெஸ்ட்ரேஷன் கருவிகள் மூலம் கொள்கலன்களை நிர்வகிக்கப் போகிறீர்கள் என்றால், systemd- அடிப்படையிலான கொள்கலன்களைப் பயன்படுத்துவதை நீங்கள் தீவிரமாகக் கருத்தில் கொள்ள வேண்டும். கூடுதலாக, Docker மற்றும் Moby டெவலப்பர்கள் பெரும்பாலும் systemdஐ கண்டெய்னர்களில் பயன்படுத்துவதை கடுமையாக எதிர்த்தனர்.

பாட்மேன் வருகை

நிலைமை இறுதியாக முன்னேறியுள்ளது என்பதை மகிழ்ச்சியுடன் தெரிவிக்கிறோம். Red Hat இல் கொள்கலன்களை இயக்குவதற்கு பொறுப்பான குழு உருவாக்க முடிவு செய்தது உங்கள் சொந்த கொள்கலன் இயந்திரம். அவருக்கு ஒரு பெயர் கிடைத்தது போட்மேன் மற்றும் டோக்கரின் அதே கட்டளை வரி இடைமுகத்தை (CLI) வழங்குகிறது. மேலும் கிட்டத்தட்ட அனைத்து Docker கட்டளைகளையும் Podman இல் இதே முறையில் பயன்படுத்தலாம். நாங்கள் அடிக்கடி கருத்தரங்குகளை நடத்துகிறோம், அவை இப்போது அழைக்கப்படுகின்றன டோக்கரை பாட்மேனாக மாற்றுதல், மற்றும் முதல் ஸ்லைடு எழுதுவதற்கு அழைப்பு விடுக்கிறது: alias docker=podman.

பலர் இதைச் செய்கிறார்கள்.

நானும் எனது பாட்மேனும் எந்த விதத்திலும் systemd-அடிப்படையிலான கொள்கலன்களுக்கு எதிரானவர்கள் அல்ல. எல்லாவற்றிற்கும் மேலாக, Systemd என்பது மிகவும் பொதுவாகப் பயன்படுத்தப்படும் Linux init துணை அமைப்பாகும், மேலும் அதை கொள்கலன்களில் சரியாக வேலை செய்ய அனுமதிக்காதது, ஆயிரக்கணக்கான மக்கள் கொள்கலன்களை இயக்கும் பழக்கத்தை புறக்கணிப்பதாகும்.

ஒரு கொள்கலனில் systemd சரியாக வேலை செய்ய என்ன செய்ய வேண்டும் என்பது Podmanக்கு தெரியும். இதற்கு /ரன் மற்றும் /tmp இல் tmpfs ஐ ஏற்றுவது போன்ற விஷயங்கள் தேவை. அவள் "கன்டெய்னரைஸ்டு" சூழலை இயக்க விரும்புகிறாள் மற்றும் cgroup கோப்பகத்தின் தனது பகுதிக்கும் /var/log/journald கோப்புறைக்கும் எழுத அனுமதிகளை எதிர்பார்க்கிறாள்.

முதல் கட்டளை init அல்லது systemd உள்ள ஒரு கொள்கலனை நீங்கள் தொடங்கும் போது, ​​Podman தானாகவே tmpfs மற்றும் Cgroups ஐ கட்டமைத்து, systemd பிரச்சனை இல்லாமல் தொடங்குவதை உறுதி செய்கிறது. இந்த தானியங்கு வெளியீட்டு பயன்முறையைத் தடுக்க, --systemd=false விருப்பத்தைப் பயன்படுத்தவும். Podman ஒரு systemd அல்லது init கட்டளையை இயக்க வேண்டும் என்று பார்க்கும் போது மட்டுமே systemd பயன்முறையைப் பயன்படுத்துகிறது என்பதை நினைவில் கொள்ளவும்.

கையேட்டில் இருந்து ஒரு பகுதி இங்கே:

மனிதன் பாட்மேன் ரன்
...

–systemd=உண்மை|பொய்

systemd பயன்முறையில் ஒரு கொள்கலனை இயக்குகிறது. இயல்பாக இயக்கப்பட்டது.

நீங்கள் ஒரு systemd அல்லது init கட்டளையை ஒரு கொள்கலனுக்குள் இயக்கினால், Podman பின்வரும் கோப்பகங்களில் tmpfs மவுண்ட் புள்ளிகளை உள்ளமைக்கும்:

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

மேலும் இயல்புநிலை நிறுத்த சமிக்ஞை SIGRTMIN+3 ஆக இருக்கும்.

இவை அனைத்தும் எந்த மாற்றமும் இல்லாமல் மூடிய கொள்கலனில் systemd ஐ இயக்க அனுமதிக்கிறது.

குறிப்பு: systemd cgroup கோப்பு முறைமையில் எழுத முயற்சிக்கிறது. இருப்பினும், SELinux கொள்கலன்கள் இதை முன்னிருப்பாகச் செய்வதைத் தடுக்கிறது. எழுதுவதை இயக்க, container_manage_cgroup பூலியன் அளவுருவை இயக்கவும்:

setsebool -P container_manage_cgroup true

Podman ஐப் பயன்படுத்தி ஒரு கொள்கலனில் systemd ஐ இயக்குவதற்கு Dockerfile எப்படி இருக்கும் என்பதை இப்போது பாருங்கள்:

# cat Dockerfile

FROM fedora

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

EXPOSE 80

CMD [ "/sbin/init" ]

அவ்வளவுதான்.

இப்போது நாம் கொள்கலனை சேகரிக்கிறோம்:

# podman build -t systemd .

Cgroups உள்ளமைவை மாற்றுவதற்கு systemd ஐ அனுமதிக்க SELinux க்கு சொல்கிறோம்:

# setsebool -P container_manage_cgroup true

பலர், இந்த படிநிலையை மறந்து விடுகிறார்கள். அதிர்ஷ்டவசமாக, இது ஒரு முறை மட்டுமே செய்யப்பட வேண்டும் மற்றும் கணினியை மறுதொடக்கம் செய்த பிறகு அமைப்பு சேமிக்கப்படும்.

இப்போது நாம் கொள்கலனைத் தொடங்குகிறோம்:

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

அவ்வளவுதான், சேவை இயங்குகிறது:

$ curl localhost

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

…

</html>

குறிப்பு: டோக்கரில் இதை முயற்சிக்க வேண்டாம்! டீமான் மூலம் இந்த வகையான கொள்கலன்களை ஏவுவதற்கு நீங்கள் இன்னும் டம்பூரைனுடன் நடனமாட வேண்டும். (இவை அனைத்தும் டோக்கரில் தடையின்றி வேலை செய்ய கூடுதல் புலங்கள் மற்றும் தொகுப்புகள் தேவைப்படும் அல்லது சிறப்புரிமை பெற்ற கொள்கலனில் இயக்க வேண்டும். விவரங்களுக்கு, பார்க்கவும் கட்டுரை.)

Podman மற்றும் systemd பற்றி இன்னும் சில அருமையான விஷயங்கள்

Systemd யூனிட் கோப்புகளில் Docker ஐ விட Podman சிறப்பாக செயல்படுகிறது

கணினி துவங்கும் போது கொள்கலன்களைத் தொடங்க வேண்டும் என்றால், நீங்கள் பொருத்தமான Podman கட்டளைகளை systemd யூனிட் கோப்பில் செருகலாம், இது சேவையைத் தொடங்கி அதைக் கண்காணிக்கும். Podman நிலையான fork-exec மாதிரியைப் பயன்படுத்துகிறது. வேறு வார்த்தைகளில் கூறுவதானால், கொள்கலன் செயல்முறைகள் Podman செயல்முறையின் குழந்தைகள், எனவே systemd அவற்றை எளிதாக கண்காணிக்க முடியும்.

டோக்கர் கிளையன்ட்-சர்வர் மாதிரியைப் பயன்படுத்துகிறது, மேலும் டோக்கர் சிஎல்ஐ கட்டளைகளை நேரடியாக யூனிட் கோப்பில் வைக்கலாம். இருப்பினும், டோக்கர் கிளையன்ட் டோக்கர் டீமானுடன் இணைந்தவுடன், அது (கிளையன்ட்) stdin மற்றும் stdout ஐ செயலாக்கும் மற்றொரு செயல்முறையாக மாறும். இதையொட்டி, டோக்கர் கிளையன்ட் மற்றும் டோக்கர் டெமனின் கட்டுப்பாட்டின் கீழ் இயங்கும் கொள்கலன் இடையேயான தொடர்பைப் பற்றி systemd க்கு தெரியாது, எனவே, இந்த மாதிரியில், systemd அடிப்படையில் சேவையை கண்காணிக்க முடியாது.

சாக்கெட் வழியாக systemd ஐ செயல்படுத்துகிறது

Podman சாக்கெட் வழியாக செயல்படுத்தலை சரியாக கையாளுகிறது. Podman fork-exec மாதிரியைப் பயன்படுத்துவதால், அது சாக்கெட்டை அதன் குழந்தை கொள்கலன் செயல்முறைகளுக்கு அனுப்ப முடியும். டோக்கரால் இதைச் செய்ய முடியாது, ஏனெனில் இது கிளையன்ட்-சர்வர் மாதிரியைப் பயன்படுத்துகிறது.

தொலைநிலை வாடிக்கையாளர்களுடன் கொள்கலன்களுடன் தொடர்பு கொள்ள Podman பயன்படுத்தும் varlink சேவை உண்மையில் ஒரு சாக்கெட் வழியாக செயல்படுத்தப்படுகிறது. காக்பிட்-பாட்மேன் தொகுப்பு, Node.js இல் எழுதப்பட்ட மற்றும் காக்பிட் திட்டத்தின் ஒரு பகுதி, வலை இடைமுகம் மூலம் Podman கொள்கலன்களுடன் தொடர்பு கொள்ள மக்களை அனுமதிக்கிறது. காக்பிட்-பாட்மேன் இயங்கும் வெப் டீமான், systemd கேட்கும் ஒரு varlink சாக்கெட்டுக்கு செய்திகளை அனுப்புகிறது. Systemd செய்திகளைப் பெறுவதற்கும் கொள்கலன்களை நிர்வகிப்பதற்கும் Podman நிரலை செயல்படுத்துகிறது. ஒரு சாக்கெட் மூலம் systemd ஐ செயல்படுத்துவது தொலைநிலை APIகளை செயல்படுத்தும் போது தொடர்ந்து இயங்கும் டீமானின் தேவையை நீக்குகிறது.

கூடுதலாக, Podman-remote எனப்படும் மற்றொரு Podman கிளையண்டை நாங்கள் உருவாக்குகிறோம், இது அதே Podman CLI ஐ செயல்படுத்துகிறது, ஆனால் கொள்கலன்களை இயக்க varlink ஐ அழைக்கிறது. Podman-remote SSH அமர்வுகளின் மேல் இயங்க முடியும், இது வெவ்வேறு கணினிகளில் உள்ள கொள்கலன்களுடன் பாதுகாப்பாக தொடர்பு கொள்ள உங்களை அனுமதிக்கிறது. காலப்போக்கில், Linux உடன் MacOS மற்றும் Windows ஐ ஆதரிக்க podman-remote ஐ இயக்க திட்டமிட்டுள்ளோம், இதனால் அந்த தளங்களில் உள்ள டெவலப்பர்கள் Podman varlink இயங்கும் Linux மெய்நிகர் இயந்திரத்தை இயக்க முடியும் மற்றும் உள்ளூர் கணினியில் கொள்கலன்கள் இயங்கும் முழு அனுபவத்தையும் பெறலாம்.

SD_NOTIFY

Systemd உங்களுக்குத் தேவைப்படும் கொள்கலன் சேவை தொடங்கும் வரை துணை சேவைகளின் துவக்கத்தை ஒத்திவைக்க அனுமதிக்கிறது. Podman, SD_NOTIFY சாக்கெட்டை கன்டெய்னரைஸ்டு சேவைக்கு அனுப்ப முடியும், இதனால் அது செயல்படத் தயாராக உள்ளதாக அந்த சேவை systemdக்கு தெரிவிக்கும். மீண்டும், கிளையன்ட்-சர்வர் மாதிரியைப் பயன்படுத்தும் டோக்கரால் இதைச் செய்ய முடியாது.

திட்டங்களில்

Podman create systemd CONTAINERID கட்டளையைச் சேர்க்க நாங்கள் திட்டமிட்டுள்ளோம், இது குறிப்பிட்ட கொள்கலனை நிர்வகிக்க systemd அலகு கோப்பை உருவாக்கும். இது சலுகையற்ற கொள்கலன்களுக்கு ரூட் மற்றும் ரூட்லெஸ் ஆகிய இரண்டு முறைகளிலும் வேலை செய்ய வேண்டும். OCI-இணக்கமான systemd-nspawn இயக்க நேரத்திற்கான கோரிக்கையையும் பார்த்தோம்.

முடிவுக்கு

ஒரு கொள்கலனில் systemd ஐ இயக்குவது புரிந்துகொள்ளக்கூடிய தேவை. Podman க்கு நன்றி, நாங்கள் இறுதியாக systemd உடன் முரண்படாத ஒரு கொள்கலன் இயக்க நேரத்தைக் கொண்டுள்ளோம், ஆனால் அதைப் பயன்படுத்துவதை எளிதாக்குகிறது.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்