LXC-Container für Schulserver – 02

Unser altes Server-Equipment erhält als ressourcen­­schonende und nach­hal­tige Linux-Lösung einen Ubuntuserver. Dieser sei zum besseren Handling virtualisiert. Der Veteran Xen als performanter Bare-Metal Hypervisor hat komplizierte LTS-Versionierung; man kann direkter sagen, es gibt keine, außer man zahlt dafür. Auch vollständige Funktionalität ist Open Source nicht greifbar. Mit KVM wird Voll­virtualisierung erreicht, inklusive Hardware­emulation. Könnte unser altes Equipment belasten. Warum nicht zu modernen Systemcontainern greifen?

Container da, aber nicht sichtbar

Wenn ein Container wie im ersten Teil dieser Serie auf dem Host-System (Ubuntuserver) installiert ist, kommt der Katzen­jammer: wie erreicht man diesen im Netzwerk? Erinnerung an die Initialisierung mittels LXD:
Bei der Abfrage zur Einrichtung einer Netzwerk-Bridge für die LXC Container haben wir mit ›Ja‹ geantwortet.
Output of the "lxd init" command — Networking for the containers
Do you want to configure the LXD bridge (yes/no) [default=yes]? yes

Damit werden folgende Features ermöglicht:

  • Jeder Container bekommt automatisch eine IP-Addresse des von LXD eingerichteten privaten IPv4-Netzwerkes mit DHCP.
  • Die Container können untereinander im privaten Netzwerk kommunizieren.
  • Jeder Container kann Verbindung zum Internet initiieren, aber….
  • alle Container sind allerdings unerreichbar aus dem Internet oder Netzwerk; eine Verbindung muss erst eingerichtet werden. Das zeige ich im nächsten Schritt (wie immer, gibt es viele Möglichkeiten, zum Beispiel mit Forwarding).

Aufbau eines Profils für eine Bridge LAN <--> Container

Bemerkung: die folgende Anleitung habe ich von diesem informativen Blog übernommen – Danke an den Autor! Es wird macvlan eingerichtet, ein Feature des Linux Kernels.

Als erstes stoppen wir den laufenden Container (in diesem Sinne gibt es für diesen auch keine IP-Adresse zu sehen).
lxc stop c1
lxc list
+------+---------+------+------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+---------+------+------+------------+-----------+
| c1 | STOPPED | | | PERSISTENT | 0 |
+------+---------+------+------+------------+-----------+

Vorhandene LXC-Profile anzeigen.

lxc profile list
+---------+---------+
| NAME | USED BY |
+---------+---------+
| default | 1 |
+---------+---------+
| docker | 0 |
+---------+---------+

Wir sehen 2 Profile, von denen das Profil »default« von einem Container genutzt wird. Wir erzeugen eine Kopie des ›default‹ Profils. Das neue Profil wird »lanprofil« heißen:
lxc profile copy default lanprofil
lxc profile list
+------------+---------+
| NAME | USED BY |
+------------+---------+
| default | 1 |
+------------+---------+
| docker | 0 |
+------------+---------+
| lanprofil | 0 |
+------------+---------+

Man sieht, das neue Profil wird noch nicht genutzt. Wir schauen mal nach, was für Einstellungen es hat:
lxc profile show lanprofil
config:
environment.http_proxy: ""
user.network_mode: ""
description: Default LXD profile
devices:
eth0:
name: eth0
nictype: bridged
parent: lxdbr0
type: nic
root:
path: /
pool: lxd
type: disk
name: lanprofile
used_by: []

Es muss jetzt nur der nictype und parent zu geeigneten neuen Werten eingestellt werden. Der nictype wird zu macvlan. Der parent wird das Network interface des Host-Systems. Der richtige parent wird jetzt mit dem Befehl ip route ermittelt.
ip route show default 0.0.0.0/0
default via 10.0.2.1 dev enp8s0

Die Anpassung/Korrektur des Profils »lanprofil« erfolgt sogleich:
lxc profile device set lanprofil eth0 nictype macvlan
lxc profile device set lanprofil eth0 parent enp8s0

Check:
lxc profile show lanprofil
config:
environment.http_proxy: ""
user.network_mode: ""
description: Default LXD profile
devices:
eth0:
name: eth0
nictype: macvlan
parent: enp8s0

type: nic
root:
path: /
pool: lxd
type: disk
name: lanprofil
used_by: []

Das wars im Groben. Nun können Container gestartet werden, die das neue Profil bentzen können. Diese Container erhalten nun eine IP-Addresse vom DHCP-Server des LAN/Netzwerks.

Start eines LXD-Container mit neuem Profil

Schritt eins: Anbindung des Profils an Container.
lxc launch -p lanprofil ubuntu:16.04 c1
Creating net1
Starting net1

Starten der IP-Route (reale Werte hier aus Sicherheitsgründen geändert; die fette IP wurde dann vom DHCP des LAN zugeteilt).
lxc exec net1 ip route
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.6

Der Container wird sich nun im Netzwerk als eigenständiges Device zeigen und kann auch so genutzt werden.

Profil Container zuweisen

Schon bestehenden Containern kann ein Profil zugeordnet werden, es müssen nicht komplett neue erzeugt werden:
lxc profile apply c2 lanprofil
Profile lanprofil applied to c2

Weiterführende Links

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>