Escenario 3C. LXC: Máis sobre contedores Incus

De MediaWiki
Ir a la navegación Ir a la búsqueda

Introdución

Veremos como facer alguhas cousas a maiores das vistas nos anteriores escenarios

  • Incus-UI - web interface de xestión
  • Modos de rede avanzados: macvlan e ponte.
  • Contedores e redes wifi
  • Comunicacións entre contedores no equipo real e máquinas virtuais sobre Virtualbox.
  • Contedores con contorno gráfico.

Incus-UI - web interface de xestión

Hai unha interface web de xestión que permite realizar as operacións vistas nos capítulos anteriores a través dun navegador.

Hai algún outro proxecto de interfaz gráfica pero éste é o oficial.

A continuación os pasos para a súa instalación e uso:

instalar e habilitar incus-ui

~$ sudo apt install -y incus-ui-canonical
~$ incus config show 
config: {}
~$ incus config set core.https_address 127.0.0.1:8443
~$ incus config show 
config:
  core.https_address: 127.0.0.1:8443
asir@incus:~$ sudo netstat -putan | grep 8443
tcp        0      0 127.0.0.1:8443          0.0.0.0:*               ESCUCHAR    957/incusd          

Crear certificado e otorgar confianza

Acceder co navegador á: https://127.0.0.1:8443

Entrar premendo en Login with TLS e xerar certificado:


Seguimos os pasos indicados: xerar certificado e protexer con contrasinal, otorgar confianza (ollo que a ruta e o nome do arquivo descargado non ten porque coincidir co indicado no comando incus config trust do exemplo).

~$ incus config trust list
+------+------+-------------+----------------+---------------------+
| NAME | TYPE | DESCRIPCIÓN | HUELLA DIGITAL | FECHA DE EXPIRACIÓN |
+------+------+-------------+----------------+---------------------+
~$ ls -lhF Descargas/
total 4,0K
-rw-rw-r-- 1 asir asir 1,1K ene 17 17:38 incus-ui.crt
~$ incus config trust add-certificate Descargas/incus-ui.crt
~$ incus config trust list
+--------------+--------+-------------+----------------+-----------------------+
|     NAME     |  TYPE  | DESCRIPCIÓN | HUELLA DIGITAL |  FECHA DE EXPIRACIÓN  |
+--------------+--------+-------------+----------------+-----------------------+
| incus-ui.crt | client |             | 721108b3c8ba   | 2028/10/13 18:38 CEST |
+--------------+--------+-------------+----------------+-----------------------+

Descargar e importar .pfx

Acceso

Unha vez instalado o certificado no navegador hai que proceder a pechalo e volver a abrilo e acceder á web de INCUS-UI. Aparecerá unha mensace relativa á aceptación do certificado e unha vez aceptado xa poderemos xestionar gráficamente os contedores.

Nas seguintes imaxes poden verse algunhas capturas de pantalla da interface de xestión:

Contedores en modo Macvlan

Deste modo de rede hai que descatar os seguintes puntos:

  • É o modo máis sinxelo de conectar os contedores directamente á rede física e non require tocar a configuración de rede do host anfitrión.
  • Normalmente ofrece un mellor rendemento que o bridge que veremos máis adiante.
  • Permite a comunicación entre os contedores.
  • NON permite a comunicación entre os contedores e o host anfitrión. Polo tanto, se precisamos que haxa comunicacións entre contedores e o anfitrión, este modo non nos vale.
  • NON funciona en Virtualbox por defecto.
  • NON funciona en sistemas anfitrión reais usando wifi

Na seguinte imaxe pode verse unha interpretación das conexións neste modo de rede:

Esquema conexións modo MACVLAN

Fig. Esquema de conexión no modo MACVLAN

MACVLAN (o anfitrión dos contedores é un equipo real)

En primeiro lugar, comezaremos creando un perfil a partir do perfil por defecto e modificamos:

O nictype a macvlan: O parent de incusbr0 a enp0s3 (o nome da interface real do equipo anfitrión a usar).

~$ incus profile copy default macvlan
~$ incus profile edit macvlan 

### This is a yaml representation of the profile.
### Any line starting with a '# will be ignored.
###
### A profile consists of a set of configuration items followed by a set of
### devices.
###
### An example would look like:
### name: onenic
### config:
###   raw.lxc: lxc.aa_profile=unconfined
### devices:
###   eth0:
###     nictype: bridged
###     parent: lxdbr0
###     type: nic
###
### Note that the name is shown but cannot be changed

config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    nictype: macvlan
    parent: enp0s3  
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: macvlan
used_by: []
project: default

A continuación creamos dous novos contedores aplicándolles o novo perfil macvlan.

~$ incus launch images:ubuntu/jammy platega02 --profile macvlan
Launching platega02
asir@incus:~$ incus launch images:ubuntu/jammy platega03 --profile macvlan
Launching platega03

Podemos comprobar que reciben a configuración de rede dende o servidor dhcp da rede local 192.168.1.0/24 (e non do dhcp asociado a lxdbr0):

$ incus ls -c n,s,4,6,P,S
+-----------+---------+-----------------------+---------------------------------------------+----------+-----------+
|  NOMBRE   | ESTADO  |         IPV4          |                    IPV6                     | PERFILES | SNAPSHOTS |
+-----------+---------+-----------------------+---------------------------------------------+----------+-----------+
| platega00 | RUNNING | 10.119.191.239 (eth0) | fd42:47c9:add7:7c:216:3eff:fe59:7ec5 (eth0) | default  | 1         |
+-----------+---------+-----------------------+---------------------------------------------+----------+-----------+
| platega01 | RUNNING | 10.119.191.183 (eth0) | fd42:47c9:add7:7c:216:3eff:fe3e:d63e (eth0) | default  | 0         |
+-----------+---------+-----------------------+---------------------------------------------+----------+-----------+
| platega02 | RUNNING | 192.168.1.45 (eth0)   |                                             | macvlan  | 0         |
+-----------+---------+-----------------------+---------------------------------------------+----------+-----------+
| platega03 | RUNNING | 192.168.1.46 (eth0)   |                                             | macvlan  | 0         |
+-----------+---------+-----------------------+---------------------------------------------+----------+-----------+

Facendo algunhas probas de conectividade podemos verificar o indicado sobre o modo MACVLAN en relación ás comunicacións co exterior e entre os contedores: sí se permiten.

~$ incus exec platega02 -- host www.xunta.es 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases: 

www.xunta.es has address 85.91.64.254
asir@incus:~$ incus exec platega02 -- ping -c 2 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.431 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.404 ms

--- 192.168.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1020ms
rtt min/avg/max/mdev = 0.404/0.417/0.431/0.024 ms
asir@incus:~$ incus exec platega02 -- ping -c 2 192.168.1.46
PING 192.168.1.46 (192.168.1.46) 56(84) bytes of data.
64 bytes from 192.168.1.46: icmp_seq=1 ttl=64 time=0.168 ms
64 bytes from 192.168.1.46: icmp_seq=2 ttl=64 time=0.126 ms

--- 192.168.1.46 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1021ms
rtt min/avg/max/mdev = 0.126/0.147/0.168/0.021 ms
As comunicacións co equipo anfitrión non se permiten:

asir@incus:~$ incus exec platega02 -- ping -c 2 192.168.1.150
PING 192.168.1.150 (192.168.1.150) 56(84) bytes of data.
From 192.168.1.45 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.150 ping statistics ---
2 packets transmitted, 0 received, +1 errors, 100% packet loss, time 1018ms
pipe 2
asir@incus:~$ ping -c 2 192.168.1.45
PING 192.168.1.45 (192.168.1.45) 56(84) bytes of data.
From 192.168.1.150 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.45 ping statistics ---
2 packets transmitted, 0 received, +1 errors, 100% packet loss, time 1017ms
pipe 2

A partir de agora, o contedor debe ter unha configuración válida para a rede da organización. Neste momento se arrincamos o contenedor, éste trataría de obter unha configuración de rede por dhcp en base ó seu arquivo /etc/netplan/10-lxc.yaml. Se queremos asignarlle unha configuración estática, simplemente habería que indicar no /etc/netplan/10-lxc.yaml do contedor a nova configuración.

MACVLAN (o anfitrión dos contedores é unha máquina virtual Virtualbox)

É posible traballar con este modo sendo o anfitrión dos contedores unha máquina virtual de Virtualbox pero hai que facer unhas actuacións previas:

A máquina virtual que funciona como anfitriona dos contedores debe: Ter a interface de rede en modo bridge. Ter activado o modo promiscuo na interface de rede (Virtualbox ten que permitir o envío/recepción de paquetes de rede onde interveñen as diferentes direccións MAC dos contedores en modo macvlan) Hai que crear unha interface de tipo bridge no sistema operativo da máquina virtual que funciona como anfitrioa dos contedores. No profile dos contedores onde se define o modo macvlan, o parent será a interface bridge configurada no punto anterior. Ímos ver as instruccións paso a paso (válidas tanto para Xubuntu 20.04 coma Xubuntu 22.04).

Configuración da interface de rede da máquina virtual anfitrioa dos contedores:

Indico que é unha interface de tipo Adaptador puente e asócioa á interface enp6s0 da miña máquina real. Activo o Modo Promiscuo Configuración interface de rede

A configuración da interface de tipo bridge vaise facer usando o asistente gráfico de configuración de rede do equipo Ubuntu (no caso dun Ubuntu Server habería que facelo usando netplan e editando o arquivo de configuración de rede):

Editando a configuración de rede

Fig. Lanzando o configurador de rede

Editando a configuración de rede

Creando nova interface de tipo bridge

Creando nova interface de tipo bridge

Fig. Engadindo unha nova interface de tipo ponte (bridge)

Configuración interface de rede de tipo bridge

Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge

Engadindo a interface da máquina virtual á ponte

Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge

Engadindo a interface da máquina virtual á ponte

Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge --> enp0s3

Interface de rede engadida á ponte

Configurando a IP da interface de tipo bridge

Fig. Configurando a IP da interface de tipo bridge

Interface ponte configurada

Reiniciamos o equipo e verificamos a configuración da nova interface. Fíxadevos que a interface bridge0 sí ten asignada unha IP e como enp0s3 agora forma parte da ponte, sí está activa pero non ten asignada unha configuración IP:

~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP group default qlen 1000
    link/ether 08:00:27:ff:fc:1f brd ff:ff:ff:ff:ff:ff
3: bridge0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 1e:69:e2:83:f4:ca brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.150/24 brd 192.168.1.255 scope global noprefixroute bridge0
       valid_lft forever preferred_lft forever
...

Agora créase un profile de tipo macvlan usando como parent a interface bridge0:

asir@incus:~$ incus profile copy default macvlan
asir@incus:~$ incus profile edit macvlan

### This is a yaml representation of the profile.
### Any line starting with a '# will be ignored.
###
### A profile consists of a set of configuration items followed by a set of
### devices.
###
### An example would look like:
### name: onenic
### config:
###   raw.lxc: lxc.aa_profile=unconfined
### devices:
###   eth0:
###     nictype: bridged
###     parent: lxdbr0
###     type: nic
###
### Note that the name is shown but cannot be changed

config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    nictype: macvlan
    parent: bridge0  
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: macvlan
used_by: []

Probamos a crear un par de contedores usando este profile:

~$ incus launch images:ubuntu/jammy macvlan00 -p macvlan  
~$ incus launch images:ubuntu/jammy macvlan01 -p macvlan
~$ i incus ls -c n,s,4,6,P,S
+-----------+---------+----------------------+----------------------------------------------+----------+-----------+
|   NAME    |  STATE  |         IPV4         |                     IPV6                     | PROFILES | SNAPSHOTS |
+-----------+---------+----------------------+----------------------------------------------+----------+-----------+
| alpine00  | RUNNING | 10.79.128.80 (eth0)  | fd42:a317:cbc5:dbd:216:3eff:fe99:e07f (eth0) | default  | 0         |
+-----------+---------+----------------------+----------------------------------------------+----------+-----------+
| alpine01  | RUNNING | 10.79.128.123 (eth0) | fd42:a317:cbc5:dbd:216:3eff:fe94:dca7 (eth0) | default  | 0         |
+-----------+---------+----------------------+----------------------------------------------+----------+-----------+
| alpine02  | STOPPED |                      |                                              | default  | 0         |
+-----------+---------+----------------------+----------------------------------------------+----------+-----------+
| macvlan00 | RUNNING | 192.168.1.38 (eth0)   |                                              | macvlan  | 0         |
+-----------+---------+----------------------+----------------------------------------------+----------+-----------+
| macvlan01 | RUNNING | 192.168.1.41 (eth0)   |                                              | macvlan  | 0         |
+-----------+---------+----------------------+----------------------------------------------+----------+-----------+

A partir de agora, o contedor debe ter unha configuración válida para a rede da organización. Neste momento se arrincamos o contenedor, éste trataría de obter unha configuración de rede por dhcp en base ó seu arquivo /etc/netplan/10-.yaml. Se queremos asignarlle unha configuración estática, simplemente habería que indicar no /etc/netplan/10-lxc.yaml do contedor a nova configuración.

Contedores en modo ponte

Contedores e redes wifi

Comunicacións entre contedores no equipo real e máquinas virtuais sobre Virtualbox

nha cousa curiosa que me aconteceu ó traballar con contedores foi que había problemas de comunicación na seguinte situación:

Contedores LXC/Incus correndo directamente nun equipo real e traballando en modo ponte (usando a interfaz br0 do equipo real). Máquina virtual sobre Virtualbox traballando en modo ponte. As comunicacións dos contedores con outros contedores, co equipo real, con equipos da rede local e con equipos da Internet non teñen problema. O mesmo acontece coas comunicacións entre a máquina virtual sobre Virtualbox e o equipo anfitrión, equipos da rede local e equipos da Internet. Sen embargo, entre contedores e máquina virtual non.

Tamén sucedía o mesmo se quería 'enganchar' unha máquina virtual Virtualbox a unha das redes Incus (por exemplo a rede incusbr0): configuraba o adaptador de rede da máquina virtual para conectarse a incusbr0 e non había comunicación entre os contedores da rede lxdbr0 e a máquina virtual.

O realmente curioso é que entre o contedor e a máquina virtual si se podía facer ping pero non funcionaba outro tipo de conexión. Tras buscar información, atopei que outra xente sufría o mesmo problema (que é achacado á forma de manexar o tráfico de rede por parte de Virtualbox) e que a solución era crear unha nova interface de rede a usar por Virtualbox e integrala na rede lxdbr0 ou no switch br0.

De non telo, instálanse os paquetes bridge-utils e uml-utilities e continuación creamos o seguinte script para incluir máquinas virtuais na rede lxdbr0:

~$ sudo apt update
~$ sudo apt install bridge-utils uml-utilities
~$ nano interfaz_incusdbr0_para_virtualbox.sh 
#!/bin/bash
tunctl -u root -g vboxusers -t vbox0
ip link set up dev vbox0
brctl addif incusbr0 vbox0
~$ chmod 755 interfaz_incusdbr0_para_virtualbox.sh 

E para executalo:

~$ sudo ./interfaz_incusdbr0_para_virtualbox.sh
Set 'vbox0' persistent and owned by uid 0 gid 122

Deste xeito, creouse unha nova interface chamada vbox0 conectada á rede lxdbr0:

~$ sudo brctl show
bridge name    bridge id        STP enabled    interfaces
incusbr0         8000.902b343d8912    no             veth2ac995c0

vbox0

Esta interface será a que temos que indicar na configuración de rede en Virtualbox para que as comunicacións contedor <-> máquina virtual funcionen correctamente:

interface Vbox

Fig. Escollendo a nova interface vbox nas propiedades da máquina virtual.

Para non ter que executar a man o script, podemos configurar o equipo para que se execute ó inicio do equipo anfitrión

Contedores con contorno gráfico

É posible ter contedores correndo un contorno gráfico. Explicarei unha forma que relativamente sinxela, empregando como contorno gráfico XFCE (é dicir Xubuntu, un Ubuntu co contorno gráfico liviano XFCE) e usando X2Go para acceder ó contorno gráfico.

Preparando o contedor

Procedemos a crear un contedor ó que poidamos conectarnos vía remota (no exemplo emprego un perfil coa rede en modo ponte pero pode usarse outros perfil, como o perfil default coa rede lxdbr0):

~$ incus launch images:ubuntu/jammy lxde

Entramos no contedor e poñemos un contrasinal á conta ubuntu que xa está creada por defecto:

~# passwd ubuntu
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

Actualizamos a llista de paquetes dispoñibles nos repositorios e procedemos á instalación de todos os paquetes do contorno gráfico Xubuntu Desktop:

~# apt update
~# apt install xubuntu-desktop

X2Go permite acceder ó contorno gráfico dun equipo usando unha conexión de rede. A idea básica é que no contedor instalaremos o servidor X2Go e noutro equipo o cliente X2Go; desta forma, dende o equipo cliente poderemos traballar co contorno gráfico correndo no contedor.

Para instalar o servidor X2Go simplemente executamos:

~# apt install x2goserver x2goserver-xsession

Instamos OpenSSH Server e modificaremos un par de parámetros de configuración do servidor ssh en /etc/ssh/sshd_config e reiniciaremos o servizo:

~# apt install openssh-server nano
root@xubuntu:~# nano /etc/ssh/sshd_config 
...
ChallengeResponseAuthentication yes
PasswordAuthentication yes
...
~# systemctl ssh restart
ssh stop/waiting
ssh start/running, process 2584

Preparando o equipo cliente

Unha vez preparado o contedor co contorno gráfico XFCE e o servidor X2Go, temos que preparar o equipo dende nos imos a conectar instalando o cliente X2Go:

~$ sudo apt update
~$ sudo apt install x2goclient

Arrincamos o cliente X2Go e configuramos unha nova sesión indicando a IP do contedor, o usuario que usaremos para iniciar sesión no contedor (ubuntu) e o tipo de sesión (XFCE):

Configurando a conexión no cliente X2Go

Configurando a conexión no cliente X2Go

Fig. Configurando a conexión no cliente X2Go.

Unha vez creada a conexión, procedemos a conectarnos:

Iniciando conexión X2Go co contedor

Iniciando conexión X2Go co contedor

Fig. Establecendo conexión X2Go co contedor Xubuntu.

Unha vez dentro do contedor, podemos empregar o contorno gráfico como se estivesemos sentados diante dun equipo Xubuntu:

Traballando co contedor usando X2Go

Fig. Traballando no contedor Xubuntu.

Referencias