GNU/Linux >> Znalost Linux >  >> Linux

Jak přesunout Sledování požadavků do kontejneru Linux

I když mi trvalo dlouho, než jsem se motivoval, nakonec jsem kontejnerizoval několik osobních linuxových služeb. Zdokumentoval jsem projekt v této sérii. V tomto článku vás provedeme posledním příkladem, Sledování požadavků.

Pro začátek jsme se podívali na některé obecné principy migrace aplikací do kontejnerů. Poté jsme se podívali na kontejnerizaci WordPressu a dále jsme diskutovali o přesunutí MediaWiki do kontejneru. Tento projekt byl o něco více zapojený než první, s přidáním plánování úkolů. V tomto posledním článku se budeme zabývat mnohem složitější migrací. Konkrétně se podíváme na Request Tracker. Tato služba může být nejsložitější, protože jak sestavení, tak běh jsou poměrně sofistikované.

Poznámka editora:Pro účely tohoto článku předpokládáme, že své kontejnery budete stavět na Red Hat Enterprise Linux 8 pomocí sestavení podman. Pokyny můžete použít v jiných distribucích nebo s jinými nástroji, mohou však být nutné určité úpravy.

Moving Request Tracker

Sestavit

Na rozdíl od WordPress a MediaWiki, které běží na jednovrstvém obrázku nad základním obrázkem, Request Tracker používá dvě vrstvy nad základním obrázkem. Podívejme se na každou vrstvu a uvidíme, proč jsme to udělali tímto způsobem.

První vrstva je postavena velmi podobně jako httpd-php obraz. Tento obrázek přidává nezbytné služby pro webovou aplikaci založenou na Perlu. Zahrnujeme Apache, modul FastCGI, Perl, MariaDB, cron a některé základní nástroje pro odstraňování problémů:

FROM registry.access.redhat.com/ubi8/ubi-init
MAINTAINER fatherlinux <[email protected]>
RUN yum install -y httpd mod_fcgid perl mariadb-server mariadb crontabs cronie iputils net-tools; yum clean all
RUN systemctl enable mariadb
RUN systemctl enable httpd
RUN systemctl enable postfix
RUN systemctl disable systemd-update-utmp.service
ENTRYPOINT ["/sbin/init"]
CMD ["/sbin/init"]

Druhá vrstva je místo, kde se věci stávají docela sofistikovanými. Request Tracker používá mnoho modulů Perl z CPAN. Mnoho z těchto modulů je zkompilováno pomocí gcc a instalace trvá dlouho. Dalo také hodně práce, aby byly všechny tyto závislosti vyřešeny, aby bylo možné úspěšně nainstalovat nástroj Request Tracker. Historicky bychom to někde zachytili ve skriptu, ale s kontejnery to můžeme mít všechno v jednom Containerfile. Je to velmi pohodlné.

[ Mohlo by se vám také líbit: 6 průvodců zabezpečením kontejnerů ]

Další věc, které byste si u tohoto souboru měli všimnout, je, že se jedná o vícefázové sestavení. Podman a Buildah mohou absolutně dělat vícefázové sestavení a mohou být extrémně užitečné pro aplikace, jako je Request Tracker. Mohli jsme se připojit k adresářům, jako jsme to udělali s WordPress a MediaWiki, ale místo toho jsme zvolili vícefázové sestavení. To nám poskytne přenositelnost a rychlost, pokud budeme potřebovat znovu sestavit aplikaci někde jinde.

Vícefázové sestavení lze považovat za zachycení vývojového serveru a produkčního serveru do jediného souboru sestavení. Historicky byly vývojové servery ve skutečnosti nejobtížnější na automatizaci. Od počátků CFEngine v polovině 90. let vývojáři odmítali používat správu verzí a přidávali na vývojové servery cokoli, co chtěli, aby fungovaly. Často ani nevěděli, co přidali, aby byla stavba kompletní. To bylo ve skutečnosti racionální, když jste měli servery s dlouhou životností, které byly dobře zálohované, ale vždy to způsobovalo bolest, když museli správci systémů „upgradovat dev server“. Byla noční můra, aby sestavení fungovala na zcela novém serveru s novým operačním systémem.

S vícestupňovými sestaveními zachytíme všechny sestavené instrukce a dokonce i vytvořené vrstvy mezipaměti. Tento vývojářský virtuální server můžeme přestavět, kdekoli budeme chtít.

FROM registry.access.redhat.com/ubi8/ubi-init
FROM localhost/httpd-perl AS localhost/rt4-build
MAINTAINER fatherlinux <[email protected]>
RUN yum install -y expat-devel gcc; yum clean all
RUN cpan -i CPAN
RUN cpan -i -f GnuPG::Interface
RUN cpan -i DBIx::SearchBuilder \
ExtUtils::Command::MM \
Text::WikiFormat \
Devel::StackTrace \
Apache::Session \
Module::Refresh \
HTML::TreeBuilder \
HTML::FormatText::WithLinks \
HTML::FormatText::WithLinks::AndTables \
Data::GUID \
CGI::Cookie \
DateTime::Format::Natural \
Text::Password::Pronounceable \
UNIVERSAL::require \
JSON \
DateTime \
Net::CIDR \
CSS::Minifier::XS \
CGI \
Devel::GlobalDestruction \
Text::Wrapper \
Net::IP \
HTML::RewriteAttributes \
Log::Dispatch \
Plack \
Regexp::Common::net::CIDR \
Scope::Upper \
CGI::Emulate::PSGI \
HTML::Mason::PSGIHandler \
HTML::Scrubber \
HTML::Entities \
HTML::Mason \
File::ShareDir \
Mail::Header \
XML::RSS \
List::MoreUtils \
Plack::Handler::Starlet \
IPC::Run3 \
Email::Address \
Role::Basic \
MIME::Entity \
Regexp::IPv6 \
Convert::Color \
Business::Hours \
Symbol::Global::Name \
MIME::Types \
Locale::Maketext::Fuzzy \
Tree::Simple \
Clone \
HTML::Quoted \
Data::Page::Pageset \
Text::Quoted \
DateTime::Locale \
HTTP::Message \
Crypt::Eksblowfish \
Data::ICal \
Locale::Maketext::Lexicon \
Time::ParseDate \
Mail::Mailer \
Email::Address::List \
Date::Extract \
CSS::Squish \
Class::Accessor::Fast \
LWP::Simple \
Module::Versions::Report \
Regexp::Common \
Date::Manip \
CGI::PSGI \
JavaScript::Minifier::XS \
FCGI \
PerlIO::eol \
GnuPG::Interface \
LWP::UserAgent >= 6.02 \
LWP::Protocol::https \
String::ShellQuote \
Crypt::X509
RUN cd /root/rt-4.4.4;make testdeps;make install

# Deploy
FROM localhost/httpd-perl AS localhost/rt:4.4.4
RUN yum install -y postfix mailx;yum clean all
COPY --from=localhost/rt4-build /opt/rt4 /opt/rt4
COPY --from=localhost/rt4-build /usr/lib64/perl5 /usr/lib64/perl5
COPY --from=localhost/rt4-build /usr/share/perl5 /usr/share/perl5
COPY --from=localhost/rt4-build /usr/local/share/perl5 /usr/local/share/perl5
COPY --from=localhost/rt4-build /usr/local/lib64/perl5/ /usr/local/lib64/perl5/
RUN chown -R root.bin /opt/rt4/lib;chown -R root.apache /opt/rt4/etc
ENTRYPOINT ["/sbin/init"]
CMD ["/sbin/init"]

Druhá fáze tohoto vícefázového sestavení vytváří virtuální produkční server. Tím, že to rozdělíme do druhé fáze, nemusíme instalovat vývojové nástroje jako gcc nebo expat-devel v konečném produkčním obrazu. To zmenšuje velikost našeho obrazu a snižuje velikost dodavatelského řetězce softwaru ve službách vystavených síti. To také potenciálně snižuje šance, že by někdo udělal něco ošklivého s naším kontejnerem, pokud by se do něj naboural.

Poštovní nástroje instalujeme pouze v této druhé fázi, která definuje druhou vrstvu našeho produkčního obrazu pro Request Tracker. Tyto nástroje jsme mohli nainstalovat do httpd-perl vrstva, ale mnoho dalších aplikací v Perlu nebude potřebovat poštovní nástroje.

Další výhodou vícestupňových sestavení je, že nemusíme znovu sestavovat všechny tyto moduly Perl pokaždé, když chceme aktualizovat interpret Perl, Apache nebo MariaDB pro bezpečnostní záplaty.

Spustit

Nyní, stejně jako WordPress a MediaWiki, se pojďme podívat na některé triky, které používáme za běhu:

[Unit]
Description=Podman container – rt.fatherlinux.com
Documentation=man:podman-generate-systemd(1)

[Service]
Type=simple
ExecStart=/usr/bin/podman run -i --rm --read-only -p 8081:8081 --name rt.fatherlinux.com \
-v /srv/rt.fatherlinux.com/code/reminders:/root/reminders:ro \
-v /srv/rt.fatherlinux.com/config/rt.fatherlinux.com.conf:/etc/httpd/conf.d/rt.fatherlinux.com.conf:ro \
-v /srv/rt.fatherlinux.com/config/MyConfig.pm:/root/.cpan/CPAN/MyConfig.pm:ro \
-v /srv/rt.fatherlinux.com/config/RT_SiteConfig.pm:/opt/rt4/etc/RT_SiteConfig.pm:ro \
-v /srv/rt.fatherlinux.com/config/root-crontab:/var/spool/cron/root:ro \
-v /srv/rt.fatherlinux.com/config/aliases:/etc/aliases:ro \
-v /srv/rt.fatherlinux.com/config/main.cf:/etc/postfix/main.cf:ro \
-v /srv/rt.fatherlinux.com/data/mariadb:/var/lib/mysql:Z \
-v /srv/rt.fatherlinux.com/data/logs/httpd:/var/log/httpd:Z \
-v /srv/rt.fatherlinux.com/data/logs/rt4:/opt/rt4/var:Z \
-v /srv/rt.fatherlinux.com/data/backups:/root/.backups:Z \
--tmpfs /etc \
--tmpfs /var/log/ \
--tmpfs /var/tmp \
--tmpfs /var/spool \
--tmpfs /var/lib \
localhost/rt:latest
ExecStop=/usr/bin/podman stop -t 3 rt.fatherlinux.com
ExecStopAfter=/usr/bin/podman rm -f rt.fatherlinux.com
Restart=always

[Install]
WantedBy=multi-user.target

Stejně jako MediaWiki jsou všechny konfigurační soubory připojeny pouze ke čtení, což nám poskytuje solidní bezpečnostní upgrade. A konečně, datové adresáře jsou pro čtení a zápis, stejně jako naše ostatní kontejnery. Jeden jednoduchý postřeh:Stále jsme svázali připojení nějakého kódu do obrazu pro Připomenutí , což je malá, doma vytvořená sada skriptů, které odesílají e-maily a generují vstupenky pro týdenní, měsíční a roční záznamy.

Další analýza

Pojďme se zabývat několika posledními tématy, která nejsou specifická pro žádnou z našich kontejnerových linuxových služeb.

Obnovitelnost

Obnovitelnost je něco, co musíme pečlivě zvážit. Pomocí systemd , získáme solidní obnovitelnost, srovnatelnou s běžnými linuxovými službami. Všimněte si systemd restartuje mé služby bez mrknutí oka:

podman kill -a
55299bdfebea23db81f0277d45ccd967e891ab939ae3530dde155f550c18bda9
87a34fb86f854ccb86d9be46b5fe94f6e0e15322f5301e5e66c396195480047a
C8092df3249e5b01dc11fa4372a8204c120d91ab5425eb1577eb5f786c64a34b

Podívejte se na to! Restartované služby:

podman ps
CONTAINER ID  IMAGE                       COMMAND     CREATED       STATUS                     PORTS                   NAMES
33a8f9286cee  localhost/httpd-php:latest  /sbin/init  1 second ago  Up Less than a second ago  0.0.0.0:80->80/tcp      wordpress.crunchtools.com
37dd6d4393af  localhost/rt:4.4.4          /sbin/init  1 second ago  Up Less than a second ago  0.0.0.0:8081->8081/tcp  rt.fatherlinux.com
e4cc410680b1  localhost/httpd-php:latest  /sbin/init  1 second ago  Up Less than a second ago  0.0.0.0:8080->80/tcp    learn.fatherlinux.com

Tipy a triky

To je docela užitečné pro provádění změn v konfiguračním souboru. Můžeme jednoduše upravit konfigurační soubor na hostiteli kontejneru nebo použít něco jako Ansible a zabít všechny kontejnery pomocí podman kill -a příkaz. Protože používáme systemd , elegantně zvládne restartování služeb. To je velmi pohodlné.

Spuštění softwaru v kontejneru může být složité, zvláště když chcete, aby běžel pouze pro čtení. Omezujete proces způsoby, kterými nebyl nutně navržen. Zde je několik tipů a triků.

Nejprve je užitečné nainstalovat do vašich kontejnerů některé standardní nástroje. V této příručce jsme nainstalovali ip-utils a net-tools abychom mohli řešit problémy s našimi kontejnery. Například s Request Tracker jsem musel odstraňovat problémy s následujícím záznamem v /etc/aliases , který generuje vstupenky z e-mailů:

professional:         "|/opt/rt4/bin/rt-mailgate --queue 'Professional' --action correspond --url http://localhost:8081/"

Nástroje curl , ping a netstat všechny byly extrémně užitečné, protože používáme také externí DNS a Cloudflare.

Další na řadě je podman diff , který jsem hojně používal pro spouštění kontejnerů pouze pro čtení. Kontejner můžete spustit v režimu čtení i zápisu a neustále kontrolovat podman diff abyste viděli, jaké soubory se změnily. Zde je příklad:

podman diff learn.fatherlinux.com
C /var
C /var/spool
C /var/spool/cron
A /var/spool/cron/root
C /var/www
C /var/www/html
A /var/www/html/learn.fatherlinux.com
C /root
A /root/.backups

Přechod na Kubernetes

Všimněte si, že Podman nám řekne, které soubory se od spuštění kontejneru změnily. V tomto případě je každý soubor, o který se zajímáme, buď na tmpfs, nebo na připojeném připojení. To nám umožňuje spustit tento kontejner pouze pro čtení.

Tvrdý pohled na Kubernetes je přirozeným dalším krokem. Pomocí příkazu jako podman generate kube dostaneme část cesty tam, ale stále musíme zjistit, jak spravovat trvalé svazky a zálohy na těchto trvalých svazcích. Prozatím jsme se rozhodli, že Podman + systemd poskytuje pěkný základ. Veškerá práce, kterou jsme udělali s rozdělením kódu, konfigurace a dat, je nezbytná k tomu, abychom se dostali ke Kubernetes.

Poznámky k prostředí

Moje prostředí je jediný virtuální stroj běžící na Linode.com se 4 GB RAM, dvěma CPU a 80 GB úložiště. Byl jsem schopen nahrát svůj vlastní obrázek RHEL 8, který bude sloužit jako hostitel kontejneru. Kromě nastavení názvu hostitele a nasměrování DNS přes Cloudflare jsem opravdu nemusel provádět žádné další změny hostitele. Všechna důležitá data jsou v /srv , což by velmi usnadnilo jeho výměnu, pokud by selhal. Nakonec /srv adresář na hostiteli kontejneru je zcela zálohován.

Pokud máte zájem podívat se na konfigurační soubory a strukturu adresářů /srv , uložil jsem kód zde na můj GitHub.

Předsudky

Jako každý mám předsudky a myslím, že je fér je zveřejnit. Než jsem přišel do Red Hatu, sloužil jsem většinu své kariéry jako správce systému Linux. Mám zaujatost vůči Linuxu a konkrétně vůči Red Hat Enterprise Linux. Také inklinuji k automatizaci a psychologii toho, jak tento automat zpřístupnit běžným přispěvatelům.

Jednou z mých prvních frustrací jako správce systému byla práce v týmu s 1000 linuxovými webovými servery (vytvářející elektronické pohlednice na webu 1.0), kde byla dokumentace o tom, jak přispět k automatizaci, zcela neprůhledná a neměla zdokumentované žádné zdůvodnění, proč jsou věci tak, jak jsou. . Měli jsme skvělou automatizaci, ale nikdo nezvažoval psychologii, jak s ní seznámit nové lidi. Bylo to dřez-nebo-plav.

Tento blog si klade za cíl pomoci lidem překonat tento hrb a zároveň jej učinit téměř samodokumentací. Myslím, že je kriticky důležité vzít v úvahu lidské vstupy a výstupy robotů automatizace. Viz také:Dokumentace k bootstrappingu a zakořenění:Část 1

[ Bezplatný cheat:Slovník Kubernetes ] 

Závěr

Zdá se tak snadné přesunout běžnou službu, jako je WordPress, do kontejnerů, ale není tomu tak. Flexibilní a bezpečná architektura nastíněná v tomto článku umožňuje zkušeným administrátorům Linuxu nebo architektům přejít z běžného serveru LAMP na kontejnery vyhovující OCI. Tato příručka využila kontejnerový engine s názvem Podman a zároveň připravila vaše služby pro Kubernetes. Oddělení kódu, konfigurace a dat je nezbytným krokem pro přechod na Kubernetes. Všechno to začíná solidními, základními znalostmi Linuxu.

Některá rozhodnutí zdůrazněná v tomto článku záměrně zpochybňují různé mylné představy v komunitě kontejnerů – věci jako použití systemd v kontejneru nebo zaměření pouze na nejmenší základní obrázek, který můžete najít, aniž byste věnovali pozornost celému dodavatelskému řetězci softwaru. Použití konečného produktu je však jednoduché. Poskytuje pracovní postup velmi podobný tradičnímu serveru LAMP, který vyžaduje minimální kognitivní zátěž pro správce tradičních linuxových systémů.

Některá rozhodnutí o designu učiněná v tomto článku jsou kompromisní a nedokonalá. Přesto jsem je vytvořil, protože rozumím jak tlakům moderní kultury DevOps, tak psychologii operací a vývojových týmů. Chtěl jsem poskytnout flexibilitu pro získání větší hodnoty z kontejnerů. Tato sada služeb by měla být užitečná jako model pro migraci mnoha vašich vlastních služeb do kontejnerů. To zjednoduší jejich správu, upgrade a obnovu. Pomůže to nejen stávajícím správcům Linuxu, ale i budoucím kohortám, které tyto služby zdědí, včetně mé budoucí verze, která zapomene všechny podrobnosti. Tyto kontejnerové služby se v podstatě samy dokumentují ve stylu, který přispívá k úspěšné kultuře DevOps.

Tato série je založena na „Hacker's Guide to Moveing ​​Linux Services into Containers“ na CrunchTools.com a je znovu publikována se svolením.


Linux
  1. Jak spravovat registry kontejnerů Linux

  2. Jak se přihlásit do kontejneru Lxc?

  3. Jak SSH do kontejneru Docker

  1. Jak jsem zahodil svůj starý OS a skočil do Linuxu

  2. Jak mohu přesouvat soubory pomocí xargs v Linuxu?

  3. Jak přesunout oddíl v GNU/Linuxu?

  1. Jak přesunout soubor v Linuxu

  2. Jak přesunout MediaWiki do linuxového kontejneru

  3. Jak přesunout WordPress do linuxového kontejneru