Docker en FreeNAS 11.3

Docker 19 de abr. de 2020

A partir de FreeNAS 11.3 ya no es posible crear automáticamente una VM con Docker automáticamente desde la GUI de FreeNAS. Por ello el objetivo de este tutorial es montar una máquina virtual con RancherOS.


¿Por qué RancherOS?

Muy sencillo, RancherOS es una imagen hecha por Rancher Labs enfocada en ser un sistema minimalista y especialmente hecho para trabajar con docker, es decir, lleva exclusivamente lo esencial para que docker funcione, por lo que nos queda un SO que apenas nos ocupará espacio y que tampoco consumirá recursos en herramientas que no vamos a usar.


RancherOS no soporta EFI boot, así que primero tendremos que tener una imagen EFI de RancherOS. Llegados a este punto hay dos opciones:

Dado que la última imagen que soporta EFI es la última versión no veo motivos en crearla desde cero. La imagen la he sacado de otro usuario del foro de FreeNAS que la hizo y os la he resubido dado que sus servidores parece ser que están algo saturados.


Preparar la red de FreeNAS para las máquinas virtuales y jails

Para que las máquinas virtuales y jails funcionen bien en FreeNAS, tienen que tener una interfaz de red configurada de una manera muy concreta.

Vamos a Network > Interfaces y a la interfaz que queramos usar para las máquinas virtuales y las jails le damos a Edit. Recomiendo usar una interfaz diferente a la que usemos para SMB, NFS, iSCSI, etc. En caso de no tener más de una interfaz disponible, usaremos la que tengamos.
Activamos Disable Hardware Offloading y le damos a Apply y luego aplicamos los cambios cuando nos lo diga.
Vamos a Network > Interfaces y le damos a Add. En tipo ponemos Bridge y le damos un nombre bridgeX donde X es un número mayor a 1 en bridge members ponemos la interfaz con Disable Hardware Offloading (en mi caso bge1) y le damos a Apply y luego aplicamos los cambios cuando nos lo diga.

Y ya tendríamos configurada la interfaz lista para ser usada por las máquinas virtuales y las jails. Solo debemos usar interfaces de este tipo para las máquinas virtuales o jails, por lo tanto a la hora de añadir una red a la máquina de RancherOS, seleccionaremos el bridge que hemos creado.


Antes de empezar necesitaremos:

La ISO de RancherOS (la versión tiene que coincidir con la versión de nuestra EFI, con la EFI de este tutorial seleccionaremos la v1.5.5): https://github.com/rancher/os/releases (nos tenemos que descargar la que pone rancheros.iso a secas)

La imagen que soporta EFI boot: https://cloud.byted.xyz/s/PzXPz6HBknGNAQc


Creación de la máquina virtual en FreeNAS

Para crear la máquina virtual, nos vamos al apartado Virtual Machines del menú lateral de FreeNAS y le damos a ADD

Le damos el nombre que queramos a la máquina y ponemos como Boot Method: UEFI.
Esto va a gusto de cada uno, pero mínimo recomiendo 2vCPUs y 2GB de RAM.
Aquí tenemos que añadir un disco, en mi caso ya tenía un ZVol creado así que opté por elegir un disco existente.
Aquí seleccionaremos donde tenemos la ISO de RancherOS o bien la podemos subir desde ahí mismo marcando la casilla que aparece.

Los pasos restantes los podéis dejar por defecto.

Una vez creada la máquina virtual, NO la iniciamos y le damos a Devices.

Una vez hemos abierto Devices, le damos a ADD

Seleccionamos como tipo Raw File y seleccionamos dónde tenemos la imagen con EFI boot habilitado (rancher.img), el resto lo dejamos por defecto y le damos a SAVE.

Una vez hecho esto, ya podemos iniciar la máquina virtual.

Nos fijamos en esa línea ya que es lo que necesitaremos para conectarnos a la consola de RancherOS por SSH.

A partir de aquí podéis elegir dos opciones:

  • Darle a Console directamente en la máquina virtual y hacerlo todo desde la GUI de FreeNAS
  • Hacerlo por SSH.

Yo lo haré por SSH para facilitar el copiar y pegar comandos.


Instalación de RancherOS

Si estas usando la consola de la GUI de FreeNAS te puedes saltar este paso:

Accedemos a FreeNAS por SSH e introducimos:

cu -l /dev/nmdmXX
XX es el último número y letra del último paso en FreeNAS. En mi caso: 4B

sudo fdisk -l
Ahora vamos a ver que disco es del instador y cuál nuestro disco donde queremos instalarlo. En mi caso sda es el disco del instalador y sdb es el disco donde quiero instalarlo, pero esto puede variar en cada caso.

Mucho cuidado a partir de aquí, tened en cuenta que tenéis que sustituir sdb en mis comandos por la letra de vuestro disco como hemos visto en el paso anterior. Y sda por la letra del instalador.


Ejecutamos el siguiente comando:

sudo fdisk /dev/sdb

Y metemos la secuencia de teclas: g,n,1,enter,+200M,t,1,n,enter,enter,enter,w. Donde cada coma es un enter.


Ahora formateamos la particion EFI del disco.
sudo mkdosfs -n RANCHER -F 32 /dev/sdb1

Formateamos la partición de datos del disco.
sudo mkfs.ext4 -L RANCHER_STATE /dev/sdb2

Ahora tendremos que crear la configuración para que no tengamos que hacer absolutamente nada después de instalarlo.

Para ello hacemos:

vi cloud-config.yml

Os pongo un ejemplo de mi configuración, la podéis modificar a vuestro gusto. Para más información:

Annotated RancherOS Cloud-init configuration snippets
Annotated RancherOS Cloud-init configuration snippets - 00-cloud-config.yml

La configuración que os pongo no os servirá si no la modificaís con vuestra red y vuestra clave ssh (o bien podéis eliminar la linea de ssh_authorized_keys y ssh-rsa si no queréis poner ninguna).

#cloud-config
hostname: rancheros
ssh_authorized_keys:
  - ssh-rsa AQUIVUESTRAKEYSSH

rancher:
  console: ubuntu
  network:
    dns:
      nameservers:
      - 10.0.2.1
      - 1.1.1.1
      search:
      - byted.xyz
    interfaces:
      eth0:
        address: 10.0.2.51/24
        dhcp: false
        gateway: 10.0.2.1

runcmd:
  - sysctl net.bridge.bridge-nf-call-iptables=1
  - sysctl net.bridge.bridge-nf-call-ip6tables=1

Os dejo también con una configuración con lo mínimo para fucionar (en este no es necesario modificar nada, pero tened en cuenta que no tendréis acceso por ssh y la IP de la máquina se obtendrá por DHCP:

#cloud-config
hostname: rancheros
rancher:
  console: ubuntu
  network:
    dns:
      nameservers:
      - 1.1.1.1
      - 1.0.0.1
    interfaces:
      eth0:
        dhcp: true

runcmd:
  - sysctl net.bridge.bridge-nf-call-iptables=1
  - sysctl net.bridge.bridge-nf-call-ip6tables=1

Para validar la configuración:

sudo ros config validate -i cloud-config.yml

Llegados a este punto, ahora toca instalar RancherOS. Importante decir n cuando os pida si queréis reiniciar.
sudo ros install -t gptsyslinux -c cloud-config.yml -d /dev/sdb -p /dev/sdb2

Ahora falta copiar la EFI del disco de instalación al disco donde hemos instalado el SO:

mkdir /mnt/efipart && sudo mount /dev/sdb1 /mnt/efipart
mkdir /mnt/installer && sudo mount /dev/sda1 /mnt/installer
sudo cp -r /mnt/installer/EFI /mnt/efipart

Tenemos que editar el archivo /mnt/efipart/EFI/BOOT/grub.cfg. Y tenemos que tener lo siguiente:

set timeout=1
menuentry "Rancher from GPT" {
    search --no-floppy --set=root --label RANCHER_STATE
    linux    /boot/vmlinuz-4.14.138-rancher printk.devkmsg=on rancher.state.dev=LABEL=RANCHER_STATE rancher.state.wait panic=10 console=tty0 console=ttyS0 rancher.autologin=ttyS0
    initrd    /boot/initrd-v1.5.5
}

Por último:

sudo umount /mnt/*
sudo reboot

Y quitamos el RAW de Devices y el CD-ROM, sino nos iniciará otra vez en el instalador.

¡Ya tenemos instalado RancherOS y con docker funcionando!


Instación de Portainer (opcional)

Para aquellos que no conozcáis portainer, es una herramienta que nos va a proporcionar una interfaz para poder administrar y crear nuestros contenedores en docker. Para instalarlo, nos metemos a la consola de RancherOS e introducimos:

docker volume create portainer_data
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Una vez acabados los dos comandos, vamos a http://IP_de_RancherOS:9000

Configuramos un usuario y contraseña

Seleccionamos local, ya que queremos administrar esta máquina, no una remota, aunque desde un mismo portainer puedes administrar otras máquinas remotas.

¡Y ya tendríamos docker y portainer funcionando!

Etiquetas

Carlos Mora Clavero

Soy un estudiante al que le gusta aprender cosas nuevas en sus ratos libres sobre sistemas, hardware, programación, etc.