Ubuntu 16.04: Utilisation d'Openvswitch avec LXC

De Pegasus45

Voici la procédure pour utiliser Openvswitch avec les container LXC:

On commence par installer les paquets suivants:

Command
apt-get install lxc openvswitch-switch


On crée un switch virtuel:

Command
ovs-vsctl add-br switch0


On rajoute l'interface réseau physique de l'hôte à ce switch virtuel:

Command
ovs-vsctl add-port switch0 eth0


Maintenant, on peut créer un container:

Command
lxc-create -n container01 -t ubuntu

Avant de le démarrer, il faut modifier sa configuration:

Configuration File vi /var/lib/lxc/container01/config
(supprimer la ligne suivante)
lxc.network.link

(ajouter les lignes suivantes)
lxc.network.script.up = /etc/lxc/ovsup
lxc.network.script.down = /etc/lxc/ovsdown


Comme on peut le voir, au démarrage du container, il exécute le script ovsup, qui va le rattacher au switch Openvswitch. A son arrêt, il va exécuter le script ovsdown, qui va le détacher du switch.


On crée le premier script:

Configuration File vi /etc/lxc/ovsup
#!/bin/bash

BRIDGE="switch0"
ovs-vsctl --may-exist add-br $BRIDGE
ovs-vsctl --if-exists del-port $BRIDGE $5
ovs-vsctl --may-exist add-port $BRIDGE $5

On crée le deuxième script:

Configuration File vi /etc/lxc/ovsdown
#!/bin/bash

BRIDGE="switch0"
ovs-vsctl --if-exists del-port $BRIDGE $5

On les rend exécutable;

Command
chmod +x /etc/lxc/ovs*


Maintenant, on peut démarrer le container:

Command
lxc-start -n container01


On peut voir qu'un nouveau port a été créé sur le switch:

Command
root@lxc01:~# ovs-vsctl show


b2f58cb4-86c2-4777-a41d-e04e3629dc30
    Bridge "switch0"
        Port "vethF6BPLJ"
            Interface "vethF6BPLJ"
        Port "eth0"
            Interface "eth0"
        Port "switch0"
            Interface "switch0"
                type: internal
    ovs_version: "2.5.0"

A chaque démarrage du container, le nom de l'interface est regénéré à chaque fois, de façon aléatoire.


troubleshooting

J'ai remarqué que, lors l'arrêt ou le reboot de l'hôte, le script ovsdown n'est pas exécuté. Du coup, l'interface virtuelle n'est jamais supprimée et un certain nombre s'accumule à chaque reboot:

Command
root@lxc01:~# ovs-vsctl show


b2f58cb4-86c2-4777-a41d-e04e3629dc30
    Bridge "switch0"
        Port "vethQIRPG8"
            Interface "vethQIRPG8"
                error: "could not open network device vethQIRPG8 (No such device)"
        Port "vethBMTJY0"
            Interface "vethBMTJY0"
        Port "vethR680VM"
            Interface "vethR680VM"
                error: "could not open network device vethR680VM (No such device)"
        Port "vethYO55QH"
            Interface "vethYO55QH"
                error: "could not open network device vethYO55QH (No such device)"
        Port "vethXXS0L2"
            Interface "vethXXS0L2"
        Port vethWPXDSG
            Interface vethWPXDSG
        Port "vethKEVG7B"
            Interface "vethKEVG7B"
        Port "veth3DF5A7"
            Interface "veth3DF5A7"
                error: "could not open network device veth3DF5A7 (No such device)"
        Port "eth0"
            Interface "eth0"
        Port "vethJ8BO3U"
            Interface "vethJ8BO3U"
        Port "switch0"
            Interface "switch0"
                type: internal
        Port "vethQJ9GGT"
            Interface "vethQJ9GGT"
        Port "vethBMP3QN"
            Interface "vethBMP3QN"
                error: "could not open network device vethBMP3QN (No such device)"
    ovs_version: "2.5.0"

Ma solution est de placer ce petit script dans "/etc/rc.local":

Configuration File vi /etc/rc.local
[...]
for interface in $(/usr/bin/ovs-vsctl show | grep error | sed 's/  */ /g' | cut -d ' ' -f8); do /usr/bin/ovs-vsctl del-port $interface; done