LXC ( 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…

§ 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/ – 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 § 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 lxc-alpine § Der Name des Containers und des Namespaces lxc-altlinux lxc-archlinux § und auch der Hostname im Container lxc-busybox § -t lxc-centos lxc-cirros § Templates sind eigentlich nur spezielle Shellskripte lxc-debian - Diese finden sich in /usr/share/lxc/template lxc-download § Fast alle Templates unterstützen eigene Argumente lxc-fedora lxc-gentoo § Diese können mittels "-- - ” lxc-openmandriva übergeben werden lxc-opensuse lxc-oracle § -h lxc-plamo § Dies zeigt eine Kurzanleitung von lxc-create lxc-sshd § Wurde ein Template mit angegeben so werden dessen lxc-ubuntu spezifischen Argumente ebenfalls angezeigt lxc-ubuntu-cloud

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 ... 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 -d lxc-attach lxc-autostart § Startet den Container im Vordergrund lxc-cgroup § mittels -d startet der Container im Hintergrund lxc-checkconfig lxc-clone § lxc-stop -n lxc-config lxc-console § Fährt das Gast-OS sauber herunter und beendet den LXC lxc-create § nach 60 Sek wird der Container dann jedoch gekillt lxc-destroy lxc-device lxc-execute lxc-freeze lxc-info § lxc-console -n lxc-ls § Verbindet zu einem Terminal im Container lxc-monitor lxc-snapshot § "Ctrl-a q” beendet die Verbindung mit dem Terminal lxc-start lxc-start-ephemeral § lxc-destroy –n -f lxc-stop § Zerstört (löscht) den Container aus dem Filesystem lxc-unfreeze lxc-unshare § -f (force) wird benötigt sollte der Container laufen lxc-usernsexec lxc-wait

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,… ─┬─acpid § mnt - Mount points, Filesysteme ├─atd … § uts - Hostname ├─sshd─┬─sshd───bash § user - UIDs │ └─sshd───bash───pstree § ipc - System V IPC ├─start_all.py─── ├─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 § 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 - 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