Esta web utiliza cookies, puedes ver nuestra política de cookies, aquí Si continuas navegando estás aceptándola

Contenedores LXC


Los contenedores nos aportan varias ventajas respecto a la virtualización completa:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Los contenedores no son una novedad, ya se disponía de ellos desde hace años, por ejemplo en FreeBSD tienen los Jails, en Solaris las Zones y en Linux OpenVZ y Linux VServer, pero lo que hace realmente especial LXC es que forma parte del kernel sin tener que parchearlo de ningún modo(vanilla flavour).

En realidad LXC utiliza una serie de componentes para aislar procesos, tráfico de red y demás proporcionando un sistema operativo independiente de cara al administrador, las tecnologías utilizadas son:

 

 

 

 

 

 

 

 

 

NOTA: Docker se basa en LXC pero la principal diferencia entre ellos es que LXC tiene un sistema Init que puede correr varios procesos mientras que Docker solo puede correr uno.

 

 

 

 

 

 

 

 

 

 

 

 

 

El kernel debe ser compilado con las siguientes opciones para poder aprovechar todo el potencial de LXC:

* General setup

* Control Group support

-> Namespace cgroup subsystem

-> Freezer cgroup subsystem

-> Cpuset support

-> Simple CPU accounting cgroup subsystem

-> Resource counters

-> Memory resource controllers for Control Groups

* Group CPU scheduler

-> Basis for grouping tasks (Control Groups)

* Namespaces support

-> UTS namespace

-> IPC namespace

-> User namespace

-> Pid namespace

-> Network namespace

* Device Drivers

* Character devices

-> Support multiple instances of devpts

* Network device support

-> MAC-VLAN support

-> Virtual ethernet pair device

* Networking

* Networking options

-> 802.1d Ethernet Bridging

* Security options

-> File POSIX Capabilities

Podemos comprobar que cumplimos con todos los requisitos ejecutando el siguiente script:

lxc-checkconfig

Las versiones disponibles de LXC son:

Available versions:  ~1.0.6-r1 1.0.7 ~1.1.0-r6 ~1.1.1-r1 ~1.1.2 ~1.1.2-r1 ~1.1.2-r2

Utilizaremos la última para poder emplear las últimas mejoras:

vi /etc/portage/package.accept_keywords/lxc
>=app-emulation/lxc-1.1.2-r2

Habilitamos las opciones que nos interesen:

vi /etc/portage/package.use/lxc
app-emulation/lxc cgmanager doc examples lua python seccomp

Instalamos LXC-Userlands y algunas herramientas mas:

emerge -av app-emulation/lxc app-crypt/gpgme net-misc/bridge-utils

Es necesario ejecutar las herramientas con python3:

vi /etc/make.conf
PYTHON_TARGETS="python3_4"

eselect python list
Available Python interpreters:
  [1]   python2.7 *
  [2]   python3.3
  [3]   python3.4

eselect python set 3

Existe un template especial llamado download cuyo fin es tener un indice de los templates de las distros que nos podemos bajar, para ver esos templates:

lxc-create -t download -n gentoo_kr0m -- --list

Nos bajamos el de Gentoo:

lxc-create -t download -n gentoo_kr0m -- -d gentoo -r current -a amd64

Si por el contrario si no queremos descargarnoslo, si no utilizar los templates que trae LXC por defecto(/usr/share/lxc/templates/lxc-gentoo):

lxc-create -t gentoo -n container00

NOTA: Otra opción interesante es que los templates de los contenedores están en /usr/share/lxc/templates/ y podemos modificarlos a antojo para realizar despliegues totalmente customizados.

lxc-ls -f
NAME   STATE    IPV4  IPV6  GROUPS  AUTOSTART  
---------------------------------------------
gentoo_kr0m  STOPPED  -     -     -       NO         

LXC nos permite configurar la red varios modos, pero nosotros vamos a utilizar bridging ya que es el mas sencillo, en posteriores artículos se explorarán todas las posibilidades en cuanto a networking.

El modo bridge puede ser configurado de dos modos:

  • Bridge: Se crea un bridge, en este se introducen la interfaz física y la virtual, accediendo esta última a la red como si estuviese conectada directamente a la red física. Este método es el mas sencillo ya que no requiere ningún tipo de configuración adicional.
  • NAT: Se conecta la interfaz virtual al bridge y se configura un IP en el bridge, realizando NAT damos acceso al exterior al contenedor, en caso de ser necesario exponer algún servicio se debe redirigir el tráfico mediante iptables. Este método suele ser útil en escenarios mas restrictivos, al natear el contenedor NO es necesario reconfigurar nada en la red ya que es totalmente transparente.

Creamos el bridge:

brctl addbr lxcbr0
ifconfig lxcbr0 up

Modo Bridge(Cuidado mientras reconfiguramos perderemos conectividad!!):

brctl addif lxcbr0 eth0
brctl show
bridge name    bridge id        STP enabled    interfaces
lxcbr0        8000.002219ebc7e9    no        eth0

Si queremos que el servidor de cómputo tenga red debemos asignarle la ip de la interfaz física al bridge:

ifconfig lxcbr0 IP netmask NETMASK
route del default gw
route del default gw
route add default gw IP_GW

Editamos la config del contenedor:

vi /var/lib/lxc/gentoo_kr0m/config
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.hwaddr = 00:16:3e:7e:11:ac
lxc.network.ipv4 = X.X.X.X
lxc.network.ipv4.gateway = X.X.X.X

NOTA: Si la red física tiene un servidor DHCP no serán necesarios los dos últimos parámetros.

vi /var/lib/lxc/gentoo_kr0m/rootfs/etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

Modo NAT:

Habilitamos el enrutamiento:

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

sysctl -p

Asignamos la ip de la red interna a nuestro bridge y configuramos en nateo:

ifconfig lxcbr0 10.0.0.1 netmask 255.255.255.0
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j SNAT --to-source X.X.X.X

NOTA: En esta red interna podemos montar un servidor DHCP si queremos para que asigne ips de forma automática.

Editamos la config del contenedor:

vi /var/lib/lxc/gentoo_kr0m/config
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.hwaddr = 00:16:3e:7e:11:ac
lxc.network.ipv4 = 10.0.0.2
lxc.network.ipv4.gateway = 10.0.0.1

vi /var/lib/lxc/gentoo_kr0m/rootfs/etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

Toda la config podemos automatizarla en el arranque del sistema:

vi /etc/local.d/lxc.start
#! /bin/bash
brctl addbr lxcbr0
ifconfig lxcbr0 up
ifconfig lxcbr0 10.0.0.1 netmask 255.255.255.0
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j SNAT --to-source X.X.X.X

chmod 700 /etc/local.d/lxc.start

Arrancamos el contenedor:

lxc-start -n gentoo_kr0m
lxc-ls -f
NAME         STATE    IPV4      IPV6  GROUPS  AUTOSTART  
-------------------------------------------------------
gentoo_kr0m  RUNNING  10.0.0.2  -     -       NO

Nos attacheamos al contenedor:

lxc-attach -n gentoo_kr0m

Para pararlo ejecutamos:

lxc-stop -n gentoo_kr0m

NOTA: Curiosamente los parámetros del kernel NO tienen porque ser iguales a los del contenedor, pero para cambiarlos en el contenedor hay que ejecutar:

mount -o remount rw /proc/sys

vi /etc/sysctl.conf
kernel.shmmax = 10858823681

sysctl -p

Creo que con esto tenemos un manual introductorio a LXC bastante decente, mas adelante iré introduciendo conceptos mas complejos como snapshots y networking avanzado.


Autor: Kr0m -- 22/08/2015 23:08:08