Το LXD αποτελεί μια τεχνολογία στην οποία πακετάρουμε ένα μικρό λειτουργικό σύστημα Linux (αντί ενός ολόκληρου VM), με τα άκρως απαραίτητα για να χρησιμοποιούμε και να διανέμουμε μια ή πολλές υπηρεσίες ή ένα λογισμικό το οποίο μπορεί να τρέξει τοπικά η σε απομακρυσμένο server.

Πριν αρκετό καιρό είχαμε δημοσιεύσει μια σειρά οδηγών χρήσης του Docker για να χρησιμοποιούμε και να πακετάρουμε Web υπηρεσίες που φτιάχνουμε ως developers. Στο πρώτο μέρος της σειράς είχαμε κάνει μια εκτενή αναφορά και ανάλυση για τo τι είναι και πως προέκυψε η ανάγκη για τα λεγόμενα Containers:

Καλό είναι, σε περίπτωση που είναι η πρώτη φορά που ακούτε όρους όπως «containers», «image», «virtualization» κλπ να διαβάσετε την παραπάνω εισαγωγή μιας και εδώ θα μπούμε αμέσως στο ψητό.

Εισαγωγή στο LXD

Τα Linux Containers τα διαχειρίζεται μια υπηρεσία συστήματος που ονομάζεται LXC (λεξ-σι). Το LXC είναι μια διεπαφή χρήστη το οποίο μέσω ενός API και απλών εργαλείων, επιτρέπει στους χρήστες Linux να δημιουργούν εύκολα και να διαχειρίζονται containers συστημάτων ή εφαρμογών. Tο LXD, το οποίο προφέρεται ως «λεξ-ντι» κάθεται επάνω στο LXC και βοηθάει στην διαχείριση αυτών των container με τρόπο που θυμίζει Virtual Machines.

Τι μπορώ να αντικαταστήσω με το LXD;

Αν διαβάσατε το πρώτο μέρος, θα γνωρίζετε ότι όσοι κάνετε εγκατάσταση Virtual Machines για να πειραματίζεστε με servers η να αναπτύσσετε web εφαρμογές, περιορίζεστε από την διαθέσιμη μνήμη RAM και τους πόρους του host λειτουργικού για το πόσες εικονικές μηχανές μπορείτε να τρέχετε ταυτόχρονα.

Advertisements

Με τα Linux Containers αυτός ο περιορισμός σχεδόν εξαφανίζεται διότι μπορείτε να σηκώσετε π.χ. 10 ubuntu servers σε μερικά δευτερόλεπτα και να τα διαμορφώσετε όπως θέλετε με ελάχιστη κατανάλωση πόρων. Επίσης μπορείτε να δημιουργήσετε snapshots για backups αλλά και images τα οποία μπορείτε να στείλετε με μια εντολή σε κάποιο προρυθμισμένο remote VPS ώστε να είναι έτοιμα για δημόσια χρήση. Επομένως μπορείτε π.χ. να έχετε ένα VPS server το οποίο όμως μέσα τρέχει πολλαπλά Linux Containers και το καθένα να είναι ανεξάρτητο και απομονωμένο εντελώς από τα υπόλοιπα. Αυτό διευκολύνει το backup, την επαναφορά αλλά και την ασφάλεια των web υπηρεσιών σας.

Επίσης, αντί να τρέχετε τα docker container σας στο host, μπορείτε να τα τρέχετε μέσα σε LXC. Αυτό γίνεται λόγο των profile που διαθέτει το LXD, το οποίο συνοδεύεται από δύο προρυθμισμένα προφίλ:

  1. Η «Default» εφαρμόζεται αυτόματα σε όλα τα containers, εκτός εάν παρέχεται από τον χρήστη μια εναλλακτική λίστα από προφίλ. Το default προφίλ καθορίζει μια συσκευή δικτύου «eth0» για το container.
  2. To «Docker» profile είναι ένα προφίλ που μπορείτε να εφαρμόσετε σε ένα container που θέλετε να εκτελέσετε Docker. Ζητάει από το LXD να φορτώσει ορισμένα απαραίτητα module του πυρήνα, ενεργοποιεί την ενθυλάκωση των container και ρυθμίζει μερικές καταχωρήσεις συσκευών.
διαφορές του LXD και του Docker

Τα τελευταία χρόνια, το LXD έχει φτάσει σε σημείο που μπορείτε να κάνετε GPU passthrough, να ¨μιλάει¨ δηλαδή το Linux Container σας με την κάρτα γραφικών για εφαρμογές π.χ. Nvidia CUDA. Επίσης, όπως είχαμε δει, η Google χρησιμοποιεί την τεχνολογία του LXD στο Chrome OS για να μπορούν οι χρήστες του να έχουν πρόσβαση σε Linux εφαρμογές.

Εγκατάσταση και πρώτη ρύθμιση του LXD

LXD σε Ubuntu

Για την εγκατάσταση του LXD σε Ubuntu και συναφείς διανομές, μπορείτε να τρέξετε :

sudo apt install lxd

Η παραπάνω εντολή στην πραγματικότητα, κάνει εγκατάσταση την snap έκδοση του lxd. Μόλις ξεκινήσει η εγκατάσταση θα σας ρωτήσει ποιο κανάλι εκδόσεων του LXD προτιμάτε. Διαλέξτε την έκδοση 3.0 η οποία είναι LTS έκδοση (μακράς διάρκειας υποστήριξης) και λαμβάνει ενημερώσεις ασφαλείας και διορθώσεων.

διαλέξτε την 3.0 LTS και πατήστε enter

LXD σε άλλες διανομές

Για όλες τις άλλες διανομές παρέχεται ως snap package και θα πρέπει να έχετε ρυθμίσει σύμφωνα με τον παρακάτω οδηγό την διανομή σας να μπορεί να διαχειρίζεται snap πακέτα:

Έπειτα τρέχετε:

sudo snap install lxd

LXD σε macOS

To LXD είναι διαθέσιμο για macOS μέσω Homebrew.

brew install lxc

LXD σε Windows

To LXD client για Windows μπορείτε να το βρείτε εδώ.

Εγκατάσταση LXD απο τον πηγαίο κώδικα

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

Πρώτες ρυθμίσεις του LXD

Αφού έχουμε εγκαταστήσει το LXD, θα χρειαστεί να κάνουμε κάποιες ρυθμίσεις.

Φτιάχνουμε το group LXD στο σύστημά μας και προσθέτουμε τον χρήστη μας στην ομάδα αυτή:

sudo groupadd --system lxd
sudo usermod -G lxd -a <όνομα χρήστη>

όπου φυσικά <όνομα χρήστη> βάζουμε το username μας. Ελέγχουμε αν όντως μπήκε βλέποντας αν ο χρήστης μας είναι στο group lxd:

groups <όνομα χρήστη>
                                                                           
όνομα-χρήστη : sudo plugdev sambashare lxd

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

newgrp lxd

Τέλος τρέχουμε το init για να γίνει η πρώτη διαρρύθμιση του LXD:

lxd init

και απαντάμε στις ερωτήσεις.

Μπορούμε να επιβεβαιώσουμε ότι τρέχει το LXC ζητώντας του να μας δώσεις ένα JSON response τρέχοντας:

lxc query --wait -X GET /1.0

{
        "api_extensions": [
                "storage_zfs_remove_snapshots",
                "container_host_shutdown_timeout",
                "container_stop_priority",
                "container_syscall_filtering",
          [........]
                "storage": "btrfs",
                "storage_version": "4.4"
        },
        "public": false
}

Το πρώτο μας LXD container

Η δημιουργία των container με το LXD βασίζεται σε images (στιγμιότυπα). Ωστόσο, από προεπιλογή, δεν έχουν φορτωθεί images στο χώρο αποθήκευσης των image που δημιουργήσαμε με το lxd init όπως φαίνεται με την εντολή:

lxc image list

Το LXD λαμβάνει αυτά τα image από 3 default image servers:

  1. ubuntu: (για σταθερά στιγμιότυπα του Ubuntu)
  2. ubuntu-daily: (για daily images του Ubuntu)
  3. images: (για images φτιαγμένα απο διανομές μη-Ubuntu)

Για το 3 αξίζει να αναφέρουμε ότι μπορείτε να έχετε LXC containers από διανομές όπως:

  • alpine
  • archlinux
  • centos
  • debian
  • devuan
  • fedora
  • gentoo
  • kali
  • opensuse
  • oracle
  • sabayon

και σε διαφορετικές εκδόσεις τους. Μια πλήρης λίστα είναι διαθέσιμη εδώ

Στο παρόν οδηγό χρήσης του LXD / LXC θα βασιστούμε σε Ubuntu images. Εσείς φυσικά δημιουργήστε με όποιο image θέλετε. Οι σταθερές εκδόσεις από images του Ubuntu μπορούν να προβληθούν με τον παρακάτω τρόπο:

lxc image list ubuntu: | less

Για να ξεκινήσετε ένα πρώτο κοντέινερ που θα το ονομάσουμε «titanas» χρησιμοποιώντας ένα έτοιμο image του Ubuntu 18.04 χρησιμοποιήστε την εντολή:

lxc launch ubuntu:18.04 titanas

Επειδή είναι η πρώτη φορά, θα γίνει λήψη του image και έπειτα η αποσυμπίεσή του για την δημιουργία του container. Αν ξανακάνετε την διαδικασία, όπως θα κάνουμε παρακάτω, θα δείτε ότι επειδή το image είναι ήδη στην αποθήκη μας, θα δημιουργηθεί άμεσα.

Πλέον το νέο σας container θα είναι τώρα ορατό στην λίστα:

lxc list

Για να ζητήσετε πληροφορίες σχετικά με την κατάσταση αλλά και τις ρυθμίσεις του μπορείτε να τρέξετε:

lxc info titanas
lxc config show titanas

Περιορισμός πόρων για το Container

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

free -m
lxc exec titanas -- free -m
Όπως βλέπετε ο Τιτάνας έχει πρόσβαση σε όλη την RAM στο PC μου

Αν δουλεύουμε τοπικά, αυτό δεν μας απασχολεί και τόσο. Όμως αν σκοπεύουμε να εκτελούμε το container μας σε κάποιο VPS, μαλλον θα χρειαστεί να βάλουμε έναν περιορισμό.

Για να εφαρμόσετε ένα όριο μνήμης στο container σας, κάντε τo εξής:

lxc config set titanas limits.memory 128MB

Και επιβεβαιώστε ότι έχει εφαρμοστεί με:

lxc exec titanas -- free -m
Τώρα έχει πρόσβαση μόνο σε μέγεθος έως 128MB Ram

Snapshots του Container μας

Το LXD υποστηρίζει την αποθήκευση στιγμιότυπων αλλά και την επαναφορά των στιγμιότυπων των containers. Πριν προχωρήσουμε στην δημιουργία ενός στιγμιότυπου, ας κάνουμε μερικές αλλαγές στο κοντέινερ π.χ. ας κάνουμε ενημερώσεις του συστήματος (θυμίζω ότι είναι ένα minimal Ubuntu λειτουργικό)

lxc exec titanas -- apt update
lxc exec titanas -- apt dist-upgrade -y
lxc exec titanas -- apt autoremove --purge -y

Τώρα που το container μας είναι ενημερωμένο και καθαρισμένο, ας αποθηκεύσουμε ένα στιγμιότυπο αυτής της κατάστασης με όνομα «katharo»:

lxc snapshot titanas katharo

Τώρα, ας προκαλέσουμε μια ζημιά στο container μας:

lxc exec titanas -- rm -Rf /etc /usr

Επιβεβαιώστε ότι έχει γίνει η ζημιά με:

lxc exec titanas -- bash

Error: not found

Και επαναφέρετε τα πάντα στην κατάσταση πριν την πρόκλησης της ζημιάς:

lxc restore titanas katharo

Επιβεβαιώστε ότι έχει επανέλθει στα φυσιολογικά του ο titanas:

lxc exec titanas -- bash

root@titanas:~#

Με την παραπάνω εντολή, αν προσέξετε είστε πλέον μέσα στο Container titanas και μπορείτε να «παίξετε» π.χ. τρέξτε htop για να δείτε την κατανάλωση πόρων ή κάντε εγκατάσταση κάποιο πακέτο, ένα LAMP stack με WordPress κλπ. Για να βγείτε από το container απλά τρέξτε exit. Αν θέλετε να κρατήσετε τις αλλαγές για μετέπειτα μπορείτε να δημιουργήσετε ένα νέο snapshot.

Advertisements

Δημιουργία δικών μας image

Όπως πιθανότατα παρατηρήσατε, το LXD βασίζεται στα έτοιμα images, δηλαδή όλα τα containers πρέπει να δημιουργούνται είτε από ένα αντίγραφο ενός υπάρχοντος container είτε από ένα image.

Μπορείτε να δημιουργήσετε νέα image από ένα υπάρχον container ή απο ένα snapshot κάποιου container.

Πιο πάνω είχαμε δημιουργήσει ένα snapshot του container μας. Για να δημοσιεύσουμε το «katharo» μας snapshot ως ένα νέο image με φιλικό προς το χρήστη ψευδώνυμο π.χ. «clean-ubuntu», τρέξτε:

lxc publish titanas/katharo --alias clean-ubuntu

Σε αυτό το σημείο δεν θα χρειαστούμε πλέον το container «titanas», οπότε το σταματάμε και το διαγράφουμε με

lxc stop titanas
lxc delete titanas

Και τέλος μπορούμε να ξεκινήσουμε ένα νέο container με όνομα dias από τo νέο μας image με:

lxc launch clean-ubuntu dias

Πρόσβαση σε αρχεία από το κοντέινερ

Για να τραβήξετε ένα αρχείο από το container, μπορείτε να χρησιμοποιήσετε την εντολή lxc file pull

lxc file pull dias/etc/hosts .

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

Ας προσθέσουμε μια καταχώρηση στο αρχείο που τραβήξαμε από το container μας:

echo "1.2.3.4 paradigma" >> hosts

Και τώρα ας το στείλουμε πάλι πίσω στο container μας… από εκεί που ήλθε:

lxc file push hosts dias/etc/hosts

Ας επιβεβαιώσουμε ότι είναι μέσα στο container:

lxc exec dias -- cat /etc/hosts

όπου αν το στείλαμε σωστά θα δούμε την καταχώρηση 1.2.3.4 paradigma στο τέλος του αρχείου.

Μπορείτε επίσης να χρησιμοποιήσετε αυτόν τον μηχανισμό για να αποκτήσετε πρόσβαση στα αρχεία καταγραφής του container σας:

lxc file pull dias/var/log/syslog - | less

Δεν θα χρειαστούμε πια αυτό το container, οπότε σταματήστε και διαγράψτε το με… βίαιο τρόπο:

lxc delete --force dias

Χρησιμοποιήστε έναν απομακρυσμένο διακομιστή

Θυμηθείτε, στην αρχή αναφέραμε τους 3 server που ψάχενει για images το LXC. Το lxc λοιπόν υποστηρίζει πολλαπλά «remotes», τα οποία απομακρυσμένα συστήματα μπορούν να είναι διακομιστές των images είτε ως, μόνο για λήψη ή άλλοι και ως LXD servers.

Το upstream LXC τρέχει ένα τέτοιο διακομιστή στο https://images.linuxcontainers.org το οποίο εξυπηρετεί ένα σύνολο αυτόματα παραγόμενων images απο διάφορες διανομές Linux όπως είχαμε δει πιο πάνω.

Μπορείτε να δείτε την λίστα με τα διαθέσιμα images των διανομών αλλά και τις εκδόσεις του με:

lxc image list images: | less

Για δοκιμή δημιουργείστε ένα νέο container από Centos 7 με:

lxc launch images:centos/7 ira

Επιβεβαιώστε ότι είναι πράγματι το Centos 7 με:

lxc exec ira -- cat /etc/redhat-release

Και διαγράψτε το… βίαια:

lxc delete -f ira

Η λίστα όλων των διαμορφωμένων remotes στο σύστημά σας μπορεί να ληφθεί με:

lxc remote list

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

Γραφικό περιβάλλον για τα LXD Containers

Παρότι το τερματικό είναι υπεραρκετό όταν έχεις να διαχειριστείς 3-4 containers σταδιακά, όταν φτιάξετε containers με διαφορετικές διαρρυθμίσεις ίσως να θελήσετε να τα διαχειρίζεστε από ένα γραφικό περιβάλλον. Επίσημα, τουλάχιστον δεν υπάρχει κάποιο γραφικό περιβάλλον παρά μόνο πρόσθετα για cloud διαχειριστές π.χ. Openstack κλπ.

Προφανώς όμως για ένα άτομο που θέλει να τα τρέχει τοπικά η λύσει έχει δοθεί από ανεξάρτητους developers της κοινότητας και έχουν κυκλοφορήσει κάποια Web περιβάλλοντα. Ένα από αυτά είναι το LXDUI

Εγκατάσταση του lxdui

Πρώτα θα πρέπει να κάνουμε εγκατάσταση κάποιες εξαρτήσεις στο Ubuntu

sudo apt install -y git build-essential libssl-dev python3-venv python3-pip python3-dev zfsutils-linux bridge-utils

έπειτα κατεβάζουμε από το github το λογισμικό

git clone https://github.com/AdaptiveScale/lxdui.git 

μπαίνουμε στον φάκελο που κατεβάσαμε μέσα και τρέχουμε την εγκατάσταση

cd lxdui

sudo python3 setup.py install

αφού ολοκληρωθεί, ξεκινάμε το lxdui

sudo lxdui start

Ανοίγουμε τον browser και πηγαίνουμε στο http://127.0.0.1:15151 και βάζουμε για username και password admin/admin

Βλέπουμε λοιπόν ότι έχουμε πρόσβαση στα container που είχαμε φτιάξει αλλά και στα remotes από όπου με ένα κλικ μπορούμε να κάνουμε λήψη και δημιουργία νέων containers. Επίσης μπορούμε να μπούμε μέσα στο container από το browser μας κάνοντας κλικ στην λίστα επιλογών Actions. Για μια πλήρη περιγραφή των δυνατοτήτων του επισκεφτείτε το αποθετήριο του lxdui.

Επίλογος

Ελπίζω ότι το παρών άρθρο σας έκανε μια καλή εισαγωγή στο LXD, τις δυνατότητές του και στο πόσο εύκολο είναι να το χρησιμοποιήσετε. Ελπίζουμε να σας φανεί χρήσιμο στο καθημερινό workflow σας είτε είστε Sysadmin είτε developer είτε θέλετε απλά να απαλλαγείτε από τα πολλά Virtual Machines δοκιμών.

Στο μέλλον, αν υπάρξει ενδιαφέρον θα παρουσιάσουμε και άλλες πτυχές και δυνατότητες του LXD και κατ επέκταση των Linux Containers

Παραπομπές