Muntar servidor de Linux Containers amb LXD (Debian + Snap)

De HLV Wiki
Salta a: navegació, cerca

Entorn i Documentació

Instal·lar Requeriments

apt update && apt upgrade
apt install lxc libvirt-clients debootstrap bridge-utils snapd
snap install lxd
  • Posem lxd al path, podem fer-ho de varies formes:
    • sortim i entrem de la sessió d'usuari
    • executem l'script: /etc/profile.d/apps-bin-path.sh
    • o actualitzem el path manualment fent PATH=$PATH:/snap/bin al terminal
  • Instalem zfs:

posem contrib als repositoris de debian /etc/apt/sources.list i fem:

apt -y install linux-headers-$(uname -r)
ln -s /bin/rm /usr/bin/rm
apt install zfsutils-linux zfs-dkms spl-dkms
reboot

Problema amb rm al paquet zfs de la distribució debian https://unix.stackexchange.com/questions/383566/install-zfs-on-debian-9-stretch (service failed in journalctl -xe). if error "Please make sure the kmod spl devel <kernel>": https://github.com/zfsonlinux/zfs/issues/3065

Preparació màquina Host

  • Canviem la configuració per a que les maquines virtuals o containers puguin estar online a través del host:
nano /etc/sysctl.conf

descomentem aquesta linia:

net.ipv4.ip_forward=1

ho apliquem:

sysctl -p

Reiniciem el servei lxc-net:

systemctl restart lxc-net.service
  • Desactivem el bind9 per evitar problemes amb el bridge de lxc-net
update-rc.d bind9 disable

Bug https://bugs.launchpad.net/ubuntu/+source/lxc/+bug/1240757

error: Failed to run: dnsmasq --strict-order --bind-interfaces --pid-file=/var/snap/lxd/common/lxd/networks/vmbr0/dnsmasq.pid ....
https://discuss.linuxcontainers.org/t/failed-to-run-dnsmasq-address-already-in-use/1132/4
root@dsteranyina:/home/roger# netstat -lnp | grep ":53 "
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      806/named
tcp6       0      0 :::53                   :::*                    LISTEN      806/named
udp        0      0 127.0.0.1:53            0.0.0.0:*                           806/named
udp6       0      0 :::53                   :::*                                806/named

Reiniciem la màquina:

reboot

Inicialitzar LXD

Executem al terminal:

lxd init
Do you want to configure a new storage pool (yes/no) [default=yes]? yes
Name of the new storage pool [default=default]: lxc
Name of the storage backend to use (dir, btrfs, ceph, lvm, zfs) [default=zfs]: zfs
Create a new ZFS pool (yes/no) [default=yes]? yes
Would you like to use an existing block device (yes/no) [default=no]? no
Size in GB of the new loop device (1GB minimum) [default=15GB]: 500?
Would you like LXD to be available over the network (yes/no) [default=no]? no
Would you like stale cached images to be updated automatically (yes/no) [default=yes]? yes
Would you like to create a new network bridge (yes/no) [default=yes]? yes
What should the new bridge be called [default=lxdbr0]? 
What IPv4 address should be used (CIDR subnet notation, “auto” or “none”) [default=auto]? auto
What IPv6 address should be used (CIDR subnet notation, “auto” or “none”) [default=auto]? auto
LXD has been successfully configured.

Son importants els paràmetres del nom de la pool i la mida d'un nou device de la pool. La mida marcarà el màxim de Gb que podrà assolir un container.

Creem, llancem i configurem un container

obtenim imatges lxd: https://www.cyberciti.biz/faq/how-to-list-vm-images-in-lxd-linux-containers/

  • Creem un contenidor de Debian Stretch:
lxc launch images:debian/stretch <name-container>
  • Afegir memòria:
lxc config set <name-container> limits.memory 512MB
  • Establir limit de memòria:
lxc config set <name-container> limits.memory.enforce soft
  • Afegim un disc al container:
lxc config device add <name-container> root disk path=/ pool=<pool-name> size=20GB

<pool-name>=lxc

  • Editem la mida del disc:
lxc config device set <name-container> root size 40GB

Configuració xarxa (macvlan)

Assignar macs virtuals a les Ip Failover: https://documentation.online.net/en/dedicated-server/network/ip-failover/virtual-mac (Online.net)

  • Obtenim el nom de la interficie principal de la màquina host. En aquest cas eth1:
ifconfig
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet x.x.x.x  netmask 255.255.255.0  broadcast x.x.x.255
  • Afegim un nou dispositiu a la configuració del container:
lxc config device add <name-container> eth1 nic nictype=macvlan parent=eno1 hwaddr=<virtual-mac>

eth0 es utilitzat pel bridge lxdbr0 amb les seves 10.x.x.x propies.

  • Editem el fitxer /etc/network/interfaces del container i assignem la ip estàtica a la nova interficie eth1:
lxc exec <name-container> bash

entrem com a root i editem el fitxer

o també podem editar directament amb Vim:

lxc file edit <name-container>/etc/network/interfaces

o amb una altre editor:

lxc exec <name-container> -- nano /etc/network/interfaces

i afegim el següent contingut:

auto eth1
iface eth1 inet static
        address <ip-failover>
        netmask 255.255.255.255
  • Afegim script masquerade permanent quan s'aixequi la nova interficie. Això serveix per si volem que el container surti amb la ip pública. Creem el script masquerade-script amb el següent contingut a /etc/network/if-up.d/masquerade-script
#!/bin/bash
# Check for specific interface if desired
[ "$IFACE" != "eth1" ] || exit 0
# Adding additional routes on connection
route del default
ip route add 0.0.0.0/0 dev eth1

i li donem permisos d'execució:

chmod +x /etc/network/if-up.d/masquerade-script

- Sortim del container i el reiniciem:

lxc restart <name-container>
  • Tornem a entrar i comprovem la ip amb que surt el container:
dig +short myip.opendns.com @resolver1.opendns.com

Configuració xarxa (bridge)

  • Configurem la màquina host amb un nou bridge, editem /etc/network/interfaces i el deixem aixi:
# The primary network interface
allow-hotplug eno1
iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
    address <host_ip>
    netmask 255.255.255.0
    gateway <host_gateway=x.x.x.1>
    bridge_ports eno1
    bridge_stp off
    bridge_fd 0

Podem fer un reboot de la màquina host per assegurar-nos que l'hem configurat correctament.

  • creem un perfil lxd (profile) en mode "bridged" en una nova interficie eth1:
lxc profile create bridgeprofile
  • Editem el profile i el deixem aixi :
$ cat <<EOF | lxc profile edit bridgeprofile

(enganxem el següent text, EOF inclòs)

description: Bridged networking LXD profile
devices:
  eth1:
    name: eth1
    nictype: bridged
    parent: vmbr0
    type: nic
EOF
  • Creem un container amb el nou profile bridgeprofile i el default assignats:
lxc launch -p default -p bridgeprofile images:debian/stretch <name_container>
  • o asignem el nou bridge a un container existent:
lxc profile assign <name_container> default,bridgeprofile
  • Assignem la mac de la ip failover a la nova interficie eth1 (del nou profile) al container:
lxc config set <container_name> volatile.eth1.hwaddr <mac_address>
  • Accedim al container i editem el /etc/network/interfaces i afegim:
    
auto eth1
iface eth1 inet static
        address <ip_failover>
        netmask 255.255.255.255
        post-up ip route add <host_gateway=x.x.x.1> dev eth1
        post-up ip route add default via <host_gateway=x.x.x.1> dev eth1
        pre-down ip route del default via <host_gateway=x.x.x.1> dev eth1
        pre-down ip route del <host_gateway=x.x.x.1> dev eth1
  • Fem sortir a internet el contanier amb la seva ip pública. Creem un parell d'scripts:
nano /etc/network/if-up.d/container-eth1-ip
#!/bin/bash
# Check for specific interface if desired
[ "$IFACE" != "eth1" ] || exit 0
# Adding additional routes on connection
route add -net 0.0.0.0 gw x.x.x.1 eth1
  • Li donem permisos d'execució:
chmod +x /etc/network/if-up.d/container-eth1-ip
  • Amb el segon script eliminem la ruta del gateway intern de lxd:
nano /etc/network/if-up.d/container-eth0-ip
#!/bin/bash
# Check for specific interface if desired
[ "$IFACE" != "eth0" ] || exit 0
# Adding additional routes on connection
route del -net 0.0.0.0 gw 10.151.108.1 netmask 0.0.0.0 dev eth0
  • Li donem permisos d'execució:
chmod +x /etc/network/if-up.d/container-eth0-ip
  • Sortim del container i el reiniciem
lxc restart <name-container>
  • Tornem a entrar i comprovem la ip amb que surt el container:
dig +short myip.opendns.com @resolver1.opendns.com

apt install dnsutils

Últims retocs al container

Ajustar zona horaria

  • Canviem zona horaria:
timedatectl set-timezone 'Europe/Madrid'
timedatectl
              Local time: Thu 2018-08-09 07:12:50 CEST
  Universal time: Thu 2018-08-09 05:12:50 UTC
        RTC time: n/a
       Time zone: Europe/Madrid (CEST, +0200)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no
  • Reiniciem el container i llest

Altres comandes i consells

  • ubicació logs: /var/snap/lxd/common/lxd/logs/lxd.log
  • mostrar informació container: lxc info <name-container>
  • mostrar informació container: lxc config show <name-container> --expanded
  • execute command from host: lxc exec <name-container> -- <bash command>
  • bash acces into container: lxc exec <name-container> bash
  • crear snapshot: lxc snapshot <source container>/<snapshot name>
  • crear container from snapshot: lxc copy <source container>/<snapshot name> <destination container>

Fonts

Lxd :

Configuració Bridge:

Fils interresants: