Réseau virtuel de VM unifié entre plusieurs serveurs physiques KVM connectés par Internet avec openvpn et 802.1q

Ayant 2 serveurs SOYOUSTART (OVH), et n’ayant pas de patte LAN pour les faire communiquer ensemble, j’ai du recourir à openvpn pour faire dialoguer les VM du serveur A avec les VM du serveur B.

 

  • conf server
 cat /etc/openvpn/server.conf
local IP_PUB_SERVER
port PORT_SERVER
proto tcp
dev tap0
ca ca.crt
cert server.crt
key server.key
dh dh4096.pem
server-bridge 192.168.11.1 255.255.255.0 192.168.11.100 192.168.11.200
client-to-client
duplicate-cn
keepalive 10 120
tls-auth /etc/openvpn/ta.key 0 # This file is secret
comp-lzo
max-clients 4
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log-append openvpn.log
verb 3
mode server
tls-server
script-security 2
up "/etc/openvpn/up.sh"
down "/etc/openvpn/down.sh"

  • conf client

 

 cat /etc/openvpn/client.conf
client
dev tap1
proto tcp
remote IP_SERVER PORT_SERVER
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert clientPrincipal.crt
key clientPrincipal.key
ns-cert-type server
tls-auth ta.key 1
comp-lzo
verb 3
log-append openvpnclient.log
script-security 2
up "/etc/openvpn/upclient.sh"
down "/etc/openvpn/downclient.sh"
keepalive 30 120
float
status openvpn-status.log

  • Démarrer le serveur et le client VPN:

 

 
server A # systemctl start openvpn@server
server B # systemctl start openvpn@client
  • Créer l’interface br1_lan_hyp
  cat /etc/sysconfig/network-scripts/ifcfg-br1_lan_hyp
DEVICE=br1_lan_hyp
TYPE=Bridge
IPADDR=192.168.11.1
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=static
NM_CONTROLLED=no
  • Créer le bridge
 /sbin/brctl addbr br1_lan_hyp

ifconfig br1_lan_hyp 192.168.11.1 netmask 255.255.255.0

Ajouter l’interface VPN tap0 dans le bridge

 /sbin/ifconfig br1_lan_hyp promisc
/sbin/ifconfig tap0 up promisc
/sbin/brctl addif br1_lan_hyp tap0

  • Faire la meme chose sur le 2eme serveur en prenant 11.2

 

  • Ajouter le module 802.1q en créant le fichier suivant:
 cat /etc/modules-load.d/8021q.conf
8021q

  • Ajouter des vlan

dans cet exemple; j’ajoute VLAN10 avec l’ip 10.1 et VLAN20 avec l’ip 20.1

 vconfig add tap1 10
vconfig add tap1 20 brctl addbr br10 brctl addbr br20 brctl addif br10 tap1.10 brctl addif br20 tap1.20 ifconfig tap1.10 promisc ifconfig tap1.20 promisc ifconfig tap1.10 up ifconfig tap1.20 up ifconfig br10 192.168.10.1 ifconfig br20 192.168.20.1
  • Effectuer la meme manipulation sur le node2.

 

  • Automatiser la mise en bridge de tout ca dans up.sh et upclient.sh

pour le Premier serveur:

  cat /etc/openvpn/up.sh
#!/bin/bash

# CONF LAN NORMAL (GLUSTERFS)
/sbin/ifconfig br1_lan_hyp promisc
/sbin/ifconfig tap0 up promisc
/sbin/brctl addif br1_lan_hyp tap0

# CONF VLAN (VM)
vconfig add tap0 10
vconfig add tap0 20
brctl addbr br10
brctl addbr br20
brctl addif br10 tap0.10
brctl addif br20 tap0.20
ifconfig tap0.10 promisc
ifconfig tap0.20 promisc
ifconfig tap0.10 up
ifconfig tap0.20 up
ifconfig br10 192.168.10.1
ifconfig br20 192.168.20.1

exit 0

 

  • Pour le 2eme serveur:

 

 cat upclient.sh
#!/bin/bash
/sbin/ifconfig br1_lan_hyp promisc
/sbin/ifconfig tap1 up promisc
/sbin/brctl addif br1_lan_hyp tap1
/sbin/ifconfig tap1 0

sleep 4

vconfig add tap1 10
vconfig add tap1 20
brctl addbr br10
brctl addbr br20
brctl addif br10 tap1.10
brctl addif br20 tap1.20
ifconfig tap1.10 promisc
ifconfig tap1.20 promisc
ifconfig tap1.10 up
ifconfig tap1.20 up
ifconfig br10 192.168.10.2
ifconfig br20 192.168.20.2

exit 0

 

  • Dans la conf des VM, ajouter br10 ou br20 pour le bridge
  • Vérifier que les bridges contiennent bien les interfaces tap.X et vnetX:
 brctl show br10
bridge name bridge id STP enabled interfaces
br10 8000.9e56d684d75c no 
tap0.10
vnet2
vnet3
vnet5
vnet7
vnet8
vnet9

 

  • Pour finir; une VM PFSENSE (FreeBSD) qui effectue le routage, FW, NAT pour les VMs.

PFSENSE a une patte sur chaque réseau :

 

  • br0 pour le WAN
  • br1 pour le LAN hyperviseur
  • br10 pour  VLAN10; LAN étanche pour VMs
  • br20 pour VLAN20, LAN étanche pour VMS

Et ca tourne nikel.

 

GlusterFS et SplitBrain

SPLIT BRAIN sur un volume GlusterFS

 

Hier, tout fonctionnait et la je me rends compte d’un split brain suite au reboot des nodes pour de la maintenance:

root@devnix-virt-master02 nets]# gluster volume heal ovirt info split-brain
Brick devnix-virt-master01:/gluster/ovirt/
/d44ee4b0-8d36-467a-9610-c682a618b698/dom_md/ids
Number of entries in split-brain: 1

Brick devnix-virt-master02:/gluster/ovirt/
/d44ee4b0-8d36-467a-9610-c682a618b698/dom_md/ids
Number of entries in split-brain: 1

Les commandes magiques

  • Dire a Gluster d’utiliser le fichier le plus gros

gluster volume heal ovirt split-brain bigger-file /gluster/ovirt/d44ee4b0-8d36-467a-9610-c682a618b698/dom_md/ids

– Dans mon cas; les 2 fichiers étaient de taille identiques, j’ai choisi le plus récent (en faisant un ls -l dessus sur chaque node)

gluster volume heal ovirt split-brain source-brick ovirt02:/gluster/ovirt /d44ee4b0-8d36-467a-9610-c682a618b698/dom_md/ids

 

Et relancer un heal:

 

gluster volume heal ovirt info
gluster volume heal ovirt info split-brain

 

 

GlusterFS Volume pour oVirt

GLUSTERFS VOLUME pour oVirt

  • Installation des packages
yum install glusterfs-server
  • Démarrer le service
# service glusterd start
Redirecting to /bin/systemctl start glusterd.service
  • Check des nodes associés
oot@tripax-seed gluster]# gluster pool list
UUID Hostname State
1cf105ab-ff82-4fb3-99a2-a7caffd2ef8e localhost Connected

– Associationd d’un node:

[root@tripax-seed glusterfs]# gluster peer probe gluster1
peer probe: success.

– Vérification de l’association

[root@tripax-seed glusterfs]# gluster pool list
UUID Hostname State
37de18a4-05a4-4450-9c1e-0f52683f5d0b gluster1 Connected
428629d6-7632-4b2e-b34a-6cd24679e6df localhost Connected

– Création d’un volume répliqué sur 2 nodes

[root@devnix-virt-master01 glusterfs]# gluster volume create ovirt replica 2 gluster1:/gluster/ovirt ns379759.ip-5-196-70.eu:/gluster/ovirt force
volume create: ovirt: success: please start the volume to access data

– Activation du volume

[root@devnix-virt-master01 glusterfs]# gluster volume start ovirt
volume start: ovirt: success

– Désactivation du nfs qui génère beaucoup de log inutile

[root@devnix-virt-master01 ovirt]# gluster volume set ovirt nfs.disable true
volume set: success

– Mise en place des autorisations par IP pour éviter de laisser tout le monde en accès

[root@devnix-virt-master01 ovirt]# gluster volume set ovirt auth.allow 5.196.70.56,94.23.2.63,127.0.0.1
volume set: success

– Réduction du timeout à 10 sec pour le controle d’un node down

[root@devnix-virt-master01 ovirt]# gluster volume set ovirt network.ping-timeout 10
volume set: success
  • Configuration propre à oVirt

[root@devnix-virt-master01 ~]# gluster volume set ovirt storage.owner-uid 36
volume set: success
[root@devnix-virt-master01 ~]# gluster volume set ovirt storage.owner-gid 36
volume set: success

[root@devnix-virt-master01 ~]# gluster volume set ovirt server.allow-insecure on
volume set: success

  • Test en local

mount -t glusterfs localhost:/ovirt /mnt