Funksionet bazĂ« tĂ« LXD — sistemi i konteinerĂ«ve nĂ« Linux

Funksionet bazĂ« tĂ« LXD — sistemi i konteinerĂ«ve nĂ« Linux

LXD LXD është një menaxher modern i konteinerëve, kështu thotë burimi. Ai ofron një ndërfaqe përdoruesi që ngjan me makinat virtuale, por përdor në vend të tyre konteinerë Linux.

Nuk Ă«shtĂ« LXD — kjo Ă«shtĂ« njĂ« shĂ«rbim i privilegjuar (shĂ«rbimi i ekzekutuar me tĂ« drejtat root) qĂ« ofron njĂ« API REST nĂ«pĂ«rmjet njĂ« soketi lokal unix, si dhe pĂ«rmes rrjetit, nĂ«se Ă«shtĂ« instaluar konfigurimi pĂ«rkatĂ«s. KlientĂ«t, siç Ă«shtĂ« mjeti i linjĂ«s sĂ« komandave qĂ« vjen me LXD, dĂ«rgojnĂ« kĂ«rkesa pĂ«rmes kĂ«tij API REST. Kjo do tĂ« thotĂ« se pavarĂ«sisht nĂ«se jeni duke u lidhur me hostin lokal apo me njĂ« tĂ« largĂ«t, gjithçka funksionon nĂ« mĂ«nyrĂ« tĂ« njĂ«jtĂ«.

NĂ« kĂ«tĂ« artikull ne nuk do tĂ« ndalemi nĂ« konceptet e LXD, nuk do tĂ« shqyrtojmĂ« tĂ« gjitha mundĂ«sitĂ« e disponueshme tĂ« paraqitura nĂ« dokumentacion, pĂ«rfshirĂ« implementimin e fundit nĂ« versionet mĂ« tĂ« fundit tĂ« LXD qĂ« mbĂ«shtesin makinat virtuale QEMU paralelisht me konteinerĂ«t. NĂ« vend tĂ« kĂ«saj, ne do tĂ« mĂ«sojmĂ« vetĂ«m bazat e menaxhimin e konteinerĂ«ve — do tĂ« konfigurojmĂ« pishina ruajtjeje, rrjetin, do tĂ« nisim konteinerĂ«, do tĂ« aplikojmĂ« kufizime burimesh dhe gjithashtu do tĂ« shqyrtojmĂ« si tĂ« pĂ«rdorim snapshot-et, qĂ« tĂ« keni njĂ« pasqyrĂ« bazĂ« tĂ« LXD dhe tĂ« pĂ«rdorni konteinerĂ«t nĂ« Linux.

Për informacion të plotë, lutemi referohuni burimit zyrtar:

Navigim

Instalim LXD ^

Instalimi i LXD në shpërndarjet Ubuntu ^

Në shpërndarjen Ubuntu 19.10 paketa lxd ka një transicion në paketa snap:

apt search lxd

lxd/eoan 1:0.7 all
  Paketa e kalimit - lxd -> snap (lxd)

Kjo do të thotë se do të instalohen menjëherë dy paketa, një sistemor dhe tjetri si paketë snap. Instalimi i dy paketave në sistem mund të shkaktojë ndonjë problem, ku paketa sistemor mund të bëhet jetim, nëse hiqet paketa snap nga menaxheri i paketave snap.

Gjeni paketën lxd në repositorin snap me komandën e mëposhtme:

snap find lxd

Emri             Version        Përmbledhja
lxd              3.21           Menaxher i konteinerëve sistemor dhe API
lxd-demo-server  0+git.6d54658  Sesione demo të softuerit online duke përdorur LXD
nova             ocata          Shërbimi i llogaritjes OpenStack (nova)
nova-hypervisor  ocata          Shërbimi i llogaritjes OpenStack - Hypervizori KVM (nova)
distrobuilder    1.0            Ndërtesë imazhesh për LXC dhe LXD
fabrica          0.1            Ndërtoni snaps thjesht duke e drejtuar një formular në...
satellite        0.1.2          Platforma e avancuar e inteligjencës së kodit të hapur

Duke ekzekutuar komandën list mund të sigurohemi se paketa lxd ende nuk është instaluar:

snap list

Emri  Version    Rev   Ndjekja  Botuesi   Shënime
core  16-2.43.3  8689  stabile    canonical✓  core

Megjithëse LXD është një paketë snap, duhet ta instaloni atë përmes paketës sistemore lxd, e cila do të krijojë në sistem grupin përkatës, utilitetet e nevojshme në /usr/bin etj.

sudo apt update
sudo apt install lxd

Le të verifikojmë se paketa është instaluar si paketë snap:

snap list

Emri  Version    Rev    Ndjekja  Botuesi   Shënime
core  16-2.43.3  8689   stabile    canonical✓  core
lxd   3.21       13474  stabile/
  canonical✓  -

Instalimi i LXD në shpërndarjet Arch Linux ^

Për të instaluar paketën LXD në sistem është e nevojshme të ekzekutoni komandat e mëposhtme, e para do të aktualizojë listën e paketeve të disponueshme në repositor, e dyta do të instalohet paketën:

sudo pacman -Syyu && sudo pacman -S lxd

Pasi të instalohet paketa, për menaxhimin e LXD nga një përdorues i zakonshëm, është e nevojshme ta shtoni atë në grupin sistemor lxd:

sudo usermod -a -G lxd user1

Le të sigurohemi se përdoruesi user1 është shtuar në grupin lxd:

id -Gn user1

user1 adm dialout cdrom floppy sudo audio dip video plugdev netdev lxd

Nëse grupi lxd nuk shfaqet në listë, atëherë duhet aktivizuar përsëri sesioni i përdoruesit. Për këtë, duhet të dilni dhe të ftuoni sërish në sistem me këtë përdorues.

Aktivizoni në systemd ngarkimin e shërbimit LXD gjatë nisjes së sistemit:

sudo systemctl enable lxd

Nisni shërbimin:

sudo systemctl start lxd

Kontrolloni statusin e shërbimit:

sudo systemctl status lxd

Ruajtja LXD (Storage) ^

Para fillimit të inicializimit, duhet të kuptojmë se si është strukturuar logjikisht ruajtja në LXD.

Ruajtja (Storage) pĂ«rbĂ«het nga njĂ« ose mĂ« shumĂ« Storage Pool e cila pĂ«rdor njĂ« nga sistemet e skedarĂ«ve tĂ« mbĂ«shtetur si ZFS, BTRFS, LVM ose drejtime tĂ« zakonshme. Çdo Storage Pool ndarje ndahen nĂ« vĂ«llime (VĂ«llimi i Ruajtjes) qĂ« pĂ«rmbajnĂ« pamje, konteinerĂ« ose tĂ« dhĂ«na pĂ«r qĂ«llime tĂ« tjera.

  • Imazhet — janĂ« distribuime tĂ« veçanta tĂ« ndĂ«rtuara pa bĂ«rthamĂ«n Linux dhe tĂ« disponueshme nga burime tĂ« jashtme.
  • KontenierĂ«t — janĂ« shpĂ«rndarje tĂ« instaluara nga imazhe, tĂ« gatshme pĂ«r pĂ«rdorim.
  • Snapshotet — janĂ« pamje tĂ« gjendjes sĂ« kontejnerĂ«ve nga tĂ« cilat mund tĂ« riktheheni.

Funksionet bazĂ« tĂ« LXD — sistemi i konteinerĂ«ve nĂ« Linux

PĂ«r menaxhimin e ruajtjes nĂ« LXD pĂ«rdoret komandĂ« lxc storage pĂ«r ndihmĂ« tĂ« cilĂ«s mund tĂ« merrni duke ndarĂ« çelĂ«sin — lxc storage --help

Komanda e mëposhtme jep në ekran listën e të gjitha Storage Pool në ruajtjen LXD:

lxc storage list

+---------+-------------+--------+--------------------------------+---------+
|  NAME   | DESCRIPTION | DRIVER |             SOURCE             | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool |             | btrfs  | /dev/loop1                     | 2       |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool |             | btrfs  | /var/lib/lxd/disks/ssdpool.img | 4       |
+---------+-------------+--------+--------------------------------+---------+

Për të parë listën e të gjitha Vëllimi i Ruajtjes në Storage Pool përdoret komandë lxc storage volume list:

lxc storage volume list hddpool

+-------+----------------------------------+-------------+---------+
| TYPE  |          NAME                    | DESCRIPTION | USED BY |
+-------+----------------------------------+-------------+---------+
| image | ebd565585223487526ddb3607f515... |             | 1       |
+-------+----------------------------------+-------------+---------+

lxc storage volume list ssdpool

+-----------+----------------------------------+-------------+---------+
|   TYPE    |            NAME                  | DESCRIPTION | USED BY |
+-----------+----------------------------------+-------------+---------+
| container | alp3                             |             | 1       |
+-----------+----------------------------------+-------------+---------+
| container | jupyter                          |             | 1       |
+-----------+----------------------------------+-------------+---------+
| image     | ebd565585223487526ddb3607f515... |             | 1       |
+-----------+----------------------------------+-------------+---------+

Po ashtu, nëse për Storage Pool në krijim është zgjedhur sistemi i skedarëve BTRFS, atëherë për të marrë listën e Vëllimi i Ruajtjes ose subvolumes në interpretimin BTRFS mund të përdoren veglat e këtij sistemi skedarësh:

sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/hddpool

ID 257 gen 818 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3

sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/ssdpool

ID 257 gen 1820 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
ID 260 gen 1819 parent 5 top level 5 path containers/jupyter
ID 263 gen 1820 parent 5 top level 5 path containers/alp3

Inicijalizimi LXD ^

Para krijimit dhe përdorimit të konteinerëve, është e nevojshme të kryhet një inicim i përgjithshëm i LXD që krijon dhe konfiguron rrjetin, si dhe ruajtjen. Kjo mund të bëhet manualisht me komandat standarde të klientit të cilat janë të disponueshme në listën e thirrjes së komandës lxc --help ose me magjistrin e inicimit lxd init duke iu përgjigjur disa pyetjeve.

Zgjedhja e sistemit të dosjeve për Pishinën e Ruajtjes ^

Gjatë inicializimit, LXD bën disa pyetje, ndër të cilat do të përcaktojë llojin e sistemit të skedarëve për defoltin Storage Pool. Siç është caktuar, sistemi i skedarëve BTRFS zgjidhet për të. Ndryshimi në një sistemi të ndryshëm të skedarëve pas krijimit do të jetë i pamundur. Për të zgjedhur sistemin e skedarëve, ofrohet një tabelë krahasuese e mundësive:

Karakteristika
Directory
Btrfs
LVM
ZFS.
CEPH

Ruajtja e optimizuar e imazheve
jo
po
po
po
po

Krijimi i optimizuar i instanceve
jo
po
po
po
po

Krijimi i optimizuar i snapshot-it
jo
po
po
po
po

Transferi i optimizuar i imazheve
jo
po
jo
po
po

Transferi i optimizuar i instanceve
jo
po
jo
po
po

Kopja në shkrim
jo
po
po
po
po

Baze blloku
jo
jo
po
jo
po

Klonimi i menjëhershëm
jo
po
po
po
po

Drejtues i ruajtjes që mund të përdoret brenda një konteineri
po
po
jo
jo
jo

Rivendosja nga snapshot-e më të vjetra (nuk është më e fundit)
po
po
po
jo
po

Kotat e ruajtjes
po(*)
po
po
po
jo

Inicijalizimi i rrjetit dhe Pishinës së Ruajtjes nëpërmjet asistencës ^

Komanda e ardhshme që do të shqyrtojmë, ofron konfigurimin e komponentëve kryesorë të LXD përmes përgjigjeve ndaj pyetjeve të thjeshta me ndihmën e asistantit të inicializuar.

Ekzekutoni komandën lxc init dhe jepni përgjigjet për pyetjet pas pikës dyfishe, siç tregohet në shembullin më poshtë ose ndryshojini ato sipas kushteve tuaja:

lxd init

A dëshironi të përdorni klasterizimin LXD? (po/jo) [defolt=jo]: 
A dëshironi të konfiguroni një depo të re ruajtjeje? (po/jo) [defolt=po]: 
Emri i depozita të re të ruajtjes [defolt=default]: ssdpool         
Emri i prapavijës së ruajtjes për t'u përdorur (lvm, btrfs, dir) [defolt=btrfs]: 
Krijoni një depo të re BTRFS? (po/jo) [defolt=po]: 
A dëshironi të përdorni një pajisje blloku ekzistuese? (po/jo) [defolt=jo]: 
Madhësia në GB e pajisjes loop të re (minimumi 1GB) [defolt=15GB]: 10GB
A dëshironi të lidheni me një server MAAS? (po/jo) [defolt=jo]: 
A dëshironi të krijoni një urë të re locale? (po/jo) [defolt=po]: 
Si duhet të quhet ura e re? [defolt=lxdbr0]: 
Cila adresĂ« IPv4 duhet tĂ« pĂ«rdoret? (nĂ«nshkrimi CIDR, “auto” ose “none”) [defolt=auto]: 10.0.5.1/24
A dëshironi që LXD të NAT-ojë trafikun IPv4 në urën tuaj? [defolt=po]: 
Cila adresĂ« IPv6 duhet tĂ« pĂ«rdoret? (nĂ«nshkrimi CIDR, “auto” ose “none”) [defolt=auto]: None
A dëshironi që LXD të jetë në dispozicion përmes rrjetit? (po/jo) [defolt=jo]: 
A dëshironi që imazhet e plota të ruajtura të azhurnohen automatikisht? (po/jo) [defolt=po] Jo
A dëshironi që të printohet një YAML "lxd init" preseed? (po/jo) [defolt=jo]: 

Krijimi i një Pishine të Dytë të Ruajtjes ^

Në hapin e mëparshëm, ne krijuam Storage Pool të cilit i dhamë emrin ssdpool dhe skedari i tij ndodhet në sistemin tim në adresën /var/lib/lxd/disks/ssdpool.img. Kjo adresë e sistemit të skedarëve korrespondon me diskun fizik SSD në PC-në time.

Hapat e ardhshëm, për të zgjeruar kuptimin e asaj se çfarë roli luan Storage Pool në ruajtje, do të krijojmë një të dytë Storage Pool i cili do të ndodhet fizikisht në një lloj disku tjetër, në HDD. Problemi është se LXD nuk lejon krijimin e Storage Pool jashtë adresës /var/lib/lxd/disks/ dhe madje lidhjet simbolike nuk do të funksionojnë, shihni përgjigjen e zhvilluesit. Ne mund ta anashkalojmë këtë kufizim gjatë inicializimit/formatimit Storage Pool duke caktuar vlerën si një pajisje blloku në vend të një rruge në skedarin loopback, duke e caktuar këtë në çelësin source.

Pra, deri në krijim Storage Pool duhet të përcaktohet skedari loopback ose ndarja e ekzistueshme në sistemin tuaj të skedarëve që do të përdoret. Për këtë, ne do të krijojmë dhe përdorim një skedar të cilin do ta kufizojmë në 10GB:

dd if=\/dev\/zero of=\/mnt\/work\/lxd\/hddpool.img bs=1MB count=10000

10000+0 të dhëna në
10000+0 të dhëna jashtë
10000000000 bytes (10 GB, 9.3 GiB) të kopjuara, 38.4414 s, 260 MB\/s

Do të lidhim skedarin loopback në një pajisje loopback të lirë:

sudo losetup --find --show \/mnt\/work\/lxd\/hddpool.img

\/dev\/loop1

Falë çelësit --show ekzekutimi i komandës kthen në ekran emrin e pajisjes në të cilën u lidh skedari ynë loopback. Nëse është e nevojshme, mund të nxjerrim listën e të gjitha pajisjeve të zëna të këtij lloji, për t'u siguruar në saktësinë e veprimeve tona:

losetup -l

EMRI       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                      DIO LOG-SEC
\/dev\/loop1         0      0         0  0 \/mnt\/work\/lxd\/hddpool.img        0     512
\/dev\/loop0         0      0         1  0 \/var\/lib\/lxd\/disks\/ssdpool.img   0     512

Nga lista mund të zbulohet se në pajisjen /dev/loop1 është lidhur skedari loopback /mnt/work/lxd/hddpool.img, dhe në pajisjen /dev/loop0 është lidhur skedari loopback /var/lib/lxd/disks/ssdpool.img e cila i përket defoltit Storage Pool.

Komanda e ardhshme krijon një të re Storage Pool në LXD bazuar vetëm në skedarin loopback të sapo përgatitur. LXD do ta formatizojë skedarin loopback /mnt/work/lxd/hddpool.img në pajisjen /dev/loop1 në sistemin e skedarëve BTRFS:

lxc storage create hddpool btrfs size=10GB source=\/dev\/loop1

Do të nxjerrim listën e të gjitha Storage Pool në ekran:

lxc storage list

+---------+-------------+--------+--------------------------------+---------+
|  EMRI  | PËRSHKRIMI  | DRIVERA |              BURIM              | PËRDORUR NGA  |
+---------+-------------+--------+--------------------------------+---------+
| hddpool |             | btrfs  | \/dev\/loop1                     | 0       |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool |             | btrfs  | \/var\/lib\/lxd\/disks\/ssdpool.img | 0       |
+---------+-------------+--------+--------------------------------+---------+

Rritja e madhësisë së Pishinës së Ruajtjes ^

Pas krijimit Storage Pool, nëse është e nevojshme, mund të zgjatet. Për Storage Pool të bazuar në sistemin e skedarëve BTRFS kryeni komandat e mëposhtme:

sudo truncate -s +5G \/mnt\/work\/lxd\/hddpool.img
sudo losetup -c \/dev\/loop1
sudo btrfs filesystem resize max \/var\/lib\/lxd\/storage-pools\/hddpool

Automatizimi i vendosjes së skedarëve të loopback në slotin e pajisjes loopback ^

Kemi një problem të vogël, kur sistemi i host-it të ri ngarkohet, skedari /mnt/work/lxd/hddpool.img "do të "dalë" nga pajisja /dev/loop1 dhe shërbimi LXD do të bjerë gjatë ngarkesës, sepse nuk do ta shohë atë në këtë pajisje. Për të zgjidhur këtë problem, duhet të krijoni një shërbim sistemik që do ta fusë këtë skedar në pajisje /dev/loop1 gjatë ngarkesës së sistemit të host-it.

Do të krijojmë unit skedari i llojit shërbim në /etc/systemd/system/ për sistemin e inicializimit SystemD:

cat << EOF | sudo tee -a \/etc\/systemd\/system\/lxd-hddpool.service
[Unit]
Description=Losetup LXD Storage Pool (hddpool)
After=local-fs.target

[Service]
Type=oneshot
ExecStart=\/sbin\/losetup \/dev\/loop1 \/mnt\/work\/lxd\/hddpool.img
RemainAfterExit=true

[Install]
WantedBy=local-fs.target
EOF

Aktivizojmë shërbimin:

sudo systemctl enable lxd-hddpool

Krijuar lidhje pĂ«r /etc/systemd/system/local-fs.target.wants/lxd-hddpool.service → /etc/systemd/system/lxd-hddpool.service.

Pas rindizjes së sistemit pritës, kontrolloni statusin e shërbimit:

systemctl status lxd-hddpool.service 

● lxd-hddpool.service - Losetup LXD Storage Pool (hddpool)
     Ngarkuar: i ngarkuar (/etc/systemd/system/lxd-hddpool.service; i aktivizuar; vendosja e shitësit: e deaktivizuar)
     Aktiv: aktiv (dalë) që nga Mër 2020-04-08 03:43:53 MSK; 1min 37s më parë
    Procesi: 711 ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img (kod=dalë, statusi=0/SUKSESI)
   PID kryesor: 711 (kod=dalë, statusi=0/SUKSESI)

apr 08 03:43:52 manjaro systemd[1]: Duke nisur Losetup LXD Storage Pool (hddpool)...
apr 08 03:43:53 manjaro systemd[1]: Përfundoi Losetup LXD Storage Pool (hddpool).

Nga rezultati ne mund të sigurohemi se gjendja e shërbimit është aktiv, pavarësisht se ekzekutimi i skriptit tonë nga një komandë përfundoi, kjo na lejojti opsioni RemainAfterExit=true.

Siguria. Privileges of Containers ^

Duke marrë parasysh se të gjitha proceset e kontejnerit kryesisht ekzekutohen në izolim në sistemin pritës duke përdorur bërthamën e tij, për mbrojtje shtesë kundrejt qasjes së proceseve të kontejnerit në sistemin pritës, LXD ofron privilegjshmërinë e proceseve, ku:

  • KonteinerĂ«t e privilegjuar — janĂ« konteinerĂ« nĂ« tĂ« cilĂ«t proceset me UID dhe GID pĂ«rputhen me tĂ« njĂ«jtin pronar si nĂ« sistemin pritĂ«s. PĂ«r shembull, njĂ« proces i nisur nĂ« njĂ« konteiner me UID tĂ« barabartĂ« me 0 ka tĂ« njĂ«jtat tĂ« drejta qasje si njĂ« proces i sistemit pritĂ«s me UID tĂ« barabartĂ« me 0. Me fjalĂ« tĂ« tjera, pĂ«rdoruesi root nĂ« konteiner ka tĂ« gjitha tĂ« drejtat jo vetĂ«m nĂ« konteiner, por edhe nĂ« sistemin pritĂ«s nĂ«se ai arrin tĂ« dalĂ« jashtĂ« hapĂ«sirĂ«s izoluar tĂ« emrave tĂ« konteinerit.

  • KonteinerĂ«t e paprivilegjuar — janĂ« konteinerĂ« nĂ« tĂ« cilĂ«t proceset i pĂ«rkasin pronarit UID dhe GID me numra nga 0 nĂ« 65535, por pĂ«r sistemin pritĂ«s pronari maskohet duke pĂ«rdorur bitin e shtuar SubUID dhe SubGID pĂ«rkatĂ«s. PĂ«r shembull, njĂ« pĂ«rdorues me UID=0 nĂ« konteiner do tĂ« shfaqet nĂ« sistemin pritĂ«s si SubUID + UID. Kjo mbron sistemin pritĂ«s, pasi nĂ«se ndonjĂ« proces nĂ« konteiner arrin tĂ« dalĂ« nga hapĂ«sira e tij izoluar e emrave, ai mund tĂ« bashkĂ«punojĂ« me sistemin pritĂ«s vetĂ«m si njĂ« proces me njĂ« UID/GID tepĂ«r tĂ« lartĂ« dhe tĂ« panjohur.

Sipas parashikimeve, konteinerët e rinj të krijuar kanë statusin e paprivilegjuar dhe prandaj ne duhet të përcaktojmë SubUID dhe SubGID.

Do të krijojmë dy skedare konfigurimi në të cilat do të përcaktojmë maskën për SubUID dhe SubGID përkatësisht:

sudo touch /etc{/subuid,/subgid}
sudo usermod --add-subuids 1000000-1065535 root 
sudo usermod --add-subgids 1000000-1065535 root

Për të aplikuar ndryshimet, shërbimi LXD duhet të rindezit:

sudo systemctl restart lxd

Krijimi i një switch-i virtual të rrjetit ^

Duke qenë se ne e përgatitëm më parë rrjetin me ndihmën e magjistrit të fillimit lxd init dhe krijuam një pajisje rrjeti lxdbr0, në këtë seksion ne thjesht do të njihemi me rrjetin në LXD dhe me mënyrën se si të krijojmë një kalim virtual (bridge) duke përdorur komandën e klientit.

Diagrami në vazhdim shfaq se si kalimi (bridge) bashkon hostin dhe kontejnerët në një rrjet:

Funksionet bazĂ« tĂ« LXD — sistemi i konteinerĂ«ve nĂ« Linux

Kontejnerët mund të komunikojnë përmes rrjetit me kontejnerë të tjerë ose me hostin mbi të cilin këta kontejnerë shërbehen. Për këtë, është e nevojshme të lidhim kartat virtuale të rrjetit të kontejnerëve me kalimin virtual. Fillimisht do të krijojmë kalimin, ndërsa ndërfaqet rrjetë të kontejnerëve do të lidhen në kapitujt në vazhdim, pasi do të krijohet vetë kontejneri.

Komanda në vazhdim krijon një kalim me nënrrjetë 10.0.5.0/24 dhe adresë IPv4 10.0.5.1/24, si dhe aktivizon ipv4.nat në mënyrë që kontejnerët të mund të marrin internet përmes hostit me ndihmën e shërbimit NAT:

lxc network create lxdbr0 ipv4.address=10.0.5.1/24 ipv4.nat=true ipv6.address=none

Kontrollojmë listën e pajisjeve rrjetë që janë të disponueshme në LXD:

lxc network list

+--------+----------+---------+-------------+---------+
|  NAME  |   TYPE   | MANAGED | DESCRIPTION | USED BY |
+--------+----------+---------+-------------+---------+
| eno1   | physical | NO      |             | 0       |
+--------+----------+---------+-------------+---------+
| lxdbr0 | bridge   | YES     |             | 0       |
+--------+----------+---------+-------------+---------+

Po ashtu, mund tĂ« kontrolloni krijimin e pajisjes rrjetĂ« me ndihmĂ«n e mjetit standard tĂ« shpĂ«rndarjes Linux — ip link ose ip addr:

ip addr

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno1:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:ee:7b:5a:6b:44 brd ff:ff:ff:ff:ff:ff
    altname enp0s25
    inet6 fe80::9571:11f3:6e0c:c07b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: lxdbr0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether c2:38:90:df:cb:59 brd ff:ff:ff:ff:ff:ff
    inet 10.0.5.1/24 scope global lxdbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::c038:90ff:fedf:cb59/64 scope link 
       valid_lft forever preferred_lft forever
5: veth3ddab174@if4:  mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000
    link/ether ca:c3:5c:1d:22:26 brd ff:ff:ff:ff:ff:ff link-netnsid 0

Profil i konfigurimit ^

Çdo kontejner nĂ« LXD ka konfigurimin e tij tĂ« vet dhe mund ta zgjasĂ« atĂ« me konfigurimin e shpallur globalisht qĂ« quhet konfiguracione profile. Zbatja e profileve tĂ« konfiguracionit nĂ« kontejner ka njĂ« model kaskad, shembulli i mĂ«poshtĂ«m e tregon kĂ«tĂ«:

Funksionet bazĂ« tĂ« LXD — sistemi i konteinerĂ«ve nĂ« Linux

Në këtë shembull, tre profile janë krijuar në sistemin LXD: default, hddpool dhe hostfs. Të tri profilet janë aplikuar në një kontejner që ka një konfiguracion lokal (zona gri). Profili default ka një pajisje root me parametrin pool është ssdpool, por për shkak të modelit kaskad të zbatimit të konfiguracionit ne mund të aplikojmë për kontejnerin profilin hddpool me parametrin pool do të mbulojë këtë parametrin nga profili default dhe kontejneri do të marrë konfigurimin e pajisjes root me parametrin pool të barabartë me hddpool, ndërsa profili hostfs thjesht shton një pajisje të re në kontejner.

Për të parë listën e profileve të disponueshme të konfiguracionit shërben komandën e mëposhtme:

lxc profile list

+---------+---------+
|  EMRI  | PËRDOR NGA |
+---------+---------+
| default | 1       |
+---------+---------+
| hddroot | 0       |
+---------+---------+
| ssdroot | 1       |
+---------+---------+

Lista e plotë e komandave të disponueshme për punën me profilin mund të merret duke shtuar çelësin --help:

lxc profile --help

Përshkrimi:
  Menaxho profile

Përdorimi:
  lxc profile [komandë]

Komandat e Disponueshme:
  add         Shto profile në instanca
  assign      Cakto grupe profile në instanca
  copy        Kopjo profile
  create      Krijo profile
  delete      Fshi profile
  device      Menaxho pajisjet e instancës
  edit        Redakto konfigurimet e profileve si YAML
  get         Merr vlera për çelësat e konfiguracionit të profileve
  list        Lista e profileve
  remove      Hiqi profile nga instancat
  rename      Rine emërto profile
  set         Cakto çelësat e konfigurimit të profileve
  show        Trego konfigurimet e profileve
  unset       Hiqi çelësat e konfigurimit të profileve

Redaktimi i profilit ^

Profili i konfiguracionit të paracaktuar default nuk ka konfigurim të kartës rrjedhës për kontejnerin dhe të gjithë kontejnerët e sapokrijuar nuk kanë rrjet, për ta duhen krijuar pajisje të rrjetit lokale (të dedikuara) me një komandë të veçantë, por ne mund të krijojmë në profilin e konfiguracionit një pajisje rrjeti globale që do të ndahen midis të gjithë kontejnerëve që përdorin këtë profil. Në këtë mënyrë, menjëherë pas komandës për krijimin e një kontejneri të ri, ata do të kenë rrjet me akses në internet. Në të njëjtën kohë, nuk ka kufizime, ne gjithmonë mund të krijojmë më vonë një pajisje rrjeti lokale nëse ka nevojë.

Komanda e mëposhtme do të shtojë në profilin e konfiguracionit pajisjen eth0 të tipit nic të lidhur me rrjetin lxdbr0:

lxc profile device add default eth0 nic network=lxdbr0 name=eth0

Ë rĂ«ndĂ«sishme tĂ« theksohet se pasi e shtuam me tĂ« vĂ«rtetĂ« pajisjen nĂ« profilin e konfigurimit, nĂ«se do tĂ« kishim caktuar njĂ« adresĂ« IP statike nĂ« pajisje, tĂ« gjitha kontejnerĂ«t qĂ« do tĂ« aplikonin kĂ«tĂ« profil do tĂ« ndanin tĂ« njĂ«jtĂ«n adresĂ« IP. NĂ«se ka nevojĂ« pĂ«r tĂ« krijuar njĂ« kontejner me njĂ« adresĂ« IP statike tĂ« dedikuar, atĂ«herĂ« duhet tĂ« krijoni njĂ« konfigurim tĂ« pajisjes rrjetit nĂ« nivelin e kontejnerit (konfigurim lokal) me parametrin e adresĂ«s IP, e jo nĂ« nivelin e profilit.

Le të kontrollojmë profilin:

lxc profile show default

config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: \/
    pool: ssdpool
    type: disk
name: default
used_by: []

Në këtë profil mund të shohim se për të gjitha kontejnerët e sapo krijuar do të krijohen dy pajisje (devices):

  • eth0 — Pajisja e tipit nic e lidhur me switch-in (urĂ«n rrjetĂ«sore) lxdbr0
  • root — Pajisja e tipit disk qĂ« pĂ«rdor rezervuarin e ruajtjes ssdpool

Krijimi i profileve të reja ^

PĂ«r tĂ« pĂ«rdorur ato tĂ« krijuara mĂ« parĂ« Storage Pool kontejnerĂ«, do tĂ« krijojmĂ« njĂ« profil konfigurimi ssdroot ku do tĂ« shtojmĂ« pajisjen e tipit disk me pikĂ«n e montimit / (root) qĂ« pĂ«rdor rezervuarin e krijuar mĂ« parĂ« Storage Pool — ssdpool:

lxc profile create ssdroot
lxc profile device add ssdroot root disk path=\/ pool=ssdpool

NĂ« mĂ«nyrĂ« tĂ« ngjashme, krijojmĂ« pajisjen e tipit disk, por nĂ« kĂ«tĂ« rast pĂ«rdor Storage Pool — hddpool:

lxc profile create hddroot
lxc profile device add hddroot root disk path=\/ pool=hddpool

Kontrollojmë profilin e konfigurimit:

lxc profile show ssdroot

config: {}
description: ""
devices:
  root:
    path: \/
    pool: ssdpool
    type: disk
name: ssdroot
used_by: []

lxc profile show hddroot

config: {}
description: ""
devices:
  root:
    path: \/
    pool: hddpool
    type: disk
name: hddroot
used_by: []

Repository e imazheve ^

Kontejnerët krijohen nga imazhe që janë distribucione të ndërtuara posaçërisht pa bërthamën e Linux-it. Prandaj, përpara se të niset kontejneri, ai duhet të jetë dislokuar nga ky imazh. Burimi i imazheve është një depo lokale ku imazhet ngarkohen nga depo të jashtme.

Repository të largëta të imazheve ^

Për default, LXD është konfiguruar për të marrë imazhe nga tre burime të largëta:

  • ubuntu: (pĂ«r imazhe stabile tĂ« Ubuntu)
  • ubuntu-daily: (pĂ«r imazhe tĂ« pĂ«rditshme tĂ« Ubuntu)
  • images: (pĂ«r njĂ« grup distrosh tĂ« tjera)

lxc remote list

+-----------------+------------------------------------------+--------+--------+
|      NAME       |                   URL                    | PUBLIC | STATIC |
+-----------------+------------------------------------------+--------+--------+
| images          | https://images.linuxcontainers.org       | YES    | NO     |
+-----------------+------------------------------------------+--------+--------+
| local (default) | unix://                                  | NO     | YES    |
+-----------------+------------------------------------------+--------+--------+
| ubuntu          | https://cloud-images.ubuntu.com/releases | YES    | YES    |
+-----------------+------------------------------------------+--------+--------+
| ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | YES    | YES    |
+-----------------+------------------------------------------+--------+--------+

Për shembull, repozitori ubuntu: ka imazhe të mëposhtme:

lxc image -c dasut list ubuntu: | head -n 11

+----------------------------------------------+--------------+----------+------------+
|                   PËRSHKRIM           | ARKITEKTURA |   MASA   |   LLOJI    |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150728)  | x86_64       | 153.72MB | KONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150819)  | x86_64       | 152.91MB | KONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150906)  | x86_64       | 154.69MB | KONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150930)  | x86_64       | 153.86MB | KONTAINER  |
+----------------------------------------------+--------------+----------+------------+

Për të nxjerrë një numër të kufizuar kolonash, përdorëm opsionin -c me parametrat dasut, gjithashtu kufizuam gjatësi e listës me komandën head.

Për të nxjerrë listën e imazheve, është e disponueshme filtrimi. Komanda e mëposhtme do të nxjerrë listën e të gjitha arkitekturave të sistemit operativ AlpineLinux:

lxc image -c ldast list images:alpine/3.11

+------------------------------+--------------------------------------+--------------+
|            ALIAS             |             PËRSHKRIM              | ARKITEKTURA |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11 (3 më shumë)        | Alpine 3.11 amd64 (20200220_13:00)   | x86_64       |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/arm64 (1 më shumë)   | Alpine 3.11 arm64 (20200220_13:00)   | aarch64      |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/armhf (1 më shumë)   | Alpine 3.11 armhf (20200220_13:00)   | armv7l       |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/i386 (1 më shumë)    | Alpine 3.11 i386 (20200220_13:01)    | i686         |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/ppc64el (1 më shumë) | Alpine 3.11 ppc64el (20200220_13:00) | ppc64le      |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/s390x (1 më shumë)   | Alpine 3.11 s390x (20200220_13:00)   | s390x        |
+------------------------------+--------------------------------------+--------------+

Repository lokale të imazheve ^

PĂ«r tĂ« filluar pĂ«rdorimin e kontejnerit, duhet tĂ« shtoni njĂ« imazh nga depoja globale nĂ« atĂ« lokale. lokal:. Tani depoja lokale Ă«shtĂ« bosh, ashtu si na tregon komanda lxc image list. NĂ«se metoda list nuk specifikon depo, atĂ«herĂ« do tĂ« pĂ«rdoret depoja lokale si parazgjedhje — lokal:

lxc image list local:

+-------+-------------+--------+-------------+--------------+------+------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE |
+-------+-------------+--------+-------------+--------------+------+------+

Menaxhimi i imazheve në depo bëhet përmes metodave të mëposhtme:

Ekipa
Përshkrimi

lxc image alias
Menaxho aliaset e imazheve

lxc image copy
Kopjo imazhe midis serverave

lxc image fshij
Fshi imazhe

lxc image edit
Redakto pronat e imazheve

lxc image export
Eksporto dhe shkarko imazhe

lxc image import
Importo imazhe në magazinën e imazheve

lxc image info
Trego informacion të dobishëm mbi imazhet

lxc image list
Listo imazhet

lxc image refresh
Rifresko imazhet

lxc image trego
Trego pronat e imazhit

Kopjojmë imazhin në depojen lokale nga ajo globale images::

lxc image copy images:alpine/3.11/amd64 local: --alias=alpine3

Imazhi u kopjua me sukses!

Të nxjerrim një listë të të gjitha imazheve që janë tani të disponueshme në depojen lokale lokal::

lxc image -c lfdatsu list local:

+---------+--------------+------------------------------------+--------------+
|  ALIAS  | FINGERPRINT  |            DESCRIPTION             | ARCHITECTURE |
+---------+--------------+------------------------------------+--------------+
| alpine3 | 73a3093d4a5c | Alpine 3.11 amd64 (20200220_13:00) | x86_64       |
+---------+--------------+------------------------------------+--------------+

Konfigurimi i LXD ^

Përveç modit interaktiv, LXD gjithashtu mbështet modin jo-interaktiv të konfigurimit, ku konfigurimi caktohet në formën e një skedari YAML, një format të veçantë që lejon ngritjen e gjithë konfigurimit njëherësh, duke shmangur ekzekutimin e shumë komande interaktive që u diskutuan më sipër në këtë artikull, përfshirë konfigurimin e rrjetit, krijimin e profileve të konfigurimit, etj. Këtu ne nuk do ta shqyrtojmë këtë fushë, mund ta studiosh vetë në dokumentacionin.

Komanda interaktive e ardhshme lxc config e cila ne do ta shqyrtojmë, lejon të vendosni konfigurimin. Për shembull, për të siguruar që imazhet e shkarkuara në depo lokale të mos përditësohen automatikisht nga depo të përgjithshme, mund ta aktivizojmë këtë sjellje me komandën e mëposhtme:

lxc config set images.auto_update_cached=false

Krijimi dhe menaxhimi i konteinerëve ^

Për krijimin e një kontejneri shërben komanda lxc init ku kalohen vlerat depo:imazh dhe më pas identifikuesi i dëshiruar për kontejnerin. Depoja mund të tregohet si lokale. lokal: as well as any global one. If the repository is not specified, the local repository is used by default to search for the image. If the image is specified from a global repository, it will first be downloaded to the local repository and then used to create the container.

Let's execute the following command to create our first container:

lxc init alpine3 alp --storage=hddpool --profile=default --profile=hddroot

Let's break down the command keys we are using here:

  • alpine3 — Specifies the alias for the image which was previously downloaded to the local repository. If an alias was not created for this image, it is always possible to refer to the image by its Fingerprint which is displayed in the table.
  • alp — Sets the identifier for the container
  • --storage — This key indicates in which Storage Pool the container will be created
  • --profile — These keys cascade the configuration from previously created configuration profiles to the container

We start the container, which begins to launch the init system of the distribution:

lxc start alp

Also, you can use the command lxc launch which allows combining the commands lxc init dhe lxc start into one operation.

We check the container's status:

lxc list -c ns46tb
+------+---------+------------------+------+-----------+--------------+
| NAME |  STATE  |       IPV4       | IPV6 |   TYPE    | STORAGE POOL |
+------+---------+------------------+------+-----------+--------------+
| alp  | RUNNING | 10.0.5.46 (eth0) |      | CONTAINER | hddpool      |
+------+---------+------------------+------+-----------+--------------+

We check the container's configuration:

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: vethb1fe71d8
  volatile.eth0.hwaddr: 00:16:3e:5f:73:3e
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  root:
    path: \/
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

NĂ« seksionin profiles we can ensure that this container uses two configuration profiles — default dhe hddroot. NĂ« seksionin devices we can find only one device, as the network device was created at the profile level default. PĂ«r tĂ« parĂ« tĂ« gjitha pajisjet e pĂ«rdorura nga kontejneri, duhet tĂ« shtoni çelĂ«sin --expanded:

lxc config show alp --expanded

arkitektura: x86_64
konfigurimi:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: vethb1fe71d8
  volatile.eth0.hwaddr: 00:16:3e:5f:73:3e
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
pajisjet:
  eth0:
    emri: eth0
    rrjeti: lxdbr0
    tipi: nic
  rrënjë:
    rruga: / 
    pool: hddpool
    tipi: disk
ephemeral: false
profilet:
- default
- hddroot
stateful: false
përshkrimi: ""

Vendosja e një adrese IP statike ^

Nëse përpiqemi të vendosim një adresë IP për pajisjen rrjetë eth0 nëpërmjet komandës. lxc config device set alp të dedikuar për konfigurimin e kontejnerit, ne do të marrim një gabim që do të njoftojë se pajisja nuk ekziston sepse pajisja eth0 e cila përdoret nga kontejneri i përket profilit default:

lxc config device set alp eth0 ipv4.address 10.0.5.5

Gabim: Pajisja nuk ekziston

Natyrisht, mund të vendosim një adresë IP statike për eth0 pajisjen në profil, por ajo do të jetë e njëjtë për të gjithë kontejnerët që do ta përdorin këtë profil. Prandaj, do të shtojmë një pajisje të dedikuar për kontejnerin:

lxc config device add alp eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5

Pastaj duhet të rindezim kontejnerin:

lxc restart alp

Nëse tani shohim konfigurimin e kontejnerit, nuk na nevojitet të zbatojmë opsionin --expanded për të parë pajisjen rrjetë eth0, pasi e kemi krijuar atë në nivelin e kontejnerit dhe ajo ka mbuluar kaskadë këtë pajisje nga profili default:

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: veth2a1dc59d
  volatile.eth0.hwaddr: 00:16:3e:0e:e2:71
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  eth0:
    ipv4.address: 10.0.5.5
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
  root:
    path: \/
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

TĂ« heqim konteinerin ^

Për të fshirë kontenierin përdoret komanda lxc delete, por përpara se të fshihet konteneri, ai duhet të ndalet me komandën lxc stop:

lxc stop alp

lxc list

+------+---------+-------------------+------+-----------+-----------+
| NAME |  STATE  |       IPV4        | IPV6 |   TYPE    | SNAPSHOTS |
+------+---------+-------------------+------+-----------+-----------+
| alp  | STOPPED | 10.0.5.10 (eth0)  |      | CONTAINER | 0         |
+------+---------+-------------------+------+-----------+-----------+

Pas sigurimit që gjendja e kontenierit është STOPPED, ai mund të fshihet nga Storage Pool:

lxc delete alp

Qasja në konteiner ^

Për të ekzekutuar komandat në kontenier, direkt, duke anashkaluar lidhjet rrjet, përdoret komanda lxc exec e cila ekzekuton komandat në kontenier pa nisur shell-in sistemor. Nëse ju nevojitet të ekzekutoni një komandë në shell, duke përdorur modelet e shell-it, si variablat, redirektimet e skedarëve (pipe) etj., atëherë duhet të nisni qartë shell-in dhe të kaloni komandën si argument, për shembull:

lxc exec alp -- \/bin\/sh -c "echo $HOME"

Në komandë u përdor simboli i veçantë i mbrojtjes për simbolin e veçantë $ që variabla $HOME të mos interpretohej në makinë pritëse, por të interpretohej vetëm brenda kontenierit.

Po ashtu, është e mundur të nisni një mod të ndërveprimit në shell, dhe pas përfundimit të seancës të përfundoni duke përdorur çelsin CTRL+D:

lxc exec alp -- \/bin\/sh

Menaxhimi i burimeve të konteinerit ^

Në LXD mund të menaxhoni burimet e kontenierit me ndihmën e një grupi të veçantë konfigurimi. Lista e plotë e parametrave të konfigurimit të kontenierit mund të gjendet dokumentacionin.

Kufizimi i burimeve RAM (Memoria) ^

Parametri limits.memory kufizon sasinë e RAM që është e disponueshme për kontenerin. Si vlerë jepet një numër dhe një nga sufikset e disponueshme.

Le të caktojmë një kufizim për sasinë e RAM për kontenierin prej 256 MB:

lxc config set alp limits.memory 256MB

Po ashtu, ekzistojnë parametra të tjerë për kufizimin e memories:

  • limits.memory.enforce
  • limits.memory.hugepages
  • limits.memory.swap
  • limits.memory.swap.priority

Ekipa lxc config show lejon të shfaqësh të gjithë konfigurimin e konteinerit, përfshirë kufizimin e burimeve që është vendosur:

lxc config show alp

arkitektura: x86_64
konfigurimi:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200220_13:00)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200220_13:00"
  image.type: squashfs
  limits.memory: 256MB
  volatile.base_image: 73a3093d4a5ce0148fd84b95369b3fbecd19a537ddfd2e2d20caa2eef0e8fd60
  volatile.eth0.host_name: veth75b6df07
  volatile.eth0.hwaddr: 00:16:3e:a1:e7:46
  volatile.idmap.base: "0"
  volatile.idmap.current: '[]'
  volatile.idmap.next: '[]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

Kufizimi i burimeve CPU (Procesori) ^

Për kufizimin e burimeve të CPU ka disa lloje kufizimesh:

  • limit.cpu — lidh konteinerin me njĂ« ose disa bĂ«rthamĂ« tĂ« CPU
  • limits.cpu.allowance — menaxhon ose kuotat e planifikuesit CFS, kur kalon kufiri nĂ« kohĂ«, ose mekanizmin universl tĂ« ndarjes sĂ« burimeve CPU, kur kalon vlera nĂ« pĂ«rqindje
  • limits.cpu.priority — prioriteti i planifikuesit, kur pĂ«r disa instanca qĂ« ndajnĂ« njĂ« grup procesorĂ«sh, caktohet njĂ« pĂ«rqindje e njĂ«jtĂ« procesorĂ«sh

lxc config set alp limits.cpu.allowance 40%

lxc config show alp

arkitektura: x86_64
konfigurimi:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200220_13:00)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200220_13:00"
  image.type: squashfs
  limits.cpu.allowance: 40%
  limits.memory: 256MB
  volatile.base_image: 73a3093d4a5ce0148fd84b95369b3fbecd19a537ddfd2e2d20caa2eef0e8fd60
  volatile.eth0.host_name: veth75b6df07
  volatile.eth0.hwaddr: 00:16:3e:a1:e7:46
  volatile.idmap.base: "0"
  volatile.idmap.current: '[]'
  volatile.idmap.next: '[]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

Kufizimi i hapësirës në disk ^

Përveç kufizimeve si limits.read, limits.write mund të kufizojmë gjithashtu sasinë e hapësirës së diskut që përdor konteneri (punon vetëm me ZFS ose BTRFS):

lxc config device set alp root size=2GB

Pas vendosjes, në parametrin devices.root.size mund të sigurohemi për kufizimin e vendosur:

lxc config show alp
...
devices:
  root:
    path: \/
    pool: hddpool
    size: 2GB
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

Për të parë kuotat e përdorura në disk mund të marrim nga komanda lxc info:

lxc info alp
...
Burimet:
  Processes: 5
  Përdorimi i diskut:
    root: 1.05GB
  Përdorimi i CPU:
    Përdorimi i CPU (në sekonda): 1
  Përdorimi i memories:
    Memory (aktual): 5.46MB
  Përdorimi i rrjetit:
    eth0:
      Bytes e marra: 802B
      Bytes e dërguara: 1.59kB
      Paketa e marra: 4
      Paketa e dërguara: 14
    lo:
      Bytes e marra: 0B
      Bytes e dërguara: 0B
      Paketa e marra: 0
      Paketa e dërguara: 0

Megjithëse ne kemi vendosur një kufi për pajisjen rrënjësore të kontejnerit në 2GB, utilitat sistemore si df nuk do ta shohin këtë kufi. Për këtë, do të bëjmë një test të vogël dhe do të kuptojmë se si funksionon.

Do të krijojmë 2 kontejnerë të rinj të njëjtë në të njëjtin Storage Pool (hddpool):

lxc init alpine3 alp1 --storage=hddpool --profile=default --profile=hddroot
lxc init alpine3 alp2 --storage=hddpool --profile=default --profile=hddroot

lxc list
+------+---------+------------------+------+-----------+-----------+
| NAME |  STATE  |       IPV4       | IPV6 |   TYPE    | SNAPSHOTS |
+------+---------+------------------+------+-----------+-----------+
| alp1 | RUNNING | 10.0.5.46 (eth0) |      | CONTAINER | 0         |
+------+---------+------------------+------+-----------+-----------+
| alp2 | RUNNING | 10.0.5.30 (eth0) |      | CONTAINER | 0         |
+------+---------+------------------+------+-----------+-----------+

Në një nga kontejnerët do të krijojmë një skedar me madhësi 1GB:

lxc exec alp1 -- dd if=\/dev\/urandom of=file.img bs=1M count=1000

Le të sigurohemi që skedari është krijuar:

lxc exec alp1 -- ls -lh
total 1000M  
-rw-r--r--    1 root     root     1000.0M Mar 27 10:16 file.img

Nëse shohim në kontejnerin e dytë, duke kontrolluar ekzistencën e skedarit në të njëjtin vend, skedari nuk do të jetë atje, gjë që është e pritshme, pasi kontejnerët krijohen në të tyre Vëllimi i Ruajtjes në të njëjtin Storage Pool:

lxc exec alp2 -- ls -lh
total 0

Por le të krahasojmë vlerat që jep df në të dy kontejnerët:

lxc exec alp1 -- df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
\/dev\/loop1           btrfs           9.3G   1016.4M      7.8G  11% \/
...

lxc exec alp2 -- df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
\/dev\/loop1           btrfs           9.3G   1016.4M      7.8G  11% \/
...

Pajisja /dev/loop1 i montuar si ndarje rrënjësor është Storage Pool i cili përdoret nga këta kontejnerë, prandaj ata e ndajnë hapësirën e tij në dy.

Statistika e konsumit të burimeve ^

Për të parë statistikën e përdorimit të burimeve për kontejnerin, mund të përdorni këtë komandë:

lxc info alp

Name: alp
Location: none
Remote: unix:\/\/
Architecture: x86_64
Created: 2020\/04\/08 18:05 UTC
Status: Running
Type: container
Profiles: default, hddroot
Pid: 19219
Ips:
  eth0: inet    10.0.5.5        veth2a1dc59d
  eth0: inet6   fe80::216:3eff:fe0e:e271        veth2a1dc59d
  lo:   inet    127.0.0.1
  lo:   inet6   ::1
Resources:
  Processes: 5
  Disk usage:
    root: 495.62kB
  CPU usage:
    CPU usage (in seconds): 1
  Memory usage:
    Memory (current): 4.79MB
  Network usage:
    eth0:
      Bytes received: 730B
      Bytes sent: 1.59kB
      Packets received: 3
      Packets sent: 14
    lo:
      Bytes received: 0B
      Bytes sent: 0B
      Packets received: 0
      Packets sent: 0

Puna me snapshot-et ^

Në LXD ka mundësi për të krijuar snapshot-e dhe për të rikthyer nga ato gjendjen e kontejnerit.

Për të krijuar një snapshot, ekzekutoni komandën e mëposhtme:

lxc snapshot alp snapshot1

Komanda lxc snapshot nuk ka një opsion list, prandaj, për të parë listën e snapshot-eve, duhet të përdorni komandën që tregon informacion të përgjithshëm mbi kontejnerin:

lxc info alp
...
...
Snapshots:
  snapshot1 (e bërë më 2020/04/08 18:18 UTC) (pa status)

Rivendosni kontejnerin nga snapshot me komandën lxc restore duke specifikuar kontejnerin për të cilin do të kryhet rivendosja dhe pseudonimin e snapshot-it:

lxc restore alp snapshot1

Komanda e mëposhtme shërben për të fshirë snapshot-in. Vëreni se sintaksa e komandës nuk është si të gjitha të tjerat, këtu duhet të përcaktoni një slash të drejtpërdrejtë pas emrit të kontejnerit. Në rast se slashi nuk poshtërohet, komanda për fshirjen e snapshot-it interpretohet si një komandë për fshirjen e kontejnerit!

lxc delete alp/snapshot1

NĂ« shembullin e mĂ«sipĂ«rm shqyrtuam tĂ« ashtuquajturat snapshot-e pa status. NĂ« LXD ka edhe njĂ« lloj tjetĂ«r snapshot-i — stateful, nĂ« tĂ« cilat ruhet gjendja e tanishme e tĂ« gjitha proceseve nĂ« kontejner. Me snapshotĂ«t stateful lidhen njĂ« sĂ«rĂ« funksionesh interesante dhe tĂ« dobishme.

ÇfarĂ« tjetĂ«r? ^

  • PĂ«r zhvilluesit e Python Ă«shtĂ« nĂ« dispozicion moduli PyLXD i cili ofron API pĂ«r LXD

UPDATE 10.04.2020 15:00: Shtova navigimin

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster