Βασικά χαρακτηριστικά των συστημάτων κοντέινερ LXD - Linux

Βασικά χαρακτηριστικά των συστημάτων κοντέινερ LXD - Linux

Lxd είναι ο διαχειριστής κοντέινερ συστήματος επόμενης γενιάς, έτσι λέει πηγή. Προσφέρει μια διεπαφή χρήστη παρόμοια με τις εικονικές μηχανές, αλλά χρησιμοποιεί κοντέινερ Linux.

Πυρήνας LXD είναι ένας προνομιακός δαίμονας (υπηρεσία που εκτελείται με δικαιώματα root) που παρέχει ένα REST API μέσω τοπικής υποδοχής unix, καθώς και μέσω του δικτύου εάν έχει εγκατασταθεί η κατάλληλη διαμόρφωση. Οι πελάτες, όπως το εργαλείο γραμμής εντολών που παρέχεται με το LXD, υποβάλλουν αιτήματα μέσω αυτού του REST API. Αυτό σημαίνει ότι είτε έχετε πρόσβαση σε έναν τοπικό υπολογιστή είτε σε έναν απομακρυσμένο κεντρικό υπολογιστή, όλα λειτουργούν το ίδιο.

Σε αυτό το άρθρο δεν θα σταθούμε λεπτομερώς στις έννοιες του LXD, δεν θα εξετάσουμε όλες τις διαθέσιμες δυνατότητες που περιγράφονται στην τεκμηρίωση, συμπεριλαμβανομένης της πρόσφατης υλοποίησης στις πιο πρόσφατες εκδόσεις του LXD υποστήριξης για εικονικές μηχανές QEMU παράλληλα με κοντέινερ. Αντίθετα, θα μάθουμε μόνο τα βασικά της διαχείρισης κοντέινερ - ρύθμιση δεξαμενών αποθήκευσης, δικτύωση, λειτουργία κοντέινερ, εφαρμογή ορίων πόρων και πώς να χρησιμοποιείτε στιγμιότυπα, ώστε να μπορείτε να κατανοήσετε βασικά το LXD και να χρησιμοποιήσετε κοντέινερ στο Linux.

Για πλήρεις πληροφορίες, ανατρέξτε στην επίσημη πηγή:

Πλοήγηση

Εγκατάσταση LXD ^

Εγκατάσταση LXD σε διανομές Ubuntu ^

Στο πακέτο διανομής Ubuntu 19.10 lxd έχει εκπομπή σε snap πακέτο:

apt search lxd

lxd/eoan 1:0.7 all
  Transitional package - lxd -> snap (lxd)

Αυτό σημαίνει ότι δύο πακέτα θα εγκατασταθούν ταυτόχρονα, το ένα ως πακέτο συστήματος και το άλλο ως πακέτο snap. Η εγκατάσταση δύο πακέτων σε ένα σύστημα μπορεί να δημιουργήσει κάποιο πρόβλημα όπου το πακέτο συστήματος μπορεί να μείνει ορφανό εάν το πακέτο snap αφαιρεθεί από τον διαχειριστή πακέτων snap.

Βρείτε πακέτο lxd στο αποθετήριο snap μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:

snap find lxd

Name             Version        Summary
lxd              3.21           System container manager and API
lxd-demo-server  0+git.6d54658  Online software demo sessions using LXD
nova             ocata          OpenStack Compute Service (nova)
nova-hypervisor  ocata          OpenStack Compute Service - KVM Hypervisor (nova)
distrobuilder    1.0            Image builder for LXC and LXD
fabrica          0.1            Build snaps by simply pointing a web form to...
satellite        0.1.2          Advanced scalable Open source intelligence platform

Εκτελώντας την εντολή list μπορείτε να βεβαιωθείτε ότι το πακέτο lxd δεν έχει εγκατασταθεί ακόμα:

snap list

Name  Version    Rev   Tracking  Publisher   Notes
core  16-2.43.3  8689  stable    canonical✓  core

Παρά το γεγονός ότι το LXD είναι ένα snap πακέτο, πρέπει να εγκατασταθεί μέσω του πακέτου συστήματος lxd, το οποίο θα δημιουργήσει την αντίστοιχη ομάδα στο σύστημα, τα απαραίτητα βοηθητικά προγράμματα στο /usr/bin κλπ.

sudo apt update
sudo apt install lxd

Ας βεβαιωθούμε ότι το πακέτο έχει εγκατασταθεί ως snap πακέτο:

snap list

Name  Version    Rev    Tracking  Publisher   Notes
core  16-2.43.3  8689   stable    canonical✓  core
lxd   3.21       13474  stable/…  canonical✓  -

Εγκατάσταση LXD σε διανομές Arch Linux ^

Για να εγκαταστήσετε το πακέτο LXD στο σύστημα, πρέπει να εκτελέσετε τις ακόλουθες εντολές, η πρώτη θα ενημερώσει τη λίστα των πακέτων στο σύστημα που είναι διαθέσιμη στο αποθετήριο, η δεύτερη θα εγκαταστήσει απευθείας το πακέτο:

sudo pacman -Syyu && sudo pacman -S lxd

Μετά την εγκατάσταση του πακέτου, για τη διαχείριση του LXD από έναν κανονικό χρήστη, πρέπει να προστεθεί στην ομάδα συστήματος lxd:

sudo usermod -a -G lxd user1

Ας βεβαιωθούμε ότι ο χρήστης user1 προστέθηκε στην ομάδα lxd:

id -Gn user1

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

Αν η ομάδα lxd δεν είναι ορατή στη λίστα, τότε πρέπει να ενεργοποιήσετε ξανά την περίοδο λειτουργίας χρήστη. Για να το κάνετε αυτό, πρέπει να αποσυνδεθείτε και να συνδεθείτε στον ίδιο χρήστη.

Ενεργοποίηση σε systemd φόρτωση της υπηρεσίας LXD κατά την εκκίνηση του συστήματος:

sudo systemctl enable lxd

Ας ξεκινήσουμε την υπηρεσία:

sudo systemctl start lxd

Έλεγχος της κατάστασης της υπηρεσίας:

sudo systemctl status lxd

Αποθήκευση LXD (Αποθήκευση) ^

Πριν ξεκινήσει η προετοιμασία, πρέπει να κατανοήσουμε πώς είναι λογικά διατεταγμένη η αποθήκευση στο LXD.

Αποθήκευση (Αποθηκευτικός χώρος) состоит από ένα ή περισσότερα πισίνα αποθήκευσης που χρησιμοποιεί ένα από τα υποστηριζόμενα συστήματα αρχείων όπως ZFS, BTRFS, LVM ή κανονικούς καταλόγους. Κάθε πισίνα αποθήκευσης χωρίζεται σε τόμους (Όγκος αποθήκευσης) που περιέχουν εικόνες, κοντέινερ ή δεδομένα για άλλους σκοπούς.

  • Εικόνες - αυτές είναι ειδικά συναρμολογημένες διανομές χωρίς τον πυρήνα Linux και διατίθενται από εξωτερικές πηγές
  • εμπορευματοκιβώτια - πρόκειται για αναπτυγμένες διανομές από εικόνες, έτοιμες για χρήση
  • Στιγμιότυπα - αυτά είναι στιγμιότυπα της κατάστασης των κοντέινερ στα οποία μπορείτε να επιστρέψετε

Βασικά χαρακτηριστικά των συστημάτων κοντέινερ LXD - Linux

Για να διαχειριστείτε τον χώρο αποθήκευσης στο LXD, χρησιμοποιήστε την εντολή lxc storage ένα πιστοποιητικό για το οποίο μπορείτε να αποκτήσετε καθορίζοντας το κλειδί - lxc storage --help

Η ακόλουθη εντολή εμφανίζει μια λίστα με όλα πισίνα αποθήκευσης σε αποθήκευση LXD:

lxc storage list

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

Για να δείτε μια λίστα με όλα Όγκος αποθήκευσης στο επιλεγμένο πισίνα αποθήκευσης εξυπηρετεί την ομάδα 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       |
+-----------+----------------------------------+-------------+---------+

Επίσης, εάν για πισίνα αποθήκευσης Κατά τη δημιουργία, επιλέχθηκε το σύστημα αρχείων BTRFS και, στη συνέχεια, λάβετε μια λίστα Όγκος αποθήκευσης ή υποτομείς στην ερμηνεία BTRFS, μπορείτε να χρησιμοποιήσετε την εργαλειοθήκη αυτού του συστήματος αρχείων:

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

Αρχικοποίηση LXD ^

Πριν δημιουργήσετε και χρησιμοποιήσετε κοντέινερ, πρέπει να εκτελέσετε μια γενική προετοιμασία LXD που δημιουργεί και διαμορφώνει το δίκτυο και την αποθήκευση. Αυτό μπορεί να γίνει χειροκίνητα χρησιμοποιώντας τυπικές εντολές πελάτη που είναι διαθέσιμες στη λίστα καλώντας την εντολή lxc --help ή χρησιμοποιώντας τον οδηγό προετοιμασίας lxd init απαντώντας σε μερικές ερωτήσεις.

Επιλογή συστήματος αρχείων για το Storage Pool ^

Κατά την αρχικοποίηση, το LXD θέτει πολλές ερωτήσεις, συμπεριλαμβανομένου του προσδιορισμού του τύπου συστήματος αρχείων για την προεπιλογή πισίνα αποθήκευσης. Από προεπιλογή, το σύστημα αρχείων BTRFS είναι επιλεγμένο για αυτό. Θα είναι αδύνατη η αλλαγή σε άλλο FS μετά τη δημιουργία. Για να επιλέξετε ένα FS προτείνεται πίνακας σύγκρισης χαρακτηριστικών:

Χαρακτηριστικό
Τηλεφωνικός κατάλογος
Btrfs
LVM
ZFS
CEPH

Βελτιστοποιημένη αποθήκευση εικόνας
Όχι.
Ναί
Ναί
Ναί
Ναί

Βελτιστοποιημένη δημιουργία παρουσιών
Όχι.
Ναί
Ναί
Ναί
Ναί

Βελτιστοποιημένη δημιουργία στιγμιότυπου
Όχι.
Ναί
Ναί
Ναί
Ναί

Βελτιστοποιημένη μεταφορά εικόνας
Όχι.
Ναί
Όχι.
Ναί
Ναί

Βελτιστοποιημένη μεταφορά παρουσιών
Όχι.
Ναί
Όχι.
Ναί
Ναί

Αντιγραφή στην εγγραφή
Όχι.
Ναί
Ναί
Ναί
Ναί

Βασισμένο σε μπλοκ
Όχι.
Όχι.
Ναί
Όχι.
Ναί

Άμεση κλωνοποίηση
Όχι.
Ναί
Ναί
Ναί
Ναί

Πρόγραμμα οδήγησης αποθήκευσης που μπορεί να χρησιμοποιηθεί μέσα σε ένα δοχείο
Ναί
Ναί
Όχι.
Όχι.
Όχι.

Επαναφορά από παλαιότερα στιγμιότυπα (όχι πιο πρόσφατα)
Ναί
Ναί
Ναί
Όχι.
Ναί

Ποσοστώσεις αποθήκευσης
Ναί(*)
Ναί
Ναί
Ναί
Όχι.

Εκκίνηση του δικτύου και του Storage Pool χρησιμοποιώντας τον οδηγό ^

Η επόμενη εντολή που θα εξετάσουμε προτείνει τη ρύθμιση των κύριων στοιχείων του LXD απαντώντας σε απλές ερωτήσεις χρησιμοποιώντας τον οδηγό προετοιμασίας.

Εκτέλεση εντολής lxc init και εισαγάγετε τις απαντήσεις στις ερωτήσεις μετά την άνω και κάτω τελεία, όπως φαίνεται στο παρακάτω παράδειγμα ή αλλάξτε τις σύμφωνα με τις συνθήκες σας:

lxd init

Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: ssdpool         
Name of the storage backend to use (lvm, btrfs, dir) [default=btrfs]: 
Create a new BTRFS pool? (yes/no) [default=yes]: 
Would you like to use an existing block device? (yes/no) [default=no]: 
Size in GB of the new loop device (1GB minimum) [default=15GB]: 10GB
Would you like to connect to a MAAS server? (yes/no) [default=no]: 
Would you like to create a new local network bridge? (yes/no) [default=yes]: 
What should the new bridge be called? [default=lxdbr0]: 
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 10.0.5.1/24
Would you like LXD to NAT IPv4 traffic on your bridge? [default=yes]: 
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none
Would you like LXD to be available over the network? (yes/no) [default=no]: 
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] no
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 

Δημιουργία πρόσθετου χώρου αποθήκευσης ^

Στο προηγούμενο βήμα δημιουργήσαμε πισίνα αποθήκευσης στο οποίο δόθηκε το όνομα ssdpool και το αρχείο του οποίου βρίσκεται στο σύστημά μου στο /var/lib/lxd/disks/ssdpool.img. Αυτή η διεύθυνση συστήματος αρχείων αντιστοιχεί στη φυσική μονάδα SSD στον υπολογιστή μου.

Οι ακόλουθες ενέργειες, για να διευρύνει την κατανόηση του ρόλου που διαδραματίζει πισίνα αποθήκευσης στο αποθετήριο, θα δημιουργήσουμε ένα δεύτερο πισίνα αποθήκευσης που θα βρίσκεται φυσικά σε διαφορετικό τύπο δίσκου, HDD. Το πρόβλημα είναι ότι το LXD δεν σας επιτρέπει να δημιουργήσετε πισίνα αποθήκευσης εκτός διεύθυνσης /var/lib/lxd/disks/ και ακόμη και οι συμβολικοί σύνδεσμοι δεν θα λειτουργήσουν, δείτε την απάντηση του προγραμματιστή. Μπορούμε να παρακάμψουμε αυτόν τον περιορισμό κατά την προετοιμασία/μορφοποίηση πισίνα αποθήκευσης καθορίζοντας την τιμή ως συσκευή μπλοκ αντί για τη διαδρομή προς το αρχείο loopback, προσδιορίζοντας αυτό στο κλειδί source.

Έτσι, πριν δημιουργήσετε πισίνα αποθήκευσης πρέπει να ορίσετε ένα αρχείο loopback ή ένα υπάρχον διαμέρισμα στο σύστημα αρχείων σας που θα χρησιμοποιεί. Για να γίνει αυτό, θα δημιουργήσουμε και θα χρησιμοποιήσουμε ένα αρχείο που θα περιορίσουμε σε μέγεθος στα 10 GB:

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

10000+0 records in
10000+0 records out
10000000000 bytes (10 GB, 9,3 GiB) copied, 38,4414 s, 260 MB/s

Ας συνδέσουμε το αρχείο loopback σε μια δωρεάν συσκευή loopback:

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

/dev/loop1

Χάρη στο κλειδί --show εκτελώντας την εντολή επιστρέφει στην οθόνη το όνομα της συσκευής στην οποία είναι συνδεδεμένο το αρχείο μας loopback. Εάν είναι απαραίτητο, μπορούμε να εμφανίσουμε μια λίστα με όλες τις απασχολημένες συσκευές αυτού του τύπου για να βεβαιωθούμε ότι οι ενέργειές μας είναι σωστές:

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

Από τη λίστα μπορείτε να βρείτε ότι διαθέτει η συσκευή /dev/loop1 Περιλαμβάνεται αρχείο loopback /mnt/work/lxd/hddpool.imgκαι στη συσκευή /dev/loop0 Περιλαμβάνεται αρχείο loopback /var/lib/lxd/disks/ssdpool.img που αντιστοιχεί στην προεπιλογή πισίνα αποθήκευσης.

Η ακόλουθη εντολή δημιουργεί μια νέα πισίνα αποθήκευσης σε LXD με βάση το αρχείο loopback που μόλις ετοιμάσαμε. Το LXD θα μορφοποιήσει το αρχείο loopback /mnt/work/lxd/hddpool.img στη συσκευή /dev/loop1 για το σύστημα αρχείων BTRFS:

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

Ας εμφανίσουμε μια λίστα με όλα πισίνα αποθήκευσης στην οθόνη:

lxc storage list

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

Αύξηση του μεγέθους της πισίνας αποθήκευσης ^

Μετά τη δημιουργία πισίνα αποθήκευσης, εάν είναι απαραίτητο, μπορεί να επεκταθεί. Για πισίνα αποθήκευσης με βάση το σύστημα αρχείων BTRFS, εκτελέστε τις ακόλουθες εντολές:

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

Αυτόματη εισαγωγή ενός αρχείου loopback σε μια υποδοχή συσκευής loopback ^

Έχουμε ένα μικρό πρόβλημα, κατά την επανεκκίνηση του συστήματος κεντρικού υπολογιστή, το αρχείο /mnt/work/lxd/hddpool.img θα «πετάξει» έξω από τη συσκευή /dev/loop1 και η υπηρεσία LXD θα διακοπεί κατά τη φόρτωση επειδή δεν θα τη δει σε αυτήν τη συσκευή. Για να λύσετε αυτό το πρόβλημα, πρέπει να δημιουργήσετε μια υπηρεσία συστήματος που θα εισάγει αυτό το αρχείο στη συσκευή /dev/loop1 κατά την εκκίνηση του συστήματος κεντρικού υπολογιστή.

Ας δημιουργήσουμε μονάδα Τύπος αρχείου υπηρεσία в /etc/systemd/system/ για το σύστημα αρχικοποίησης 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

Ενεργοποιήστε την υπηρεσία:

sudo systemctl enable lxd-hddpool

Created symlink /etc/systemd/system/local-fs.target.wants/lxd-hddpool.service → /etc/systemd/system/lxd-hddpool.service.

Μετά την επανεκκίνηση του συστήματος κεντρικού υπολογιστή, ελέγχουμε την κατάσταση της υπηρεσίας:

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)

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

Από την έξοδο μπορούμε να επαληθεύσουμε ότι η κατάσταση υπηρεσίας είναι ενεργός, παρά το γεγονός ότι ολοκληρώθηκε η εκτέλεση του σεναρίου μας από μία εντολή, η επιλογή μας επέτρεψε να το κάνουμε αυτό RemainAfterExit=true.

Ασφάλεια. Προνόμια κοντέινερ ^

Δεδομένου ότι όλες οι διεργασίες κοντέινερ εκτελούνται πραγματικά μεμονωμένα στο κεντρικό σύστημα χρησιμοποιώντας τον πυρήνα του, για την περαιτέρω προστασία της πρόσβασης των διεργασιών κοντέινερ στο κεντρικό σύστημα, η LXD προσφέρει προνόμια διεργασίας, όπου:

  • Προνομιακά Εμπορευματοκιβώτια - πρόκειται για κοντέινερ στα οποία οι διεργασίες με UID και GID αντιστοιχούν στον ίδιο κάτοχο με το κεντρικό σύστημα. Για παράδειγμα, μια διεργασία που εκτελείται σε ένα κοντέινερ με UID 0 έχει όλα τα ίδια δικαιώματα πρόσβασης με μια διεργασία στο κεντρικό σύστημα με UID 0. Με άλλα λόγια, ο χρήστης root στο κοντέινερ έχει όλα τα δικαιώματα όχι μόνο στο το κοντέινερ, αλλά και στο κεντρικό σύστημα, εάν μπορεί να βγει έξω από τον απομονωμένο χώρο ονομάτων του κοντέινερ.

  • Μη προνομιούχα κοντέινερ - πρόκειται για κοντέινερ στα οποία οι διεργασίες ανήκουν στον κάτοχο του UID και του GID με αριθμό από 0 έως 65535, αλλά για το κεντρικό σύστημα ο κάτοχος καλύπτεται χρησιμοποιώντας τα προστιθέμενα bit SubUID και SubGID, αντίστοιχα. Για παράδειγμα, ένας χρήστης με UID=0 σε ένα κοντέινερ θα εμφανίζεται στο κεντρικό σύστημα ως SubUID + UID. Αυτό προστατεύει το κεντρικό σύστημα επειδή εάν οποιαδήποτε διεργασία στο κοντέινερ μπορεί να διαφύγει από τον απομονωμένο χώρο ονομάτων της, μπορεί να επικοινωνήσει μόνο με το κεντρικό σύστημα ως διεργασία με ένα άγνωστο, πολύ υψηλό UID/GID.

Από προεπιλογή, τα κοντέινερ που δημιουργήθηκαν πρόσφατα έχουν μη προνομιακή κατάσταση και επομένως πρέπει να ορίσουμε ένα SubUID και SubGID.

Ας δημιουργήσουμε δύο αρχεία διαμόρφωσης στα οποία θα ορίσουμε τη μάσκα για SubUID και SubGID, αντίστοιχα:

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

Για να εφαρμόσετε τις αλλαγές, πρέπει να επανεκκινήσετε την υπηρεσία LXD:

sudo systemctl restart lxd

Δημιουργία ενός διακόπτη εικονικού δικτύου ^

Εφόσον αρχικοποιήσαμε προηγουμένως το δίκτυο χρησιμοποιώντας τον οδηγό προετοιμασίας lxd init και δημιούργησε μια συσκευή δικτύου lxdbr0, τότε σε αυτή την ενότητα απλά θα εξοικειωθούμε με τη δικτύωση στο LXD και πώς να δημιουργήσουμε έναν εικονικό διακόπτη (γέφυρα) χρησιμοποιώντας την εντολή πελάτη.

Το παρακάτω διάγραμμα δείχνει πώς ένας διακόπτης (γέφυρα) συνδέει τον κεντρικό υπολογιστή και τα κοντέινερ σε ένα δίκτυο:

Βασικά χαρακτηριστικά των συστημάτων κοντέινερ LXD - Linux

Τα κοντέινερ μπορούν να επικοινωνούν μέσω δικτύου με άλλα κοντέινερ ή με τον κεντρικό υπολογιστή στον οποίο εξυπηρετούνται αυτά τα κοντέινερ. Για να γίνει αυτό, πρέπει να συνδέσετε τις εικονικές κάρτες δικτύου των κοντέινερ με έναν εικονικό διακόπτη. Θα δημιουργήσουμε πρώτα έναν διακόπτη και οι διεπαφές δικτύου του κοντέινερ θα συνδεθούν σε επόμενα κεφάλαια, αφού δημιουργηθεί το ίδιο το κοντέινερ.

Η ακόλουθη εντολή δημιουργεί έναν διακόπτη με ένα υποδίκτυο 10.0.5.0/24 και διεύθυνση IPv4 10.0.5.1/24, και περιλαμβάνει επίσης ipv4.nat ώστε τα κοντέινερ να έχουν πρόσβαση στο Διαδίκτυο μέσω του κεντρικού υπολογιστή χρησιμοποιώντας την υπηρεσία NAT:

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

Έλεγχος της λίστας των συσκευών δικτύου που είναι διαθέσιμες στο LXD:

lxc network list

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

Μπορείτε επίσης να επαληθεύσετε ότι μια συσκευή δικτύου έχει δημιουργηθεί χρησιμοποιώντας το τυπικό εργαλείο της διανομής Linux - ip link ή ip addr:

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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

Προφίλ διαμόρφωσης ^

Κάθε κοντέινερ στο LXD έχει τη δική του διαμόρφωση και μπορεί να την επεκτείνει με καθολικά δηλωμένες διαμορφώσεις που ονομάζονται προφίλ διαμόρφωσης. Η εφαρμογή προφίλ διαμόρφωσης σε ένα κοντέινερ έχει ένα μοντέλο καταρράκτη, το παρακάτω παράδειγμα δείχνει αυτό:

Βασικά χαρακτηριστικά των συστημάτων κοντέινερ LXD - Linux

Σε αυτό το παράδειγμα, τρία προφίλ έχουν δημιουργηθεί στο σύστημα LXD: default, hddpool и hostfs. Και τα τρία προφίλ εφαρμόζονται σε ένα κοντέινερ που έχει τοπική διαμόρφωση (γκρι περιοχή). Προφίλ default έχει συσκευή root που έχει μια παράμετρο pool ισούται με ssdpool, αλλά χάρη στο μοντέλο εφαρμογής διαμόρφωσης καταρράκτη, μπορούμε να εφαρμόσουμε ένα προφίλ στο κοντέινερ hddpool που έχει μια παράμετρο pool θα αντικαταστήσει την ίδια παράμετρο από το προφίλ default και το κοντέινερ θα λάβει τη διαμόρφωση της συσκευής root με παράμετρο pool ίσος hddpoolκαι το προφίλ hostfs απλά προσθέτει μια νέα συσκευή στο κοντέινερ.

Για να δείτε τη λίστα με τα διαθέσιμα προφίλ διαμόρφωσης, χρησιμοποιήστε την ακόλουθη εντολή:

lxc profile list

+---------+---------+
|  NAME   | USED BY |
+---------+---------+
| default | 1       |
+---------+---------+
| hddroot | 0       |
+---------+---------+
| ssdroot | 1       |
+---------+---------+

Μπορείτε να λάβετε μια πλήρη λίστα με τις διαθέσιμες εντολές για εργασία με ένα προφίλ προσθέτοντας το κλειδί --help:

lxc profile --help

Description:
  Manage profiles

Usage:
  lxc profile [command]

Available Commands:
  add         Add profiles to instances
  assign      Assign sets of profiles to instances
  copy        Copy profiles
  create      Create profiles
  delete      Delete profiles
  device      Manage instance devices
  edit        Edit profile configurations as YAML
  get         Get values for profile configuration keys
  list        List profiles
  remove      Remove profiles from instances
  rename      Rename profiles
  set         Set profile configuration keys
  show        Show profile configurations
  unset       Unset profile configuration keys

Επεξεργασία του προφίλ σας ^

Προεπιλεγμένο προφίλ διαμόρφωσης default δεν έχει διαμόρφωση κάρτας δικτύου για το κοντέινερ και όλα τα κοντέινερ που δημιουργήθηκαν πρόσφατα δεν έχουν δίκτυο, για αυτούς είναι απαραίτητο να δημιουργήσουμε τοπικές (αποκλειστικές) συσκευές δικτύου με ξεχωριστή εντολή, αλλά μπορούμε να δημιουργήσουμε μια καθολική συσκευή δικτύου στη διαμόρφωση προφίλ που θα είναι κοινόχρηστο μεταξύ όλων των κοντέινερ που χρησιμοποιούν αυτό το προφίλ. Με αυτόν τον τρόπο, αμέσως μετά την εντολή δημιουργίας νέου κοντέινερ, θα έχουν δίκτυο με πρόσβαση δικτύου. Ταυτόχρονα, δεν υπάρχουν περιορισμοί· μπορούμε πάντα να δημιουργήσουμε μια συσκευή τοπικού δικτύου αργότερα, εάν χρειαστεί.

Η ακόλουθη εντολή θα προσθέσει τη συσκευή στο προφίλ διαμόρφωσης eth0 Τύπος nic συνδεδεμένο στο δίκτυο lxdbr0:

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

Είναι σημαντικό να σημειωθεί ότι εφόσον στην πραγματικότητα προσθέσαμε τη συσκευή στο προφίλ διαμόρφωσης, εάν καθορίσαμε μια στατική διεύθυνση IP στη συσκευή, τότε όλα τα κοντέινερ που θα χρησιμοποιούν αυτό το προφίλ θα μοιράζονται την ίδια διεύθυνση IP. Εάν υπάρχει ανάγκη να δημιουργήσετε ένα κοντέινερ με μια στατική διεύθυνση IP που έχει εκχωρηθεί για το κοντέινερ, τότε θα πρέπει να δημιουργήσετε μια διαμόρφωση συσκευής δικτύου σε επίπεδο κοντέινερ (τοπική διαμόρφωση) με την παράμετρο διεύθυνσης IP και όχι σε επίπεδο προφίλ.

Ας ελέγξουμε το προφίλ:

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

Σε αυτό το προφίλ μπορούμε να δούμε ότι για όλα τα κοντέινερ που δημιουργήθηκαν πρόσφατα θα δημιουργηθούν δύο συσκευές:

  • eth0 - Τύπος συσκευής nic συνδεδεμένο σε διακόπτη (γέφυρα δικτύου) lxdbr0
  • root - Τύπος συσκευής disk που χρησιμοποιεί μια πισίνα αποθήκευσης ssdpool

Δημιουργία νέων προφίλ ^

Για χρήση που δημιουργήθηκε προηγουμένως πισίνα αποθήκευσης κοντέινερ, δημιουργήστε ένα προφίλ διαμόρφωσης ssdroot στο οποίο θα προσθέσουμε μια συσκευή όπως disk με σημείο τοποθέτησης / (root) χρησιμοποιώντας το προηγουμένως δημιουργημένο πισίνα αποθήκευσης - ssdpool:

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

Ομοίως, δημιουργούμε μια συσκευή όπως disk, αλλά σε αυτήν την περίπτωση χρησιμοποιώντας πισίνα αποθήκευσης - hddpool:

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

Έλεγχος προφίλ διαμόρφωσης:

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

Αποθετήριο εικόνων ^

Τα κοντέινερ δημιουργούνται από εικόνες που είναι ειδικά συναρμολογημένες διανομές που δεν έχουν πυρήνα Linux. Επομένως, πριν από την εκτέλεση του κοντέινερ, πρέπει να αναπτυχθεί από αυτήν την εικόνα. Η πηγή των εικόνων είναι ένα τοπικό αποθετήριο στο οποίο γίνεται λήψη εικόνων από εξωτερικά αποθετήρια.

Απομακρυσμένα αποθετήρια εικόνων ^

Από προεπιλογή, το LXD έχει ρυθμιστεί να λαμβάνει εικόνες από τρεις απομακρυσμένες πηγές:

  • ubuntu: (για σταθερές εικόνες Ubuntu)
  • ubuntu-καθημερινά: (για καθημερινές εικόνες Ubuntu)
  • εικόνες: (για ένα σωρό άλλες διανομές)

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    |
+-----------------+------------------------------------------+--------+--------+

Για παράδειγμα, αποθετήριο ubuntu: έχει τις παρακάτω εικόνες:

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  |
+----------------------------------------------+--------------+----------+------------+

Για να εμφανίσουμε έναν περιορισμένο αριθμό στηλών χρησιμοποιήσαμε την επιλογή -c με παραμέτρους dasut, και περιόρισε επίσης το μήκος της λίστας με την εντολή head.

Το φιλτράρισμα είναι διαθέσιμο για την εμφάνιση μιας λίστας εικόνων. Η ακόλουθη εντολή θα εμφανίσει όλες τις διαθέσιμες αρχιτεκτονικές διανομής 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        |
+------------------------------+--------------------------------------+--------------+

Τοπικό αποθετήριο εικόνων ^

Για να ξεκινήσετε να χρησιμοποιείτε το κοντέινερ, πρέπει να προσθέσετε μια εικόνα από το καθολικό αποθετήριο στο τοπικό local:. Τώρα το τοπικό αποθετήριο είναι άδειο, η εντολή θα βεβαιωθεί για αυτό lxc image list. Εάν η μέθοδος list μην καθορίσετε αποθετήριο, τότε το τοπικό αποθετήριο θα χρησιμοποιηθεί από προεπιλογή - local:

lxc image list local:

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

Η διαχείριση των εικόνων στο αποθετήριο γίνεται με τις ακόλουθες μεθόδους:

Ομάδα
Περιγραφή

εικόνα lxc ψευδώνυμο
Διαχείριση ψευδώνυμων εικόνων

εικόνα lxc αντίγραφο
Αντιγραφή εικόνων μεταξύ διακομιστών

εικόνα lxc διαγράψετε
Διαγραφή εικόνων

εικόνα lxc Επεξεργασία
Επεξεργασία ιδιοτήτων εικόνας

εικόνα lxc εξαγωγή
Εξαγωγή και λήψη εικόνων

εικόνα lxc εισαγωγή
Εισαγωγή εικόνων στο κατάστημα εικόνων

εικόνα lxc πληροφορίες
Εμφάνιση χρήσιμων πληροφοριών σχετικά με εικόνες

εικόνα lxc λίστα
Λίστα εικόνων

εικόνα lxc ανανέωσης
Ανανέωση εικόνων

εικόνα lxc δείχνουν
Εμφάνιση ιδιοτήτων εικόνας

Αντιγράψτε την εικόνα στο τοπικό αποθετήριο από το καθολικό images::

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

Image copied successfully!

Ας εμφανίσουμε μια λίστα με όλες τις εικόνες που είναι διαθέσιμες αυτήν τη στιγμή στο τοπικό αποθετήριο local::

lxc image -c lfdatsu list local:

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

Διαμόρφωση LXD ^

Εκτός από τη διαδραστική λειτουργία, το LXD υποστηρίζει επίσης μια μη διαδραστική λειτουργία εγκατάστασης διαμόρφωσης, αυτή είναι όταν η διαμόρφωση καθορίζεται με τη μορφή αρχείου YAML, μια ειδική μορφή που σας επιτρέπει να εγκαταστήσετε ολόκληρη τη διαμόρφωση ταυτόχρονα, παρακάμπτοντας την εκτέλεση από πολλές διαδραστικές εντολές που συζητήθηκαν παραπάνω σε αυτό το άρθρο, συμπεριλαμβανομένης της διαμόρφωσης δικτύου, της δημιουργίας προφίλ διαμόρφωσης κ.λπ. Δεν θα καλύψουμε αυτήν την περιοχή εδώ, μπορείτε να την ελέγξετε μόνοι σας. στην τεκμηρίωση.

Επόμενη διαδραστική εντολή lxc config που θα δούμε σας επιτρέπει να ορίσετε τη διαμόρφωση. Για παράδειγμα, για να διασφαλίσουμε ότι οι ληφθείσες εικόνες στο τοπικό αποθετήριο δεν ενημερώνονται αυτόματα από τα καθολικά αποθετήρια, μπορούμε να ενεργοποιήσουμε αυτήν τη συμπεριφορά με την ακόλουθη εντολή:

lxc config set images.auto_update_cached=false

Δημιουργία και διαχείριση κοντέινερ ^

Για να δημιουργήσετε ένα κοντέινερ χρησιμοποιήστε την εντολή lxc init στις οποίες μεταβιβάζονται οι τιμές репозиторий:образ και μετά το επιθυμητό αναγνωριστικό για το κοντέινερ. Το αποθετήριο μπορεί να οριστεί ως τοπικό local: το ίδιο και κάθε παγκόσμιο. Εάν το αποθετήριο δεν έχει καθοριστεί, τότε από προεπιλογή το τοπικό αποθετήριο χρησιμοποιείται για την αναζήτηση της εικόνας. Εάν η εικόνα έχει καθοριστεί από το καθολικό αποθετήριο, τότε η εικόνα θα μεταφορτωθεί πρώτα στο τοπικό αποθετήριο και στη συνέχεια θα χρησιμοποιηθεί για τη δημιουργία του κοντέινερ.

Ας εκτελέσουμε την ακόλουθη εντολή για να δημιουργήσουμε το πρώτο μας κοντέινερ:

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

Ας δούμε τα πλήκτρα εντολών που χρησιμοποιούμε εδώ με τη σειρά:

  • alpine3 — Καθορίζεται ένα ψευδώνυμο (ψευδώνυμο) για την εικόνα που είχε προηγουμένως μεταφορτωθεί στο τοπικό αποθετήριο. Εάν το ψευδώνυμο δεν δημιουργήθηκε για αυτήν την εικόνα, τότε μπορείτε πάντα να ανατρέχετε στην εικόνα από αυτήν Δακτυλικό αποτύπωμα που εμφανίζεται στον πίνακα.
  • alp — Ορίζει το αναγνωριστικό για το κοντέινερ
  • --storage — Αυτό το πλήκτρο υποδεικνύει σε ποια πισίνα αποθήκευσης θα δημιουργηθεί ένα δοχείο
  • --profile — Αυτά τα πλήκτρα διαδοχικά εφαρμόζουν διαμόρφωση από προφίλ διαμόρφωσης που δημιουργήθηκαν προηγουμένως στο κοντέινερ

Εκκινούμε το κοντέινερ, το οποίο ξεκινά να εκκινεί το αρχικό σύστημα της διανομής:

lxc start alp

Μπορείτε επίσης να χρησιμοποιήσετε την εντολή lxc launch που σας επιτρέπει να συνδυάζετε ομάδες lxc init и lxc start σε μια επέμβαση.

Έλεγχος της κατάστασης του δοχείου:

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

Έλεγχος της διαμόρφωσης του κοντέινερ:

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: ""

Στην ενότητα profiles μπορούμε να βεβαιωθούμε ότι αυτό το κοντέινερ χρησιμοποιεί δύο προφίλ διαμόρφωσης − default и hddroot. Στο τμήμα devices μπορούμε να εντοπίσουμε μόνο μία συσκευή επειδή η συσκευή δικτύου δημιουργήθηκε σε επίπεδο προφίλ default. Για να δείτε όλες τις συσκευές που χρησιμοποιούνται από το κοντέινερ, πρέπει να προσθέσετε ένα κλειδί --expanded:

lxc config show alp --expanded

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:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: /
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

Ορισμός στατικής διεύθυνσης IP ^

Εάν προσπαθήσουμε να ορίσουμε μια διεύθυνση IP για μια συσκευή δικτύου eth0 ομάδα lxc config device set alp που προορίζεται για τη διαμόρφωση του κοντέινερ, τότε θα λάβουμε ένα σφάλμα που θα αναφέρει ότι η συσκευή δεν υπάρχει επειδή η συσκευή eth0 που χρησιμοποιείται από το δοχείο ανήκει στο προφίλ default:

lxc config device set alp eth0 ipv4.address 10.0.5.5

Error: The device doesn't exist

Μπορούμε φυσικά να ορίσουμε μια στατική διεύθυνση IP για eth0 συσκευές στο προφίλ, αλλά θα είναι το ίδιο για όλα τα κοντέινερ που θα χρησιμοποιούν αυτό το προφίλ. Επομένως, ας προσθέσουμε μια συσκευή αφιερωμένη στο κοντέινερ:

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

Στη συνέχεια, πρέπει να επανεκκινήσετε το κοντέινερ:

lxc restart alp

Αν κοιτάξουμε τώρα τη διαμόρφωση του κοντέινερ, δεν χρειάζεται να χρησιμοποιήσουμε την επιλογή --expanded για να δείτε τη συσκευή δικτύου eth0, αφού το δημιουργήσαμε σε επίπεδο κοντέινερ και πέρασε σε καταρράκτη στην ίδια συσκευή από το προφίλ 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: ""

Αφαίρεση δοχείου ^

Για να αφαιρέσετε ένα κοντέινερ, χρησιμοποιήστε την εντολή lxc delete, αλλά πριν αφαιρέσετε το κοντέινερ, πρέπει να σταματήσει χρησιμοποιώντας την εντολή lxc stop:

lxc stop alp

lxc list

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

Αφού επαληθεύσουμε ότι η κατάσταση του κοντέινερ έχει γίνει ΣΤΑΜΑΤΗΣΕ, μπορεί να αφαιρεθεί από πισίνα αποθήκευσης:

lxc delete alp

Πρόσβαση σε κοντέινερ ^

Για να εκτελέσετε απευθείας εντολές σε ένα κοντέινερ, παρακάμπτοντας τις συνδέσεις δικτύου, χρησιμοποιήστε την εντολή lxc exec που εκτελεί εντολές στο κοντέινερ χωρίς να εκκινήσει το κέλυφος του συστήματος. Εάν χρειάζεται να εκτελέσετε μια εντολή σε ένα φλοιό χρησιμοποιώντας μοτίβα φλοιού όπως μεταβλητές, ανακατευθύνσεις αρχείων (σωλήνας) κ.λπ., τότε πρέπει να εκκινήσετε ρητά το φλοιό και να περάσετε την εντολή ως κλειδί, για παράδειγμα:

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

Η εντολή χρησιμοποιούσε έναν ειδικό χαρακτήρα διαφυγής για ιδιαίτερο χαρακτήρα $ ώστε η μεταβλητή $HOME δεν ερμηνεύτηκε στον κεντρικό υπολογιστή, αλλά ερμηνεύτηκε μόνο μέσα στο δοχείο.

Είναι επίσης δυνατό να ξεκινήσετε τη διαδραστική λειτουργία κελύφους και στη συνέχεια να τερματίσετε τη συνεδρία εκτελώντας το πλήκτρο πρόσβασης CTRL+D:

lxc exec alp -- /bin/sh

Διαχείριση πόρων κοντέινερ ^

Στο LXD, μπορείτε να διαχειριστείτε πόρους κοντέινερ χρησιμοποιώντας ένα ειδικό σύνολο ρυθμίσεων. Μπορείτε να βρείτε μια πλήρη λίστα παραμέτρων διαμόρφωσης κοντέινερ στην τεκμηρίωση.

Περιορισμός πόρων RAM ^

Παράμετρος limits.memory περιορίζει την ποσότητα μνήμης RAM που είναι διαθέσιμη στο κοντέινερ. Η τιμή είναι ένας αριθμός και ένα από διαθέσιμα επιθήματα.

Ας ορίσουμε το όριο RAM του κοντέινερ στα 256 MB:

lxc config set alp limits.memory 256MB

Επίσης, υπάρχουν και άλλες παράμετροι για τον περιορισμό της μνήμης:

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

Ομάδα lxc config show σας επιτρέπει να εμφανίσετε ολόκληρη τη διαμόρφωση του κοντέινερ, συμπεριλαμβανομένου του εφαρμοζόμενου ορίου πόρων που ορίστηκε:

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: ""

Όριο πόρων CPU ^

Υπάρχουν διάφοροι τρόποι περιορισμού των πόρων της CPU. τύπους περιορισμών:

  • limit.cpu - συνδέει ένα δοχείο σε έναν ή περισσότερους πυρήνες CPU
  • limits.cpu.allowance - διαχειρίζεται είτε τα ποσοστά προγραμματιστή CFS όταν έχει παρέλθει το χρονικό όριο είτε τον καθολικό μηχανισμό κοινής χρήσης πόρων της CPU όταν έχει παρέλθει το ποσοστό
  • limits.cpu.priority - Προτεραιότητα προγραμματιστή όταν σε πολλαπλές παρουσίες που μοιράζονται ένα σύνολο επεξεργαστών εκχωρείται το ίδιο ποσοστό επεξεργαστών

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: ""

Περιορισμός χώρου στο δίσκο ^

Εκτός από περιορισμούς όπως limits.read, limits.write μπορούμε επίσης να περιορίσουμε την ποσότητα του χώρου στο δίσκο που καταναλώνεται από το κοντέινερ (λειτουργεί μόνο με ZFS ή BTRFS):

lxc config device set alp root size=2GB

Μετά την εγκατάσταση, στην παράμετρο devices.root.size Μπορούμε να επαληθεύσουμε το καθορισμένο όριο:

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

Για να προβάλουμε τα χρησιμοποιημένα όρια δίσκου μπορούμε να πάρουμε από την εντολή 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

Παρά το γεγονός ότι έχουμε θέσει ένα όριο για τη συσκευή root του κοντέινερ στα 2 GB, βοηθητικά προγράμματα συστήματος όπως π.χ. df δεν θα δει αυτόν τον περιορισμό. Για να γίνει αυτό, θα πραγματοποιήσουμε μια μικρή δοκιμή και θα μάθουμε πώς λειτουργεί.

Ας δημιουργήσουμε 2 νέα ίδια δοχεία στο ίδιο πισίνα αποθήκευσης (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         |
+------+---------+------------------+------+-----------+-----------+

Ας δημιουργήσουμε ένα αρχείο 1 GB σε ένα από τα κοντέινερ:

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

Ας βεβαιωθούμε ότι το αρχείο έχει δημιουργηθεί:

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

Αν κοιτάξουμε στο δεύτερο κοντέινερ, ελέγξουμε την ύπαρξη αρχείου στην ίδια θέση, τότε αυτό το αρχείο δεν θα είναι εκεί, κάτι που είναι αναμενόμενο, αφού τα κοντέινερ δημιουργούνται από μόνα τους Όγκος αποθήκευσης στο ίδιο πισίνα αποθήκευσης:

lxc exec alp2 -- ls -lh
total 0

Ας συγκρίνουμε όμως τις αξίες που παράγει df στο ένα και στο άλλο δοχείο:

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% /
...

Συσκευή /dev/loop1 τοποθετείται όπως είναι το ριζικό διαμέρισμα πισίνα αποθήκευσης που χρησιμοποιούν αυτά τα δοχεία, έτσι μοιράζονται τον όγκο του μεταξύ δύο.

Στατιστικά στοιχεία κατανάλωσης πόρων ^

Μπορείτε να προβάλετε στατιστικά στοιχεία κατανάλωσης πόρων για ένα κοντέινερ χρησιμοποιώντας την εντολή:

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

Εργασία με στιγμιότυπα ^

Το LXD έχει τη δυνατότητα να δημιουργεί στιγμιότυπα και να επαναφέρει την κατάσταση του κοντέινερ από αυτά.

Για να δημιουργήσετε ένα στιγμιότυπο, εκτελέστε την ακόλουθη εντολή:

lxc snapshot alp snapshot1

Η ομάδα lxc snapshot δεν υπάρχει διαθέσιμο κλειδί list, επομένως, για να δείτε τη λίστα των στιγμιότυπων, πρέπει να χρησιμοποιήσετε την εντολή που εμφανίζει γενικές πληροφορίες για το κοντέινερ:

lxc info alp
...
...
Snapshots:
  snapshot1 (taken at 2020/04/08 18:18 UTC) (stateless)

Μπορείτε να επαναφέρετε ένα κοντέινερ από ένα στιγμιότυπο χρησιμοποιώντας την εντολή lxc restore προσδιορίζοντας το κοντέινερ για το οποίο θα γίνει η αποκατάσταση και το ψευδώνυμο στιγμιότυπο:

lxc restore alp snapshot1

Η ακόλουθη εντολή χρησιμοποιείται για τη διαγραφή ενός στιγμιότυπου. Λάβετε υπόψη ότι η σύνταξη της εντολής δεν είναι παρόμοια με όλες τις άλλες· εδώ πρέπει να καθορίσετε μια κάθετο προς τα εμπρός μετά το όνομα του κοντέινερ. Εάν παραληφθεί η κάθετο, τότε η εντολή διαγραφής στιγμιότυπου ερμηνεύεται ως εντολή διαγραφής κοντέινερ!

lxc delete alp/snapshot1

Στο παραπάνω παράδειγμα, εξετάσαμε τα λεγόμενα στιγμιότυπα χωρίς ιθαγένεια. Το LXD έχει έναν άλλο τύπο στιγμιότυπων - stateful, που αποθηκεύει την τρέχουσα κατάσταση όλων των διεργασιών στο κοντέινερ. Υπάρχει μια σειρά από ενδιαφέρουσες και χρήσιμες λειτουργίες που σχετίζονται με στιγμιότυπα με κατάσταση κατάστασης.

Τι άλλο? ^

  • Μια ενότητα είναι διαθέσιμη για προγραμματιστές Python PyLXD που παρέχει ένα API στο LXD

ΕΝΗΜΕΡΩΣΗ 10.04.2020/15/00 XNUMX:XNUMX: Προστέθηκε η πλοήγηση

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο