LXC (Linux Container) Ein Überblick
Bernhard Wesely Trivadis Wien
BASEL BERN BRUGES LAUSANNE ZÜRICH DÜSSELDORF FRANKFURT A.M. FREIBURG I.BR. HAMBURG MUNICH STUTTGART VIENNA
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 AGENDA
1. Allgemeines 2. LXC Grundlagen § wie man an so einen Container kommt… 3. LXC Fortgeschrittenes § ein bisschen Hintergrundinformation… 4. Resourcen Management § ein wichtiges Thema in virtualisierten Umgebungen 5. Scripting § Weil es einfach ist, sinnvoll ist und Spass macht... 6. Zusammenfassung
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Allgemeines
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Virtualisationstechnologien
§ Viele unterschiedliche Vitualisationstechniken existieren § Die mit der meisten Verbreitung sind…
§ Hypervisor Virtualisation § Kernel-Level Virtualisation § VMWare, OracleVM § Solaris Zones § LDOMs, PowerVM § LXC § … § KVM,…
Virtual Virtual Virtual Container Container Container Machine Machine Machine
Root FS Root FS Root FS Kernel Kernel Kernel
Hypervisor Kernel Hardware Hardware
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 LXC Grundlagen
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 LXC - Linux Container
§ LXC ist eine recht einfache Lösung § Während dem Start eines Containers passiert folgendes: § Holen eines neuen Namespaces aus jeder Namespaceklasse § Einbinden des rootfs Verzeichnises in den Container als /-Filesystem § Erstellen einer cgroup in jeder cgroup Klasse § LXC speichert alle Container an einem zentralen Ort § /var/lib/lxc – unter Ubuntu § /container – unter Oracle Linux § Für jeden Container wird dort ein Verzeichnis (Container Name) erstellt § In diesem Verzeichnis befinden sich - Das Config-File (namens config) und - ein rootfs Verzeichnis § Schliesslich wird eine Basis-Betriebssysteminstallation in dem rootfs Verzeichnis durchgeführt
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Voraussetzungen root@lxc01:~# lxc-checkconfig § LXC ist eigentlich nur ein Frontend für ein Kernel configuration not found at /proc/config.gz; searching... paar Kernel-Features Kernel configuration found at /boot/config-3.13.0-35-generic --- Namespaces --- § Der Kernel muss daher folgendes Namespaces: enabled unterstützen Utsname namespace: enabled Ipc namespace: enabled § Namespaces Pid namespace: enabled User namespace: enabled § cgroups Network namespace: enabled § Special Network settings Multiple /dev/pts instances: enabled
--- Control groups --- § Die Userspace tools müssen installiert sein Cgroup: enabled Cgroup clone_children flag: enabled § Oracle Linux: yum install lxc Cgroup device: enabled § Ubuntu: apt-get install lxc Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: enabled Cgroup cpuset: enabled § Der Befehl lxc-checkconfig überprüft ob --- Misc --- alle Voraussetzungen erfüllt sind Veth pair device: enabled Macvlan: enabled § Einfacher wird’s wirklich nicht mehr... ;-) Vlan: enabled File capabilities: enabled
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Ertellen eines Containers (1/2)
§ Container werden mittels des lxc-create Kommandos erstellt § erwartet werden mindestens zwei Argumente Standard-Templates: § -n
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Erstellen eines Containers (2/2) root@lxc03:~# lxc-create -n cn-ol5u10 -t oracle -- -R 5.10 Host is Ubuntu 14.04 Create configuration file /var/lib/lxc/cn-ol5u10/config Downloading release 5.10 for x86_64 ... Setting up Install Process ... Downloading Packages: (1/121): MAKEDEV-3.23-1.2.x86_64.rpm | 135 kB 00:00 (121/121): zlib-1.2.3-7.el5.x86_64.rpm | 52 kB 00:00 ------Total 2.0 MB/s | 82 MB 00:41 ... Running Transaction Installing : libgcc-4.1.2-54.el5.x86_64 1/121 Installing : rootfiles-8.1-1.1.1.noarch 121/121 ... Complete! Fixing (downgrading) rpm database from version 9 Rebuilding rpm database Patching container rootfs /var/lib/lxc/cn-ol5u10/rootfs for Oracle Linux 5.10 Configuring container for Oracle Linux 5.10 Added container user:oracle password:oracle Added container user:root password:root Container : /var/lib/lxc/cn-ol5u10/rootfs Config : /var/lib/lxc/cn-ol5u10/config Network : eth0 (veth) on virbr0
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Container Starten / Stoppen / Einloggen
Verfügbare Befehle: § lxc-start -n
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Container Config File
§ Standard Config File für einen Oracle Linux (5u10) Container root@lxc03:/var/lib/lxc/cn-ol5u10# cat config # Template used: /usr/share/lxc/templates/lxc-oracle # Parameters passed to the template: -R 5.10 # For additional config options, please look at lxc.container.conf(5) lxc.network.type = veth lxc.network.flags = up lxc.network.link = lxcbr0 lxc.network.hwaddr = 00:16:3e:f3:cf:81 lxc.rootfs = /var/lib/lxc/cn-ol5u10/rootfs # Common configuration lxc.include = /usr/share/lxc/config/oracle.common.conf # Container configuration for Oracle Linux 5.10 lxc.arch = x86_64 lxc.utsname = cn-ol5u10 lxc.cap.drop = sys_resource # Networking lxc.network.name = eth0 lxc.network.mtu = 1500 lxc.network.hwaddr = fe:21:d6:47:3a:20
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 LXC Fortgeschrittenes
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Linux Namespaces
§ LXC verwendet Linux Namespaces um Prozesse zu kapseln § Namespaces für diverse Identifier wurden in den Linux Kernel hinzugefügt § pid - Prozesse root@lxc03:~# pstree § net - Netzwerk-Interfaces,… init─┬─acpid § mnt - Mount points, Filesysteme ├─atd … § uts - Hostname ├─sshd─┬─sshd───bash § user - UIDs │ └─sshd───bash───pstree § ipc - System V IPC ├─start_all.py───systemd ├─start_all.py───init─┬─dhclient │ ├─5*[mingetty] § Namespaces erlauben es einen │ ├─rsyslogd───3*[{rsyslogd}] │ └─sshd Namen einmal pro Namespace ├─start_all.py───init─┬─cron │ ├─dhclient wiederzuverwenden (zB. eth0) │ ├─5*[getty] │ ├─ntpdate │ ├─ntpdate───lockfile-create § Neue Prozesse übernehmen den │ ├─ondemand───sleep │ ├─rsyslogd───3*[{rsyslogd}] Namespace ihres Parent-Prozesses … └─sshd § Jeder Container erzeugt einen neuen Namespace und startet darin init § init erzeugt in einem Linux-System jeden weiteren Prozess § Somit läuft der komplette Prozess-Baum in dem neuen Namespace
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Backing Stores
§ lxc-create erlaubt es einen Backing Store zu spezifizieren § in diesem Backing Store liegen dann die Filesysteme § Die folgenden Backing Stores sind verfügbar § none / dir – erzeugt ein rootfs Verzeichnis im Container Verzeichnis § lvm – erzeugt ein neues LV in einer VG (Grösse auswählbar, Standard: 1GB) § btrfs – Erzeugt ein neues SubVolume für den Container § zfs – ähnlich wie btrfs, erzeugt ein neues ZFS Filesystem in einem ZPool § best – versucht der Reihe nach: btrfs, zfs, lvm und als letztes dir § Der Backing Store wird dann das root Filesystem des Containers § ähnlich zu chroot § Abhängig vom verwendeten Backing Store können LXC features wie Snapshots/Clones beschleunigt werden, da die nativen Features des backing Stores dafür verwendet werden
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Networking (1/2)
§ Veth § ain "veth-pair” wird erzeugt § Dies ist eine "network pipe" zwischen zwei Namespaces § Ein veth interface hängt am Host, das andere wechselt seinen Namespace auf den des Containers § Das Host-veth wird dann an eine Bridge angeschlossen § Welche mit Hilfe eines Masquerading Demons die Verbindung zur Aussenwelt herstellt § Dadurch ist es nicht möglich den Container von aussen zu erreichen! § Phys § Das physische Interface wechselt in den Namespace des Containers § Da ein Interface nur in einem Namespace existieren kann, verschwindet es vom Host! § Dies ist eine recht einfache Lösung, limitiert nur durch die Anzahl der Interfaces
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Networking (2/2)
§ macvlan Bridge § Erzeugt eine Bridge vom virtuellem zu dem physischen Interface § Jedes Container Interface wird somit am Netzwerk gesehen § Da sich alle Container eine Bridge teilen, kann jeder Container den anderen erreichen
§ macvlan VEPA § (Virtual Ethernet Port Aggregator) § Ähnlich der macvlan Bridge (nur ohne der Bridge ;-) ) § Containers teilen sich keine Bridge… § …und können sich daher nicht erreichen
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Resourcen Management
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 cgroups (Control Groups)
§ cgroups limitieren Ressourcen auf Prozess-Basis § cgroups sind ein Kernel Feature, Userspace Tools sind verfügbar § 11 cgroups existieren (Kernel 3.13), die interessantesten sind § blkio - beschränkt I/O Durchsatz § cpu, cpuset - beschränkt verfügbare CPUs and CPU Auslastung § devices - beschränkt den Zugriff auf Devices § memory - beschränkt verfügbaren Speicher (RAM) § cgroups werden als virtuelles Filesystem dargestellt § Und müssen daher gemounted sein um root@lxc03:~# lssubsys -ami net_cls verwendet werden zu können net_prio cpuset /sys/fs/cgroup/cpuset § cgroups gehören nicht zu LXC cpu /sys/fs/cgroup/cpu cpuacct /sys/fs/cgroup/cpuacct § LXC verwendet allerdings cgroups memory /sys/fs/cgroup/memory devices /sys/fs/cgroup/devices freezer /sys/fs/cgroup/freezer blkio /sys/fs/cgroup/blkio § Oracle 12c RDBMS hat cgroup support perf_event /sys/fs/cgroup/perf_event § Parameter: processor_group_name hugetlb /sys/fs/cgroup/hugetlb 2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Limitieren von CPU Resourcen
§ Beispiel: limitieren der verfügbaren CPUs für einen Prozess
root@lxc01:~# lscpu | grep list On-line CPU(s) list: 0,1
root@lxc01:~# mkdir /sys/fs/cgroup/cpuset/demo root@lxc01:~# echo $$ > /sys/fs/cgroup/cpuset/demo/tasks
root@lxc01:~# time stress -c 4 -t 30 stress: info: [2891] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd stress: info: [2891] successful run completed in 30s real 0m30.002s user 0m59.813s sys 0m0.000s
root@lxc01:~# echo "0" > /sys/fs/cgroup/cpuset/demo/cpuset.cpus
root@lxc01:~# time stress -c 4 -t 30 stress: info: [2903] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd stress: info: [2903] successful run completed in 30s real 0m30.003s user 0m29.833s sys 0m0.001s
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Limitieren von I/O Resourcen
§ Beispiel: limitieren des I/O Durchsatzes eines Pozesses § verwendetes Resource Control: blkio.throttle.read_bps_device § Auch die IOPS eines Prozessen können limitiert werden § Das Resource Control wäre dann: blkio.throttle.read_iops_device
root@lxc01:~# ls -la /dev/sda brw-rw---- 1 root disk 8, 0 Sep 8 15:05 /dev/sda
root@lxc01:~# mkdir /sys/fs/cgroup/blkio/demo root@lxc01:~# echo $$ > /sys/fs/cgroup/blkio/demo/tasks
root@lxc01:~# hdparm -t /dev/sda /dev/sda: Timing buffered disk reads: 1612 MB in 3.01 seconds = 535.72 MB/sec
root@lxc01:~# echo "8:0 10485760" > /sys/fs/cgroup/blkio/demo/blkio.throttle.read_bps_device
root@lxc01:~# hdparm -t /dev/sda /dev/sda: Timing buffered disk reads: 32 MB in 3.11 seconds = 10.30 MB/sec
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 LXC und cgroups root@lxc03:/sys/fs/cgroup# tree -d . ├── blkio │ └── lxc § cgroups werden von LXC per-default │ └── cn-ol5u10 unterstützt ├── cpu │ └── lxc │ └── cn-ol5u10 § Startet ein Container, wird in jedem ├── cpuset │ └── lxc subsystem eine neue cgroup angelegt │ └── cn-ol5u10 ... § Ändern der cgroup-Einstellungen eines Containers § mittels lxc-cgroup kann ein laufender Container beeinflusst werden root@lxc03:/sys/fs/cgroup# lxc-cgroup -n cn-ol5u10 cpuset.cpus 0-1
root@lxc03:/sys/fs/cgroup# lxc-cgroup -n cn-ol5u10 cpuset.cpus 0 root@lxc03:/sys/fs/cgroup# lxc-cgroup -n cn-ol5u10 cpuset.cpus 0
root@lxc03:/sys/fs/cgroup# cat cpuset/lxc/cn-ol5u10/cpuset.cpus 0 § Permanente Änderungen müssen manuell in das config file eingetragen werden lxc.cgroup.cpuset.cpus=0 lxc.cgroup.blkio.throttle.read_bps_device="8:0 10485760" 2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Scripting
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Scripting in Python
§ Die LXC-API ist in mehreren Sprachen verfügbar § Scriptsprachen: Perl, Python, Ruby,… § Kompilierte Sprachen: C/C++, Go,…
§ Die python3-lxc Library ist ziemlich gut, ist allerdings nicht übermässig dokumentiert L § Die "offizielle” Version unterstützt nur Python3 § … es existiert jedoch auch eine Python 2.x Variante
§ Mit der Library wird ein api-test.py Script mitgeliefert, welches einen guten Überblick über die Funktionen und deren Verwendung bietet § Als letzte Rettung kann natürlich auch der Source-Code des Python/C Binding helfen die Library zu verstehen
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Python Scripting Beispiele
§ Starten aller Container import lxc
# for each container available on the system do... for container in lxc.list_containers(as_object=True): if container.running == False: print("starting Container: "+ container.name +"...",end="",Flush=True) container.start() container.wait("RUNNING", 30) print("done") print("all containers started") § Stoppen aller Container import lxc
# for each container available on the system do... for container in lxc.list_containers(as_object=True): if container.running: print("stopping Container: "+ container.name +"...",end="",flush=True) container.shutdown() print("done") print("all containers stopped")
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Zusammenfassung
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Zusammenfassung
§ LXC ist "chroot wie es eigentlich gehören würde" § Linux Container sind eine einfache Virtualisierungslösung § Sie verzichten auf Features zu Gunsten von Geschwindigkeit § Ein paar Dinge funktionieren nicht out-of-the-box und erfordern Anpassungen § Integriertes und einfaches Resource Management § der Container weiss davon allerdings nichts (beabsichtigt) § Der Zugriff auf LXC mittels der API ist einfach § zumindest wenn man nicht vor ein bisschen Source Code zurückschreckt… § Viele Security-Anforderungen können erfüllt werden § Die Komplexität erhöht sich jedoch um ein Vielfaches § (deswegen wurde das Thema hier nicht behandelt)
§ LXC is einfach, robust, anpassbar und macht einfach Spass… J
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Further information ...
LXC Website - https://linuxcontainers.org OL7 LXC - http://docs.oracle.com/cd/E52668_01/E54669/html/ol7-containers.html
2014 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014 Fragen und Antworten... Bernhard Wesely Senior Consultant
Tel: +43 1 332 35 31 – 00 EMail: [email protected]
BASEL BERN BRUGES LAUSANNE ZÜRICH DÜSSELDORF FRANKFURT A.M. FREIBURG I.BR. HAMBURG MUNICH STUTTGART VIENNA
20142013 © Trivadis LXC - ein Überblick - DOAG 2014 20.11.2014