Laborator 7. Virtualizarea bazată pe containere

Cunoștințe și abilități ce vor fi dobândite

  • Interactiunea cu containerele
  • Crearea de noi containere
  • Configurarea retelei pentru containere
  • Interactiunea folosind Virsh

Pregătire infrastructură de laborator

Pentru a pregăti configurația de laborator va trebui să descărcați pe mașina fizică (mjolnir), în directorul saisp/, arhiva laboratorului:

student@mjolnir:~$ cd saisp/
student@mjolnir:~/saisp$ wget --user=user-curs --ask-password http://repository.grid.pub.ro/cs/saisp/laboratoare/lab-07.zip
student@mjolnir:~/saisp$ unzip lab-07.zip

În urma dezarhivării rezultă mai multe fișiere imagine KVM și un script de pornire a mașinilor virtuale:

  • Imaginea de bază base.qcow2 este deja în directorul saisp/ și este baza pentru celelalte.
  • Fișierul saisp-vm-1.qcow2 este obținut din base.qcow2 și este folosit pentru pornirea masinii virtuale.

Pentru a porni mașina virtuala, vom folosi comanda:

student@mjolnir:~/saisp$ ./lab07-start-kvm

După pornirea mașinii virtuale KVM, o putem accesa prin folosirea SSH către adresa IP aferenta. Vom folosi comanda:

student@mjolnir:~/saisp$ ssh root@10.0.0.10

Exerciții

01. [5p] Introducere

LXC este o implementare pentru Linux a virtualizarii la nivelul sistemului de operare. Incepand cu versiunea 2.6.29 a nucleului Linux, este integrata in mainline, ceea ce inseamna ca orice imagine de nucleu Linux poate oferi suport pentru LXC.

Cele mai importante aspecte legate de LXC si virtualizarea la nivelul sistemului de operare sunt:

  • “masina fizica” se numeste hardware node;
  • “masinile virtuale” se numesc containere;
  • nucleul este partajat intre hardware node si containere;
  • fiecare container poseda:
    • ierarhie de fisiere izolata;
    • spatiu de procese izolat;
    • fisier de configurare (in care se specifica parametrii specifici - retea, consola etc.).

Verificati daca nucleul din masina gazda (saisp-vm-1) suporta LXC, folosind comanda lxc-checkconfig.

Apoi, verificati daca sistemul de fisiere virtual de tip “cgroup” este montat.

02. [20p] Interactiunea cu containerele

Masina virtuala saisp-vm-1 contine un container deja creat, cu numele ct1.

Folosind comanda lxc-start, vom porni containerul:

root@saisp-vm-1:~# lxc-start -n ct1
 
INIT: version 2.88 booting
Using makefile-style concurrent boot in runlevel S.
Cleaning up ifupdown....
Setting up networking....
Activating lvm and md swap...done.
Checking file systems...fsck from util-linux-ng 2.17.2
done.
Mounting local filesystems...done.
Activating swapfile swap...done.
Cleaning up temporary files....
Setting kernel variables ...done.
...
Cleaning up temporary files....
INIT: Entering runlevel: 3
Using makefile-style concurrent boot in runlevel 3.
Starting OpenBSD Secure Shell server: sshd.
 
Debian GNU/Linux 6.0 ct1 console
 
ct1 login: 

Observam ca terminalul este atasat la container, acesta fiind pornit in foreground.

Pentru a va loga in container, folositi credentialele root / root.

Vom opri containerul din interiorul acestuia, ca pe orice statie Linux, folosind halt:

root@ct1:~# halt     
 
Broadcast message from root@ct1 (console) (Sun Apr 13 18:22:16 2014):
 
The system is going down for system halt NOW!
INIT: Switching to runlevel: 0
INIT: Sending processes the TERM signal
root@ct1:~# Using makefile-style concurrent boot in runlevel 0.
mount: / is busy
root@saisp-vm-1:~#

O varianta mai comoda este pornirea containerului in background. Vom adauga parametrul -d la comanda lxc-start:

root@saisp-vm-1:~# lxc-start -n ct1 -d

Verificam starea containerului folosind lxc-info:

root@saisp-vm-1:~# lxc-info -n ct1
state:   RUNNING
pid:      8269

Pentru a putea interactiona cu un container pornit in background, trebuie sa ne conectam la consola acestuia. Folosim comanda lxc-console:

root@saisp-vm-1:~# lxc-console -n ct1
 
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself
 
Debian GNU/Linux 6.0 ct1 tty1
 
ct1 login: 

Apoi, ne putem deconecta, fara a opri containerul, folosind combinatie de taste CTRL+A, Q.

03. [10p] Spatiul de procese

Folositi comanda lxc-info pentru a afla PID-ul containerului ct1. Acest PID este al procesului init corespunzator containerului. Restul proceselor din container vor fi copii ai acestui proces init.

Atasati-va la consola containerului, logati-va, apoi detasati-va de la consola.

Pe saisp-vm-1, afisati intreaga ierarhie de procese:

root@saisp-vm-1:~# pstree -p
init(1)─┬─acpid(1542)
        ├─atd(1565)
        ├─cron(1652)
        ├─dbus-daemon(1602)
        ├─exim4(1902)
        ├─getty(1959)
        ├─getty(1960)
        ├─getty(1961)
        ├─getty(1962)
        ├─getty(1963)
        ├─getty(1964)
        ├─lxc-start(8267)───init(8269)─┬─getty(8508)
        │                              ├─getty(8510)
        │                              ├─getty(8511)
        │                              ├─getty(8512)
        │                              ├─login(8509)───bash(8751)
        │                              └─sshd(8478)
        ├─rpc.idmapd(1237)
        ├─rpc.statd(1223)
        ├─rpcbind(1195)
        ├─rsyslogd(1480)─┬─{rsyslogd}(1485)
        │                ├─{rsyslogd}(1486)
        │                └─{rsyslogd}(1487)
        ├─sshd(1935)───sshd(1965)───bash(1967)───pstree(8762)
        └─udevd(280)

Observati ca procesul init corespunzator containerului este copil al procesului lxc-start.

Putem afisa ierarhia de procese pentru un container si folosind comanda lxc-ps:

root@saisp-vm-1:~# lxc-ps -n ct1 --forest
CONTAINER   PID TTY          TIME CMD
ct1        8269 ?        00:00:00  \_ init
ct1        8478 ?        00:00:00      \_ sshd
ct1        8508 pts/5    00:00:00      \_ getty
ct1        8509 pts/1    00:00:00      \_ login
ct1        8751 pts/1    00:00:00      |   \_ bash
ct1        8510 pts/2    00:00:00      \_ getty
ct1        8511 pts/3    00:00:00      \_ getty
ct1        8512 pts/4    00:00:00      \_ getty

Apoi, conectati-va la consola containerului si afisati procesele din interiorul acestuia:

root@ct1:~# ps -ef     
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 18:34 ?        00:00:00 init [3]  
root       182     1  0 18:34 ?        00:00:00 /usr/sbin/sshd
root       212     1  0 18:34 console  00:00:00 /sbin/getty 38400 console
root       213     1  0 18:34 tty1     00:00:00 /bin/login --     
root       214     1  0 18:34 tty2     00:00:00 /sbin/getty 38400 tty2 linux
root       215     1  0 18:34 tty3     00:00:00 /sbin/getty 38400 tty3 linux
root       216     1  0 18:34 tty4     00:00:00 /sbin/getty 38400 tty4 linux
root       217   213  0 18:53 tty1     00:00:00 -bash
root       228   217  0 19:00 tty1     00:00:00 ps -ef

Observati ca desi apar aceleasi procese, valorile PID-urilor difera in interiorul containerului si in exteriorul acestuia. Practic, se produce o translatie la nivelul spatiului de procese.

04. [10p] Sistemul de fisiere

Sistemul de fisiere al unui container se gaseste stocat pe masina gazda sub calea:

/var/lib/lxc/NUME/rootfs/

Astfel se pot partaja foarte usor fisiere intre containere si masina gazda:

  • In container, creati un fisier in directorul /root/.
  • In masina gazda (statia saisp-vm-1), accesati fisierul folosind calea descrisa mai sus.
  • Modificati fisierul si salvati-l.
  • In container, deschideti fisierul si observati modificarile.

05. [10p] Crearea containerelor

Pentru a crea in mod facil un container, exista comanda lxc-create. Aceasta:

  • creaza un fisier de configurare minimal;
  • creaza sistemul de fisiere al containerului, descarcand pachetele corespunzatoare din repository.

Sintaxa comenzii este:

lxc-create -n NUME -t TIP

unde TIP poate fi ales dintre busybox, debian, fedora, sshd etc.

In urma crearii containerului, va rezulta directorul cu numele /var/lib/lxc/NUME, ce contine:

  • fisierul de configurare - config
  • sistemul de fisiere - rootfs/

Creati un nou container, de tip debian, cu numele ct2.

Verificati ca a fost creat, folosind lxc-ls:

root@saisp-vm-1:~# lxc-ls 
ct1  ct2

Inspectati fisierul de configurare creat:

root@saisp-vm-1:~# cat /var/lib/lxc/ct2/config

Apoi:

  • porniti containerul in background
  • afisati, pe statia saisp-vm-1, ierarhia de procese si observati procesele corespunzatoare celor 2 containere.
  • opriti cele doua containere, folosind comanda lxc-stop.

06. [25p] Networking

In mod implicit, un container are doar o interfata de loopback. Daca dorim sa il conectam cu “exteriorul”, trebuie sa ii adaugam o interfata Ethernet.

Vom adauga urmatoarele linii in fisierul de configurare al containerului ct1:

lxc.network.type = veth           # Virtual ethernet - virtualizare la nivel 2
lxc.network.flags = up            # Interfata va fi "up"
lxc.network.link = br0            # Containerul va fi legat intr-un "bridge" din masina gazda.
lxc.network.name = eth0           # Numele interfetei "vazut" in container.
lxc.network.veth.pair = veth0-ct1 # Numele interfetei "vazut" pe masina fizica.

Nu adaugati si comentariile de la sfarsitul liniilor, deoarece nu sunt permise de sintaxa lxc.

Analog, editati fisierul de configurare al containerului ct2. Pentru atributul lxc.network.veth.pair specificati valoarea veth0-ct2.

In prealabil, bridge-ul br0 trebuie creat pe masina gazda, folosind comanda brctl:

root@saisp-vm-1:~# brctl addbr br0
root@saisp-vm-1:~# ifconfig br0 up

Porniti cele doua containere in background, apoi verificati ca intefetele virtuale au fost adaugate in bridge:

root@saisp-vm-1:~# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.fe6d63702103       no              veth0-ct1
                                                        veth0-ct2

Alocati adrese IP din spatiul 192.168.1.0/24 pentru:

  • interfata br0 de pe masina gazda
  • interfata eth0 de pe containerul ct1
  • interfata eth0 de pe containerul ct2

Apoi, testati conectivitatea prin ping de pe masina gazda catre cele 2 containere.

Pentru a avea conectivitate din containere catre Internet, trebuie sa configuram NAT si sa activam rutarea pe masina gazda:

root@saisp-vm-1:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
root@saisp-vm-1:~# echo 1 > /proc/sys/net/ipv4/ip_forward 

Apoi, pe cele doua containere adaugati ruta default si testati conectivitatea.

07. [20p] Interactiune folosind Virsh

Virsh este capabil sa gestioneze si containere LXC. Deosebirea este ca nu tine seama de fisierul de configurare creat de lxc-create, ci foloseste propriul fisier de configurare, in format XML.

Creati un nou container, de tip debian, cu numele ct3. Nu porniti containerul.

Creati un fisier XML ce va fi folosit in Virsh, dupa modelul de mai jos:

<domain type='lxc'>
  <name>NUME_CONTAINER</name>
  <memory>500000</memory>
  <os>
    <type>exe</type>
    <init>/sbin/init</init>
  </os>
  <vcpu>1</vcpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <interface type='network'>
      <source network='default'/>
    </interface>
    <console type='pty' />
    <filesystem type='mount'>
      <source dir='CALE_CATRE_ROOTFS'/>
      <target dir='/'/>
    </filesystem>
  </devices>
</domain>

Porniti virsh, conectandu-va la URI-ul corespunzator LXC:

root@saisp-vm-1:~# virsh -c lxc:///
Welcome to virsh, the virtualization interactive terminal.
 
Type:  'help' for help with commands
       'quit' to quit
 
virsh # 

In Virsh, efectuati urmatoarele operatii:

  • definiti containerul, folosind fisierul XML creat:
virsh # define ct3.xml
Domain ct3 defined from ct3.xml
  • porniti reteaua virtuala, folosind comanda net-start default
  • porniti containerul:
virsh # start ct3
Domain ct3 started
  • conectati-va la consola containerului:
virsh # console ct3
Connected to domain ct3
Escape character is ^]

Parola de root nu este setata, deci nu va veti putea loga.

  • deconectati-va de la consola, folosind combinatia de taste Ctrl+]
  • listati informatii despre container:
virsh # dominfo ct3
Id:             2603
Name:           ct3
UUID:           27f50e10-99dc-44ce-827d-ed8888115eb4
OS Type:        exe
State:          running
CPU(s):         1
CPU time:       0.5s
Max memory:     500000 KiB
Used memory:    12564 KiB
Persistent:     yes
Autostart:      disable
Managed save:   unknown
Security model: none
Security DOI:   0
  • opriti, apoi stergeti containerul:
virsh # shutdown ct3
virsh # undefine ct3

08. [BONUS - 10p] Script pentru pornire si oprire

Creati un script care primeste 2 parametri:

  • numele containerului
  • actiunea: start sau stop.

Daca actiunea este start:

  • se porneste containerul in background;
  • se asteapta pana containerul termina de bootat (hint: lxc-wait)
  • se afiseaza un mesaj.

Daca actiunea este stop:

  • se comanda oprirea “graceful” a containerului;
  • se asteapta pana containerul se opreste complet;
  • se afiseaza un mesaj

Hint: Folositi lxc-monitor in timp ce porniti un container pentru a vedea prin ce stari trece.

saisp/labs/07.txt · Last modified: 2016/02/28 23:46 by alexandru.carp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0