Funksionalitetet e bazës LXD - sistemet e kontejnerëve në Linux

Funksionalitetet e bazës LXD - sistemet e kontejnerëve në Linux

LXD — Ă«shtĂ« njĂ« menaxher i sistemit tĂ« konteinerĂ«ve tĂ« brezit tĂ« ardhshĂ«m, thotĂ« burimi. Ai ofron njĂ« ndĂ«rfaqe pĂ«rdoruesi qĂ« i ngjan makinave virtuale, por nĂ« vend tĂ« kĂ«saj pĂ«rdor konteinerĂ« Linux.

Nukleusi LXD — Ă«shtĂ« njĂ« demon privilegjuar (shĂ«rbim i nisur me tĂ« drejtat root), i cili ofron njĂ« API REST pĂ«rmes njĂ« soketi unix lokal, si dhe pĂ«rmes rrjetit, nĂ«se konfigurimi pĂ«rkatĂ«s Ă«shtĂ« i instaluar. KlientĂ«t, si vegla e komandĂ«s e ofruar me LXD, dĂ«rgojnĂ« kĂ«rkesa pĂ«rmes kĂ«tij API REST. Kjo do tĂ« thotĂ« se pavarĂ«sisht nĂ«se po i drejtoheni hostit lokal ose njĂ« tĂ« largĂ«t, gjithçka funksionon njĂ«soj.

Në këtë artikull nuk do të ndalemi në mënyrë të detajuar mbi konceptet e LXD, dhe nuk do të shqyrtojmë të gjitha mundësitë e disponueshme të shpjeguara në dokumentacion, përfshirë implementimin e fundit në versionet e fundit të LXD me mbështetje për makinat virtuale QEMU paralelisht me kontejnerët. Në vend të kësaj, do të mësojmë vetëm bazat e menaxhimit të kontejnerëve - do të konfigurojmë pulat e ruajtjes, rrjetin, do të nisnim një kontejner, do të aplikojmë kufizime të burimeve dhe gjithashtu do të shqyrtojmë se si të përdorim snapshot-et, në mënyrë që të keni një kuptim të përgjithshëm mbi LXD dhe të përdorni kontejnerët në Linux.

Për informacion të plotë, duhet të referoheni në burimin zyrtar:

Navigimi

Instalimi i LXD ^

Instalimi i LXD në distribucionet Ubuntu ^

Në distribucionin Ubuntu 19.10, paketa lxd ka përkthim në paketën snap:

apt search lxd

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

Kjo do të thotë se do të instalohen menjëherë dy paketa, një sistemik dhe një tjetër si paketë snap. Instalimi i dy paketimeve në sistem mund të krijojë një problem të caktuar, ku paketa sistemike mund të bëhet jetim, nëse fshihet paketa snap nga menaxheri i paketimeve snap.

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

snap gjej lxd

Emri             Version        Përmbledhje
lxd              3.21           Menaxher i kontejnerëve dhe API
lxd-demo-server  0+git.6d54658  Sesionet e demonstrimit të softuerit në internet duke përdorur LXD
nova             ocata          Shërbimi i Llogaritjes OpenStack (nova)
nova-hypervisor  ocata          Shërbimi i Llogaritjes OpenStack - Hypervisor KVM (nova)
distrobuilder    1.0            Ndërtues i imazheve për LXC dhe LXD
fabrica          0.1            Ndërtoni snaps duke drejtuar thjesht një formular në...
satellite        0.1.2          Platformë e avancuar të inteligjencës me burim të hapur

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

snap lista

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

Megjithëse LXD është një paketë snap, instaluar duhet përmes paketës sistemike 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

Të sigurohemi që paketa është instaluar si paketë snap:

snap lista

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ë distribucionet Arch Linux ^

Për të instaluar paketën LXD në sistem, duhet të ekzekutoni komandat e mëposhtme, e para refreshon listën e paketimeve në sistem të disponueshme në repository, e dyta instalon paketën:

sudo pacman -Syyu && sudo pacman -S lxd

Pas instalimit të paketës, për menaxhimin e LXD nga përdorues të zakonshëm, duhet ta shtoni në grupin sistemik lxd:

sudo usermod -a -G lxd user1

Të sigurohemi që 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 është i dukshëm në listë, atëherë duhet të aktivizoni sesionin e përdoruesit përsëri. Për këtë, duhen dalë dhe të futen sërish në sistem me të njëjtin përdorues.

Aktivizojmë në systemd ngarkimin e shërbimit LXD në fillim të sistemit:

sudo systemctl enable lxd

Nisim shërbimin:

sudo systemctl start lxd

Kontrollojmë statusin e shërbimit:

sudo systemctl status lxd

Storage i LXD ^

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

Ruajtja (Storage) pĂ«rbĂ«het nga njĂ« ose mĂ« shumĂ« Storage Pool qĂ« pĂ«rdor njĂ« nga sistemet e skedarĂ«ve tĂ« mbĂ«shtetur si ZFS, BTRFS, LVM ose drejtoritĂ« e zakonshme. Çdo Storage Pool nĂ« pjesĂ« (Storage Volume) qĂ« pĂ«rmbajnĂ« imazhe, kontejnerĂ« ose tĂ« dhĂ«na pĂ«r qĂ«llime tĂ« tjera.

  • Imazhet janĂ« distribucione tĂ« pĂ«rgatitura posaçërisht pa bĂ«rthamĂ« Linux dhe tĂ« disponueshme nga burime tĂ« jashtme
  • KontejnerĂ«t janĂ« distribucione tĂ« shtrira nga imazhet, tĂ« gatshĂ«m pĂ«r pĂ«rdorim
  • Snapshotet janĂ« pamje tĂ« gjendjes sĂ« kontejnerĂ«ve nĂ« tĂ« cilat mund tĂ« ktheheni

Funksionalitetet e bazës LXD - sistemet e kontejnerëve në Linux

Për menaxhimin e ruajtjes në LXD përdoret komandë lxc storage ndihmën për të cilën mund të merrni duke specifikuar çelësin - lxc storage --help

Ekipi i ardhshëm nxjerr në ekran një listë të gjitha Storage Pool në depozitën LXD:

lxc storage list

+---------+-------------+--------+--------------------------------+---------+
|  EMRI  | PËRSHKRIMI  |  DRIVE |             BURIMI            | PËRDORUR NGA |
+---------+-------------+--------+--------------------------------+---------+
| hddpool |             | btrfs  | /dev/loop1                     | 2       |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool |             | btrfs  | /var/lib/lxd/disks/ssdpool.img | 4       |
+---------+-------------+--------+--------------------------------+---------+

Për të parë listën e gjitha Storage Volume në Storage Pool shërben komanda lxc storage volume list:

lxc storage volume list hddpool

+-------+----------------------------------+-------------+---------+
| LLOJI |           EMRI                   | PËRSHKRIMI  | PËRDORUR NGA |
+-------+----------------------------------+-------------+---------+
| imazh | ebd565585223487526ddb3607f515... |             | 1       |
+-------+----------------------------------+-------------+---------+

lxc storage volume list ssdpool

+-----------+----------------------------------+-------------+---------+
|   LLOJI   |            EMRI                 | PËRSHKRIMI  | PËRDORUR NGA |
+-----------+----------------------------------+-------------+---------+
| kontejner | alp3                             |             | 1       |
+-----------+----------------------------------+-------------+---------+
| kontejner | jupyter                          |             | 1       |
+-----------+----------------------------------+-------------+---------+
| imazh     | ebd565585223487526ddb3607f515... |             | 1       |
+-----------+----------------------------------+-------------+---------+

Gjithashtu, nëse për Storage Pool kur krijohet, u zgjodh sistemi i skedarëve BTRFS, atëherë merrni listën Storage Volume ose subvolumes në interpretimin e BTRFS mund të përdoret me ndihmën e këtij mjeti:

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

Inicializimi i LXD ^

Para krijimit dhe përdorimit të kontejnerëve është e nevojshme të kryhet një inicializim i përgjithshëm i LXD, i cili krijon dhe konfiguron rrjetin si dhe magazinën. Kjo mund të realizohet manualisht me komandat standarde të klientit që janë të disponueshme në listën e thirrjes së komandës lxc --help ose me anë të asistentit të inicializimit lxd init duke iu përgjigjur disa pyetjeve.

Zgjedhja e sistemit të skedarëve për Storage Pool ^

Gjatë inicializimit, LXD shton disa pyetje, mes të cilave do të jetë përcaktimi i llojit të sistemit të skedarëve për defoltin Storage Pool. Për të, si defualt, zgjidhet sistemi i skedarëve BTRFS. Ndryshimi në një sistem tjetër të skedarëve pas krijimit nuk do të jetë i mundur. Për të zgjedhur sistemin e skedarëve propozohet një tabelë krahasuese e mundësive:

Veçoria
Directory
Btrfs
LVM
ZFS
CEPH

Magazinë e optimizuar për imazhe
no
yes
yes
yes
yes

Krijim optimal i instancës
no
yes
yes
yes
yes

Krijimi i optimizuar i snapshot-eve
no
yes
yes
yes
yes

Transferi i optimizuar i imazheve
no
yes
no
yes
yes

Transferi i optimizuar i instance-ve
no
yes
no
yes
yes

Kopje në shkruaj
no
yes
yes
yes
yes

I bazuar në bllok
no
no
yes
no
yes

Kloni menjëherë
no
yes
yes
yes
yes

Drejtuesi i ruajtjes i përdorshëm brenda një enë
yes
yes
no
no
no

Rivendosni nga snapshot-e më të vjetra (jo më të fundit)
yes
yes
yes
no
yes

Kuotat e ruajtjes
po(*)
yes
yes
yes
no

Inicializimi i rrjetit dhe Storage Pool me ndihmën e asistentit ^

Komanda tjetër që do të shqyrtojmë, ofron konfigurimin e komponentëve kryesorë të LXD me përgjigje në pyetje të thjeshta përmes asistentit të inicializimit.

Ekzekutoni komandën lxc init dhe jepni përgjigje në pyetje pas shenjës së dy pikave siç tregohet në shembullin më poshtë ose ndryshojini sipas kushteve tuaja:

lxd init

A dëshironi të përdorni klasterizimin LXD? (po/jo) [default=jo]: 
A dëshironi të konfiguroni një pool të ri ruajtjeje? (po/jo) [default=po]: 
Emri i pool-it të ri të ruajtjes [default=default]: ssdpool         
Emri i pasqyrës së ruajtjes që do të përdoret (lvm, btrfs, dir) [default=btrfs]: 
A dëshironi të krijoni një pool të ri BTRFS? (po/jo) [default=po]: 
A dëshironi të përdorni një pajisje blloku ekzistuese? (po/jo) [default=jo]: 
Të dhënat në GB të pajisjes së re të ciklit (1GB minimum) [default=15GB]: 10GB
A dëshironi të lidhni me një server MAAS? (po/jo) [default=jo]: 
A dëshironi të krijoni një urë lokale të re rrjeti? (po/jo) [default=po]: 
Si duhet të quhet ura e re? [default=lxdbr0]: 
Cila adresĂ« IPv4 duhet tĂ« pĂ«rdoret? (nĂ«nshkrimi CIDR, “auto” ose “none”) [default=auto]: 10.0.5.1/24
A dëshironi që LXD të NAT të trafikut IPv4 në urën tuaj? [default=po]: 
Cila adresĂ« IPv6 duhet tĂ« pĂ«rdoret? (nĂ«nshkrimi CIDR, “auto” ose “none”) [default=auto]: none
A dëshironi që LXD të jetë i disponueshëm mbi rrjet? (po/jo) [default=jo]: 
A dëshironi që imazhet e ruajtura të prodhohen automatikisht? (po/jo) [default=po] jo
A dëshironi që të printohet një YAML "lxd init" preseed? (po/jo) [default=jo]: 

Krijimi i një Storage Pool shtesë ^

Në hapin e kaluar krijuam Storage Pool të cilit i dhamë emrin ssdpool dhe skedari i tij u vendos në sistemin tim në adresën /var/lib/lxd/disks/ssdpool.img. Kjo adresë e sistemit të skedarëve përputhet me disqin fizik SSD në PC-në time.

Si hap i ardhshëm, për të zgjeruar kuptimin e rolit që luan Storage Pool në ruajtje, do të krijojmë një të dytë Storage Pool i cili do të vendoset fizikisht në një lloj tjetër disku, në HDD. Problemi është se LXD nuk lejon krijimin Storage Pool jashtët adresës /var/lib/lxd/disks/ edhe lidhjet simbolike nuk do të funksionojnë, shihni përgjigjen e zhvilluesit. Për t'i shpëtuar këtij kufizimi, mund ta bëjmë gjatë inicializimit/formatimit Storage Pool duke e caktuar vlerën si një njësie blloku në vend të një rruge për skedarin loopback duke e specifikuar këtë në çelësin source.

Pra, para se të krijojmë Storage Pool duhet të përcaktojmë skedarin loopback ose një ndarje ekzistuese në sistemin tuaj të skedarëve që ai do të përdorë. Për këtë, do të krijojmë dhe do të përdorim një skedar që do ta kufizojmë në madhësinë 10GB:

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

10000+0 regjistra në
10000+0 regjistra jashtë
10000000000 bytes (10 GB, 9,3 GiB) janë kopjuar, 38,4414 s, 260 MB/s

Do të lidhim skedarin loopback në një njësinë e lirë loopback:

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

/dev/loop1

Falë çelësit --show në përmbushjen e komandës, kthehet në ekran emri i pajisjes në të cilën është lidhur skedari ynë loopback. Nëse është e nevojshme, mund të shfaqim në ekran një listë të të gjitha pajisjeve të zëna të këtij lloji, për të siguruar saktësinë e veprimeve tona:

losetup -l

NAME       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ë zbulojmë 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 që përputhet me të parin standard Storage Pool.

Komanda në vazhdim krijon një të re Storage Pool në LXD, bazuar 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

Le të shfaqim listën e gjithë Storage Pool në ekran:

lxc storage list

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

Zgjerimi i madhësisë së Storage Pool ^

Pasi është krijuar Storage Pool, nëse është e nevojshme, mund të zgjerohet. Për Storage Pool për sistemin e skedarëve BTRFS, ekzekutoni 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

Autovënia e skedarit loopback në slotin e pajisjes loopback ^

Kemi një problem të vogël, gjatë rinisjes së sistemit të hostit, skedari /mnt/work/lxd/hddpool.img "do të nxjerrë" nga pajisja /dev/loop1 dhe shërbimi LXD do të ngadalësohet gjatë ngarkesës pasi nuk do ta shohë atë në këtë pajisje. Për të zgjidhur këtë problem, duhet të krijojmë një shërbim sistemor që do ta vendosë këtë skedar në pajisje /dev/loop1 gjatë ngarkesës së sistemit të hostit.

Të krijojmë unit një skedë të tipit service 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 lidhjen simbolike /etc/systemd/system/local-fs.target.wants/lxd-hddpool.service → /etc/systemd/system/lxd-hddpool.service.

Pas ribiljes së sistemit të hostit, kontrollojmë statusin e shërbimit:

systemctl status lxd-hddpool.service 

● lxd-hddpool.service - Losetup LXD Storage Pool (hddpool)
     Loaded: loaded (/etc/systemd/system/lxd-hddpool.service; enabled; vendor preset: disabled)
     Active: active (exited) since Wed 2020-04-08 03:43:53 MSK; 1min 37s ago
    Process: 711 ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img (code=exited, status=0/SUCCESS)
   Main PID: 711 (code=exited, status=0/SUCCESS)

apr 08 03:43:52 manjaro systemd[1]: Starting Losetup LXD Storage Pool (hddpool)...
apr 08 03:43:53 manjaro systemd[1]: Finished Losetup LXD Storage Pool (hddpool).

Nga dalja, mund të sigurojmë që gjendja e shërbimit është active, pavarësisht se ekzekutimi i skriptit tonë nga një komandë përfundoi, kjo na lejoj edhe opsioni RemainAfterExit=true.

Siguria. Privilegjet e kontejnerëve ^

Duke qenë se të gjitha proceset e kontejnerit efektivisht ekzekutohen në izolim në sistemin host duke përdorur bërthamën e tij, për mbrojtje shtesë ndaj aksesit të proceseve të kontejnerit në sistemin host, LXD ofron privilegje për proceset, ku:

  • KontejnerĂ« me privilegje — janĂ« kontejnerĂ« ku proceset me UID dhe GID i pĂ«rkasin tĂ« njĂ«jtit pronar si nĂ« sistemin host. PĂ«r shembull, njĂ« proces i nisur nĂ« njĂ« kontejner me UID tĂ« barabartĂ« me 0 ka tĂ« njĂ«jtin akses si njĂ« proces i sistemit host me UID tĂ« barabartĂ« me 0. NĂ« fjalĂ« tĂ« tjera, pĂ«rdoruesi root nĂ« kontejner ka tĂ« gjitha tĂ« drejtat jo vetĂ«m nĂ« kontejner, por edhe nĂ« sistemin host nĂ«se mund tĂ« dalĂ« pĂ«rtej hapĂ«sirĂ«s izoluese tĂ« emrave tĂ« kontejnerit.

  • KontejnerĂ« tĂ« papriviligjuar — janĂ« kontejnerĂ« ku proceset i pĂ«rkasin pronarit UID dhe GID me numra nga 0 deri nĂ« 65535, por pĂ«r sistemin host pronari maskohet pĂ«rmes bitit tĂ« shtuar SubUID dhe SubGID pĂ«rkatĂ«sisht. PĂ«r shembull, njĂ« pĂ«rdorues me UID=0 nĂ« kontejner do tĂ« vihet re nĂ« sistemin host si SubUID + UID. Kjo mbron sistemin host, pasi nĂ«se ndonjĂ« proces nĂ« kontejner mund tĂ« dalĂ« nga hapĂ«sira izoluese e tij, ai mund tĂ« ndĂ«rveprojĂ« me sistemin host vetĂ«m si njĂ« proces me UID/GID shumĂ« tĂ« lartĂ« dhe tĂ« panjohur.

Sipas parazgjedhjes, kontejnerët e sapo krijuar kanë statusin e papriviligjuar dhe prandaj ne duhet të përcaktojmë SubUID dhe SubGID.

Do të krijojmë dy skedarë konfigurimi në të cilët do të vendosim 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ë zbatuar ndryshimet, shërbimi LXD duhet të rindez:

sudo systemctl restart lxd

Krijimi i një switch virtual të rrjetit ^

Tani që kemi inicializuar rrjetin me ndihmën e ndihmësit të inicializimit lxd init dhe kemi krijuar një pajisje rrjeti lxdbr0, në këtë seksion do të njohim rrjetin në LXD dhe se si të krijojmë një komutator virtual (urë rrjeti, bridge) duke përdorur komandën e klientit.

Schema e mëposhtme tregon se si komutatori (urë rrjeti, bridge) lidh hostin dhe kontejnerët në një rrjet:

Funksionalitetet e bazës LXD - sistemet e kontejnerëve në Linux

Kontejnerët mund të ndërveprojnë përmes rrjetit me kontejnerë të tjerë ose me hostin ku këta konteinerë shërbehen. Për këtë, është e nevojshme të lidhim kartat virtuale të rrjetit të konteinerëve me komutatorin virtual. Në fillim do të krijojmë komutatorin, ndërsa interface-të rrjetore të konteinerëve do të lidhën në kapitujt e ardhshëm, pas krijimit të vetë konteinerit.

Komanda e mëposhtme krijon një komutator me një nënrrjetë 10.0.5.0/24 dhe adresën IPv4 10.0.5.1/24, si dhe aktivizon ipv4.nat për të siguruar 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

Po kontrollojmë listën e pajisjeve rrjetësore të disponueshme LXD:

lxc network list

+--------+----------+---------+-------------+---------+
|  EMRI  |   LLOJI   | MENAXHOHE | PËRSHKRIMI | PËRDORUR NGA |
+--------+----------+---------+-------------+---------+
| eno1   | fizik    | JO      |             | 0       |
+--------+----------+---------+-------------+---------+
| lxdbr0 | urë      | PO      |             | 0       |
+--------+----------+---------+-------------+---------+

Gjithashtu, mund tĂ« siguroheni pĂ«r krijimin e pajisjes rrjetĂ«sore duke pĂ«rdorur mjetin standard tĂ« distribucionit 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

Profili i konfigurimit ^

Çdo kontejner nĂ« LXD ka konfigurimin e tij tĂ« veçantĂ« dhe mund ta zgjasĂ« atĂ« me konfigurime qĂ« shpallen globalisht, tĂ« cilat quhen profile konfigurimi. Aplikimi i profileve tĂ« konfigurimit nĂ« njĂ« kontejner ka njĂ« model kaskad, shembulli i mĂ«poshtĂ«m e demonstruar kĂ«tĂ«:

Funksionalitetet e bazës LXD - sistemet e kontejnerëve në Linux

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

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

lxc profile list

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

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

lxc profile --help

Përshkrimi:
  Menaxho profilet

Përdorimi:
  lxc profile [komandë]

Komandat e Disponueshme:
  add         Shto profile në instanca
  assign      Cakto grupe profilesh në instanca
  copy        Kopjo profilet
  create      Krijo profile
  delete      Fshij profile
  device      Menaxho pajisjet e instancave
  edit        Redakto konfigurimet e profileve si YAML
  get         Merr vlerat për çelësat e konfigurimit të profilit
  list        Listo profilet
  remove      Hiq profilet nga instancat
  rename      Riemëro profilet
  set         Cakto çelësat e konfigurimit të profilit
  show        Trego konfigurimet e profileve
  unset       Ç’vendos çelĂ«sat e konfigurimit tĂ« profilit

Redaktimi i profilit ^

Profili i konfigurimit të paracaktuar default nuk ka një konfigurim të kartës rrjetit për kontejnerin dhe të gjithë kontejnerët e rinj që krijohen s'kanë rrjet; për to është e nevojshme të krijohen pajisje të dedikuara rrjeti me një komandë të veçantë, por ne mund të krijojmë në profilin e konfigurimit një pajisje rrjeti globale që do të ndahet midis të gjithë konteinerëve që përdorin këtë profil. Kështu, menjëherë pas komandës për krijimin e një kontejneri të ri, ata do të kenë rrjet me qasje në rrjet. Sidoqoftë, nuk ka kufizime; gjithmonë mund të krijojmë më vonë një pajisje rrjeti lokale nëse ka nevojë.

Komanda e mëposhtme do të shtojë një pajisje në profilin e konfigurimit eth0 llojin e nic të lidhur me rrjetin lxdbr0:

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

ËshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se, pasi e kemi shtuar nĂ« tĂ« vĂ«rtetĂ« njĂ« pajisje nĂ« profilin e konfigurimit, nĂ«se do tĂ« kishim caktuar njĂ« adresĂ« IP statike nĂ« pajisje, tĂ« gjitha kontejnerĂ«t qĂ« do tĂ« pĂ«rdorin kĂ«tĂ« profil do tĂ« ndajnĂ« tĂ« njĂ«jtĂ«n adresĂ« IP. NĂ«se ka nevojĂ« pĂ«r tĂ« krijuar njĂ« konteiner me njĂ« adresĂ« IP statike tĂ« dedikuar, duhet tĂ« krijohet njĂ« konfigurim tĂ« pajisjes nĂ« nivelin e konteinerit (konfigurim lokal) me parametrin e adresĂ«s IP, e jo nĂ« nivelin e profilit.

Le të kontrollojmë profilin:

lxc profile show default

config: {}
description: Profil i parazgjedhur LXD
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ë gjithë kontejnerët e rinj që do të krijohen do të krijohen dy pajisje (devices):

  • eth0 — Pajisja e tipit nic e lidhur me njĂ« switch (urĂ« rrjeti) lxdbr0
  • root — Pajisja e tipit disk e cila pĂ«rdor njĂ« rezervuar ruajtjeje ssdpool

Krijimi i profileve të reja ^

PĂ«r t'u pĂ«rdorur nga kontejnerĂ«t e krijuar mĂ« parĂ«, do tĂ« krijojmĂ« njĂ« profil konfigurimi Storage Pool ssdroot nĂ« tĂ« cilin do tĂ« shtojmĂ« njĂ« pajisje tĂ« tipit me pikĂ«n e montimit disk (root) qĂ« pĂ«rdor rezervuarin e krijuar mĂ« parĂ« / lxc profile create ssdroot lxc profile device add ssdroot root disk path=/ pool=ssdpool Storage Pool — ssdpool:

në mënyrë të ngjashme, krijojmë një pajisje të tipit

Po njĂ«jtĂ«n mĂ«nyrĂ«, krijojmĂ« njĂ« pajisje tĂ« tipit disk, por kĂ«tĂ« rast pĂ«rdorĂ«se Storage Pool — hddpool:

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

Kontrollojmë profilin e konfigurimeve:

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: []

Repozitori i imazheve ^

Kontejnerët krijohen nga imazhe, të cilat janë distribucione të veçanta të ndërtuara që nuk kanë një bërthamë Linux. Prandaj, para se të nisni një kontejner, ai duhet të jetë vendosur nga ky imazh. Burimi i imazheve është një depot lokale, ku imazhet ngarkohen nga depo të jashtme.

Repozitorët e largët të imazheve ^

Sipas parazgjedhjes, LXD është i vendosur për të marrë imazhe nga tre burime të largëta:

  • ubuntu: (pĂ«r imazhe tĂ« qĂ«ndrueshme Ubuntu)
  • ubuntu-daily: (pĂ«r imazhe tĂ« pĂ«rditshme Ubuntu)
  • images: (pĂ«r njĂ« sĂ«rĂ« distros tjetĂ«r)

lxc remote list

+-----------------+------------------------------------------+--------+--------+
|      EMRI      |                   URL                    | PUBLIK | STATIC |
+-----------------+------------------------------------------+--------+--------+
| images          | https://images.linuxcontainers.org       | PO       | JO     |
+-----------------+------------------------------------------+--------+--------+
| local (default) | unix://                                  | JO       | PO     |
+-----------------+------------------------------------------+--------+--------+
| ubuntu          | https://cloud-images.ubuntu.com/releases | PO       | PO     |
+-----------------+------------------------------------------+--------+--------+
| ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | PO       | PO     |
+-----------------+------------------------------------------+--------+--------+

Për shembull, repository ubuntu: ka këta imazhe:

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

+----------------------------------------------+--------------+----------+------------+
|                   DESCRIPTION                | ARCHITECTURE |   SIZE   |   TYPE     |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150728)  | x86_64       | 153.72MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150819)  | x86_64       | 152.91MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150906)  | x86_64       | 154.69MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150930)  | x86_64       | 153.86MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+

Për të shfaqur një numër të kufizuar kolonash, kemi përdorur opsionin -c me parametrat dasut, dhe gjithashtu kufizuam gjatësi e listës me komandën head.

Për listimin e imazheve, është në dispozicion filtrimi. Komanda e mëposhtme do të shfaqë listën e të gjitha arkitekturave të disponueshme të distribucionit AlpineLinux:

lxc image -c ldast list images:alpine/3.11

+------------------------------+--------------------------------------+--------------+
|            ALIAS             |             DESCRIPTION              | ARCHITECTURE |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11 (3 more)         | Alpine 3.11 amd64 (20200220_13:00)   | x86_64       |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/arm64 (1 more)   | Alpine 3.11 arm64 (20200220_13:00)   | aarch64      |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/armhf (1 more)   | Alpine 3.11 armhf (20200220_13:00)   | armv7l       |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/i386 (1 more)    | Alpine 3.11 i386 (20200220_13:01)    | i686         |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/ppc64el (1 more) | Alpine 3.11 ppc64el (20200220_13:00) | ppc64le      |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/s390x (1 more)   | Alpine 3.11 s390x (20200220_13:00)   | s390x        |
+------------------------------+--------------------------------------+--------------+

Repozitori lokal i imazheve ^

Për të filluar shfrytëzimin e konteinerit, është e nevojshme të shtoni imazhin nga depoja globale në atë lokale. local:. Tani depoja lokale është bosh, shkalla e të cilës do t'na tregojë komandai lxc image list. Nëse metoda listë nuk specifikon depo, atëherë do të përdoret depoja lokale si parazgjedhje. local:

lxc image list local:

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

Menaxhimi i imazheve në depo bëhet me metodat e mëposhtme:

Ekipa
Përshkrimi

lxc image alias
Menaxho aliaset e imazheve

lxc image copy
Kopjo imazhe midis serverëve

lxc image fshi
Fshi imazhet

lxc image edito
Redakto pronësitë e imazhit

lxc image eksporto
Eksporto dhe shkarkoni imazhet

lxc image import
Importo imazhe në depo

lxc image info
Trego informacion të dobishëm rreth imazheve

lxc image listë
Listo imazhet

lxc image rinovim
Rifresko imazhet

lxc image trego
Trego pronësitë e imazhit

Po kopjojmë imazhin në depo lokale nga e globala images::

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

Imazhi u kopjua me sukses!

Do të nxjerrim listën e të gjitha imazheve të disponueshme tani në depot lokale local::

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 mbështet gjithashtu një mod të pa-interaktiv për vendosjen e konfiguracionit, që është kur konfiguracioni përcaktohet në formën e një skedari YAML, një format i veçantë që lejon vendosjen e tërë konfiguracionit njëherësh, duke përjashtuar ekzekutimin e shumë komandave interaktive që janë trajtuar më lart në këtë artikull, duke përfshirë konfigurimin e rrjetit, krijimin e profileve të konfigurimit etj. Ne nuk do të shqyrtojmë këtë fushë, ju mund ta njihni vetë këtë. në dokumentacion.

Komanda interaktive e ardhshme lxc config që do të shqyrtojmë, lejon vendosjen e konfiguracionit. Për shembull, në mënyrë që imazhet e ngarkuara në repo lokale të mos përditësohen automatikisht nga repo globale, ne mund ta aktivizojmë këtë sjellje me komandën e mëposhtme:

lxc config set images.auto_update_cached=false

Krijimi dhe menaxhimi i kontejnerëve ^

Për krijimin e një kontejneri shërben komanda lxc init e cila merr vlera repo:imagë dhe më pas identifikuesi i dëshiruar për kontejnerin. Repo mund të përcaktohet si lokal local: ashtu si çdo depo globale. Nëse depoja nuk është e specifikuar, për të kërkuar imazhin përdoret depoja lokale si parazgjedhje. Nëse imazhi tregohet nga një depo globale, ai do të ngarkohet më parë në depo lokale dhe më pas do të përdoret për të krijuar kontejnerin.

Të ekzekutojmë komandën në vijim për të krijuar kontejnerin tonë të parë:

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

Të shqyrtojmë hap pas hapi çelësat e komandës që po përdorim këtu:

  • alpine3 — Tregohet alias (pseudonimi) pĂ«r imazhin qĂ« Ă«shtĂ« ngarkuar mĂ« parĂ« nĂ« depo lokale. NĂ«se aliasi nuk Ă«shtĂ« krijuar pĂ«r kĂ«tĂ« imazh, gjithmonĂ« mund tĂ« referoni imazhin sipas Gisht qĂ« shfaqet nĂ« tabelĂ«.
  • alp — PĂ«rcaktohet identifikuesi pĂ«r kontejnerin
  • --storage — Ky çelĂ«s tregon nĂ« cilin Storage Pool do tĂ« krijohet kontejneri
  • --profile — KĂ«ta çelĂ«sa aplikojnĂ« kaskadĂ« konfigurimin nĂ« kontejner nga profilet e konfigurimit tĂ« krijuara mĂ« parĂ«

Nisim kontejnerin, i cili fillon të aktivizojë sistemin init të distribuimit:

lxc start alp

Po ashtu, mund të përdorni komandën lxc launch e cila lejon bashkimin e komandave lxc init dhe lxc start në një operacion të vetëm.

Kontrollojmë gjendjen e kontejnerit:

lxc list -c ns46tb
+------+---------+------------------+------+-----------+--------------+
| EMRI |  GJENDJA |       IPV4       | IPV6 |   Lloji   | PULA E RUAJTJESE |
+------+---------+------------------+------+-----------+--------------+
| alp  | MUNDIM | 10.0.5.46 (eth0) |      | KONTEJNER | hddpool      |
+------+---------+------------------+------+-----------+--------------+

Po kontrollojmë konfigurimin e kontejnerit:

lxc config show alp

arkitekturë: 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: MUNDIM
devices:
  root:
    path: /
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

NĂ« seksionin profillet mund tĂ« sigurohemi qĂ« ky kontejner pĂ«rdor dy profile konfigurimi — default dhe hddroot. NĂ« seksionin pajisjet mund tĂ« zbulojmĂ« vetĂ«m njĂ« pajisje, pasi pajisja rrjetore u krijua nĂ« nivelin e profilit default. PĂ«r tĂ« parĂ« tĂ« gjitha pajisjet e pĂ«rdorura nga kontejneri, nevojitet tĂ« shtoni çelĂ«sin --expanded:

lxc config show alp --expanded

arkitektura: 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:
  eth0:
    emri: eth0
    rrjeti: lxdbr0
    lloji: nic
  root:
    rruga: /
    pool: hddpool
    lloji: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

Instalimi i adresës IP statike ^

Nëse përpiqemi të vendosim një adresë IP për pajisjen rrjetore eth0 me komandën lxc config device set alp të destinuar për konfigurimin e kontejnerit, do të marrim një gabim që njofton se pajisja nuk ekziston sepse pajisja eth0 e përdorur nga kontejneri i përket profilit default:

lxc config device set alp eth0 ipv4.address 10.0.5.5

Gabim: Pajisja nuk ekziston

Ne mund të vendosim natyrisht një adresë IP statike për eth0 dispositivin në profil, por ajo do të jetë e njëjtë për të gjithë kontejnerët që do të 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

Më pas duhet të rindezim kontejnerin:

lxc restart alp

Nëse tani shohim konfigurimin e kontejnerit, nuk na nevojitet të aplikojmë opsionin --expanded për të parë pajisjen rrjetësore eth0, pasi e krijuam atë në nivelin e kontejnerit dhe ajo ka mbuluar në mënyrë kaskaduese këtë pajisje nga profili default:

lxc config show alp

arkitektura: x86_64
konfigurimi:
  image.architektura: amd64
  image.përshkrimi: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.lëshimi: "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
    emri: eth0
    nictype: bridged
    prind: lxdbr0
    tipi: nic
  rrënjë:
    rruga: /
    pool: hddpool
    tipi: disk
ephemeral: false
profile:
- default
- hddroot
stateful: false
përshkrimi: ""

Fshirja e kontejnerit ^

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

lxc stop alp

lxc list

+------+---------+-------------------+------+-----------+-----------+
| EMRI |  GJENDJA |       IPV4        | IPV6 |   TIPA    | SNAPSHOTET |
+------+---------+-------------------+------+-----------+-----------+
| alp  | NDALUR | 10.0.5.10 (eth0)  |      | KONTEINERI | 0         |
+------+---------+-------------------+------+-----------+-----------+

Pasi kemi verifikuar që gjendja e kontenierit është NDALUR, mund të hiqet nga Storage Pool:

lxc fshi alp

Aksesi në kontejner ^

Për të ekzekutuar komanda në konteiner, drejtpërdrejt, pa kaluar nëpër lidhje rrjeti, shërben komanda lxc exec e cila ekzekuton komanda në konteiner pa nisur shell-in e sistemit. Nëse ju nevojitet të ekzekutoni një komandë në shell duke përdorur modele shell, si variabla, redirektimet e skedarëve (pipe) etj., atëherë duhet të nisin shkellet dhe të kaloni komandën si një çelës, për shembull:

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

Në komandë u përdor një simbul i veçantë për të shkruar për simbolin e veçantë $ në mënyrë që variabla $HOME të mos interpretohej në makinën prind, por të interpretohej vetëm brenda konteinerit.

Gjithashtu, është e mundur të filloni një mod interaktiv të shell-it, dhe pas përfundimit të seancës të ekzekutoni hotkey CTRL+D:

lxc exec alp -- /bin/sh

Menaxhimi i burimeve të kontejnerit ^

Në LXD, mund të menaxhoni burimet e konteinerit përmes një grupi të caktuar konfigurimi. Lista e plotë e parametrave të konfigurimit të konteinerit mund të gjendet në dokumentacion.

Kufizimi i burimeve RAM (MEMORI) ^

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

Le të vendosim një kufizim për konteinerin për sasinë e RAM prej 256 MB:

lxc config set alp limits.memory 256MB

gjithashtu, 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ë shfaqet e gjithë konfigurimi i kontejnerit, përfshirë kufizimin e resurseve që është vendosur:

lxc config show alp

architecture: x86_64
config:
  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 (PËRPROCESIM) ^

Për kufizimin e resurseve të CPU, ekzistojnë disa llojra kufizimesh:

  • limit.cpu — lidh kontejnerin me njĂ« ose mĂ« shumĂ« bĂ«rthama CPU
  • limits.cpu.allowance — menaxhon ose kuotat e planifikuesit CFS, kur ka kaluar kufizimi i kohĂ«s, ose mekanizmin universalisht pĂ«r ndarjen e resurseve tĂ« CPU, kur ka kaluar njĂ« vlerĂ« pĂ«rqindjeje
  • limits.cpu.priority — prioriteti i planifikuesit, kur pĂ«r disa instanca, qĂ« ndajnĂ« tĂ« njĂ«jtin grup procesorĂ«sh, Ă«shtĂ« caktuar e njĂ«jta pĂ«rqindje procesorĂ«sh

lxc config set alp limits.cpu.allowance 40%

lxc config show alp

architecture: x86_64
config:
  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 diskore ^

Përveç kufizimeve si limits.read, limits.write ne mund të kufizojmë gjithashtu sasinë e hapësirës disk të përdorur nga kontejneri (funksionon 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 ta marrim nga komanda lxc info:

lxc info alp
...
Resources:
  Processes: 5
  Disk usage:
    root: 1.05GB
  CPU usage:
    CPU usage (in seconds): 1
  Memory usage:
    Memory (current): 5.46MB
  Network usage:
    eth0:
      Bytes received: 802B
      Bytes sent: 1.59kB
      Packets received: 4
      Packets sent: 14
    lo:
      Bytes received: 0B
      Bytes sent: 0B
      Packets received: 0
      Packets sent: 0

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

Do të krijojmë 2 kontejnerë identikë 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
+------+---------+------------------+------+-----------+-----------+
| EMRI |  STADI  |       IPV4       | IPV6 |   LLOJI    | SNAPSHOTET |
+------+---------+------------------+------+-----------+-----------+
| alp1 | NË FUNKSION | 10.0.5.46 (eth0) |      | KONTEJNER | 0         |
+------+---------+------------------+------+-----------+-----------+
| alp2 | NË FUNKSION | 10.0.5.30 (eth0) |      | KONTEJNER | 0         |
+------+---------+------------------+------+-----------+-----------+

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

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

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, atëherë ky skedar nuk do të jetë aty, siç pritej, pasi kontejnerët krijohen në Storage Volume 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 e montuar sihtas si një pjesë e rrënjësore Storage Pool e cila përdoret nga këto konteinerë, kështu që ata e ndajnë atë volum në dy.

Statistika e konsumit të burimeve ^

Të shikoni statistikën e konsumit të burimeve për konteinerin mund të bëhet me komandën:

lxc info alp

Emri: alp
Vendndodhja: asnjë
Remote: unix://
Arkitektura: x86_64
Krijuar: 2020/04/08 18:05 UTC
Statusi: Duke punuar
Tipi: konteiner
Profili: 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
Burimet:
  Proceset: 5
  Përdorimi i diskut:
    rrënjësor: 495.62kB
  Përdorimi i CPU:
    Përdorimi i CPU (në sekonda): 1
  Përdorimi i kujtesës:
    Kujtesa (aktuale): 4.79MB
  Përdorimi i rrjetit:
    eth0:
      Bytes e pranuara: 730B
      Bytes e dërguara: 1.59kB
      Paketa e pranuara: 3
      Paketa e dërguara: 14
    lo:
      Bytes e pranuara: 0B
      Bytes e dërguara: 0B
      Paketa e pranuara: 0
      Paketa e dërguara: 0

Puno me snapshot-et ^

LXD ka mundësinë e krijimit të snapshoteve dhe rikthimit prej tyre të gjendjes së konteinerit.

Për të krijuar një snapshot, ekzekutoni komandën në vijim:

lxc snapshot alp snapshot1

Komanda lxc snapshot nuk ka një çelës listë, prandaj, për të parë listën e snapshot-eve, duhet të përdorim komandën që jep informacion të përgjithshëm mbi kontejnerin:

lxc info alp
...
...
Snapshot-e:
  snapshot1 (marrë më 2020/04/08 18:18 UTC) (pa shtesë)

Për të rikthyer kontejnerin nga një snapshot, mund të përdorni komandën lxc restore duke specifikuar kontejnerin për të cilin do të bëhet rikthimi dhe pseudonimin e snapshot-it:

lxc restore alp snapshot1

Komanda në vijim shërben për të fshirë një snapshot. Vini re se sintaksa e komandës nuk është e ngjashme me të gjitha të tjerat; këtu duhet të specifikoni një prerje të drejtpërdrejtë pas emrit të kontejnerit. Nëse e lëshoni prerjen, komanda për fshirjen e snapshot-it do të interpretohet si një komandë për fshirjen e kontejnerit!

lxc delete alp/snapshot1

NĂ« shembullin e mĂ«sipĂ«rm, ne shqyrtuam snapshot-e tĂ« quajtur stateless. NĂ« LXD ka njĂ« tjetĂ«r lloj snapshot-i — stateful, nĂ« tĂ« cilin ruhet gjendja aktuale e tĂ« gjithĂ« proceseve nĂ« kontejner. Me snapshot-et stateful lidhen disa funksione tĂ« interesante dhe tĂ« dobishme.

ÇfarĂ« tjetĂ«r? ^

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

UPDATE 10.04.2020 15:00: Shtova navigimin

Burimi: habr.com

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