OpenVZ y los Linux Containers

Ya comenté en un artículo anterior que quería volver a la filosofía de la web de ofrecer contenidos originales que ayuden a la comunidad GNU Linux y Open Source. En el artículo de hoy hablo de OpenVZ y los Linux Container, explico en que consisten y como funcionan.

openvz-logo-300

¿Que son los Linux Containers y cómo funcionan?

Actualmente con las tecnologías de computación en la nube y virtualización se ha revolucionado el mundo de los llamados ecosistemas de servidores. Ya que hemos pasado de tener nuestros servidores en “hierro” en grandes CPD con cañones de aire frío funcionando 24 horas al día 365 días al año, a poder virtualizarlos, en pocos servidores físicos, utilizando tecnologías privativas como VMWARE o HIPER-V, o libres como QEMU/KVM o PROXMOX. Y en los últimos años en la nube o más bien, utilizando las granjas de terceros, que viene a ser los mismo, utilizando servidores físicos o VPS.

Dentro de toda esta revolución se encuentran los Linux Containers o LXC, una tecnología de virtualización a nivel de sistema operativo en entornos GNU Linux. Resumiendo, LXC permite múltiples instancias de sistemas operativos aislados, conocidos como VPS (Virtual Private Server) o EV (Entornos Virtuales) No lo debemos de confundir con una máquina virtual al uso, ya que LXC sólo provee de un entorno virtual con su propio espacio de procesos y redes. Es similar, y es casi primo hermano de sistemas como OpenVZ y Linux-Vserver.

Para funcionar utiliza la funcionalidad cgroups del núcleo Linux, disponible desde la versión 2.6.29

¿Qué es OpenVZ y cómo funciona?

OpenVZ es una tecnología de virtualización a nivel de sistema operativo. Permite múltiples instancias de sistemas operativos aislados, conocidos como VPS (Virtual Private Server) o EV (Entornos Virtuales) A diferencia de otros sistemas de virtualización como VMWARE, XEN, PROXMOX o HIPER-V , OpenVZ es restrictivo a la de la elección de sistema operativo, ya que sólo admite GNU Linux. A pesar de eso OpenVZ ofrece mayor rendimiento, escalabilidad, densidad, administración de recursos dinámicos y facilidad de manejo.

OpenVZ está basado en el software privativo Virtuozzo. OpenVZ en cambio es software libre y utiliza la licencia GNU GPL 2

OpenVZ-GNU-Linux

Estructura de OpenVZ

Su núcleo es un Linux modificado, y agrega una noción de Entorno Virtual. Dicho núcleo proporciona la virtualización, aislamiento, administración de recursos y punto de comprobación.

Cada EV es una entidad separada. Para el usuario se muestra como un servidor individual.

Por lo tanto tiene su propio sistema de ficheros:

  • Biblioteca de sistemas, aplicación, /proc y /sys virtualizado
  • Tiene sus propios usuarios y grupo, incluyendo root
  • Su propio árbol de procesos.
  • A nivel de Red tiene su propia red virtual. Esto le permite tener su propias direcciones IP y sus propias reglas (iptables)
  • Se le puede llegar a dar acceso a dispositivos reales como puertos red, seriales, de disco, etcétera.
  • Podemos gestionar los límites de memoria y las cuotas de CPU

Para utilizar OpenVZ se recomienda la siguiente configuración:

A nivel de hardware:

  • Sistema compatible IBM PC
  • Intel Core I7, XEON E7 o AMD Opteron
  • 2 GB de memoria RAM como mínimo
  • Un disco duro de al menos 80 GB
  • Una tarjeta de red de 10 / 100 / 1000

A nivel de especificaciones de red:

  • Una área local para el servidor
  • Una conexión a Internet
  • Una IP válida para el servidor
  • Una IP válida para cada container

Preparando la instalación de OpenVZ en CentOs 6.6

Yo he utilizado CentOS 6.6 en su versión mínima o Core. La versión 7 no es recomendable, ya que a fecha de la creación de éste tutorial no es compatible con OpenVZ.

Una vez instalada debemos de activar la red, modificando el fichero /etc/sysconfig/network-scripts/ifcfg-eth0, utilizando el editor vi.

Modificamos la línea:

  1. ONBOOT=no

Por:

  1. ONBOOT=yes

Y configuramos la red para que se active de forma automática.

Una vez hecho esto  y después de reiniciar, ya podemos actualizar la distribución con:

  1. yum update

Para no tener que trastear directamente en el teclado del servidor, que lo tengo en otra habitación, accederé a él vía ssh.

Antes tenemos que ver que IP tiene asignado el servidor que le llamado ‘OpenVZCentOS’, usaremos el comando:

  1. ip a

Comprobamos también que el servicio sshd esté encendido

  1. service sshd status

Y desde mi laptop ya puedo acceder:

  1. ssh root@IP-DEL-SERVIDOR

Ya podemos preparar el terreno para OpenVZ. Primero de todo añadiremos los repositorios al sistema. Para poder descargar el repositorio intalaremos el programa wget

  1. yum install wget
  1. wget -P /etc/yum.repos.d/ http://ftp.openvz.org/openvz.repo

Para usar el repositorio debemos importar su GPG KEY

  1. rpm --import http://ftp.openvz.org/RPM-GPG-Key-OpenVZ

Instalamos VZKernel y sus herramientas

VZKernel es el núcleo de OpenVZ. Se trata de un kernel de Linux modificado, para que puedan funcionar los contenedores.

Lo instalaremos con el comando:

  1. yum install vzkernel

Si todo ha ido bien al arrancar veremos la siguiente imagen del menú GRUB

OpenVZ-Centos6-6-001

Instalamos sus herramientas:

  1. yum install vzctl vzquota ploop

No las explico ya que las iremos utilizando durante el artículo y veremos para que sirven.

Modificamos el fichero /etc/sysctl.conf o mejor, guardamos el original y creamos uno nuevo:

  1. mv /etc/sysctl.conf /etc/sysctl.conf.original
  1. vi /etc/sysctl.conf

Para editar el fichero podemos utilizar cualquier editor, por defecto el core de Centos 6.6 viene con vi, podemos instalar otros como vim o nano.

Editamos el fichero con la siguiente configuración:

  1. net.ipv4.ip_forward = 1
  2. net.ipv4.conf.default.proxy_arp = 0
  3. net.ipv4.conf.all.rp_filter = 1
  4. kernel.sysrq = 1
  5. net.ipv4.conf.default.send_redirects = 1
  6. net.ipv4.conf.all.send_redirects = 0
  7. net.ipv4.icmp_echo_ignore_broadcasts=1
  8. net.ipv4.conf.default.forwarding=1

Ahora configuraremos la red para que funcionen los contenedores. Existen dos tipos de configuraciones para los OpenVZ, llamadas venet (Virtual NETwork) y veth (Virtual ETHernet), en el siguiente enlace podéis ver sus diferencias: «Diferencias entre venet y veth«

Yo he utilizado la segunda, es decir, veth, que añade a la red del contenedor una dirección MAC, admite broadcast entre otras características.

Para que funcione añadiremos una conexión bridge, llamada, vmbr0.

Editamos los ficheros:

  1. # vi /etc/sysconfig/network-scripts/ifcfg-vmbr0 
  2. DEVICE="vmbr0"
  3. BOOTPROTO="static"
  4. IPV6INIT="no"
  5. ONBOOT="yes"
  6. TYPE="Bridge"
  7. DELAY=0
  8. IPADDR=192.168.1.99
  9. NETMASK=255.255.255.0
  10. GATEWAY=192.168.1.1
  11.  
  12. # vi /etc/sysconfig/network-scripts/ifcfg-eth0 
  13. DEVICE="eth0"
  14. ONBOOT="yes"
  15. IPV6INIT="no"
  16. TYPE="Ethernet"
  17. BRIDGE="vmbr0"

La configuración de la red la adaptaremos a nuestras necesidades.

Creamos el fichero /etc/vz/vznet.conf con el siguiente contenido:

  1. #!/bin/bash
  2. EXTERNAL_SCRIPT="/usr/sbin/vznetaddbr"

Este script añadirá o eliminará la interfaz de red de los container cuando los paremos o encendamos.

Ahora reiniciamos el servidor para que cargue la nueva configuración.

Crear un container tipo veth

Para crear nuestro primer container utilizaremos las plantillas disponibles en la red, no me gusta utilizar la palabra nube.

Podemos utilizar la herramienta vztmpl-dl, que nos permitirá descargar plantillas de sistemas operativos.

Veamos como funciona, si queremos ver todas las plantillas disponibles, tecleamos:

  1. vztmpl-dl --list-remote

Veremos que la lista es bastante extensa, y nos permite disfrutar de plantillas Debian, Ubuntu, Fedora y otras.

Si queremos descargar una, lo haríamos así:

  1. vztmpl-dl fedora-20-x86

Para nuestro caso he utilizado una plantilla del sistema operativo Debian:

  1. vztmpl-dl debian-8.0-x86_64-minimal

Aquí vemos la descarga:

OpenVZ-Centos6-6-002

A continuación utilizaremos la plantilla, al crear y configurar el contenedor utilizando la herramienta vzctl

De la siguiente manera:

  1. vzctl create 101 --ostemplate debian-8.0-x86_64-minimal --config basic

Una vez creada podemos verla en la lista de contenedores, utilizando el comando vzlist -a:

OpenVZ-Centos6-6-003

Ya hemos creado el contenedor, pero ahora nos falta configurarlo.

Configurando nuestro primer Linux Container

Primero de todo indicaremos que queremos que se encienda al iniciar nuestro server OpenVZ

  1. vzctl set 101 --onboot yes --save

Toda la configuracón que vayamos realizando se va guardando el fichero /etc/vz/conf/101.conf

Ahora le asignaremos un nombre de host, que será Debian8

  1. vzctl set 101 --hostname Debian8.localdomain.com --save

Le asignaremos también una IP estática:

  1. vzctl set 101 --ipadd 192.168.1.181 --save

La asignamos un servidor de nombres (DNS) :

  1. vzctl set 101 --nameserver 8.8.8.8 --nameserver 8.8.4.4 --save

Le he asginado los de Google, aquí cada cual según su proveedor favorito.

Asignamos una contraseña de root para el contenedor:

  1. vzctl set 101 --userpasswd root:la-contraseña

Así ya tenemos el usuario root con nueva contraseña.

Administrar los contenedores

Tal y como hemos visto antes con el comando ‘vzlist’, podemos ver la lista de contenedores y su estado, con nuestra nueva configuración veremos:

OpenVZ-Centos6-6-004

Para apagar y encender los contenedores utilizaremos los comandos:

  • vzctl start 101
  • vzctl stop 101

Aquí se puede ver su uso:

OpenVZ-Centos6-6-005

Para acceder al contenedor utilizamos: vzctl enter 101

Creo que por hoy lo dejamos aquí, todavía me he dejado muchas cosas en el tintero, como dimensionar los discos, realizar copias de seguridad y mucho más, estad atentos : )

Siguiente capítulo: Administrar contenedores OpenVZ

See you soon!!