Infra Hosting, le début

💡
Toutes les configurations sont commit sur mon github : https://github.com/Nathan0510/Blog

Mais pourquoi ? Le réseau ne suffit pas ?

Un backbone IP/MPLS n'est pas suffisant à l'heure actuelle pour répondre à tous les besoins clients (et aussi ceux d'un opérateur).

Par exemple, nos radius, nos serveurs DNS/MAIL/Monitoring, notre source de vérité, notre cloud doivent bien être virtualisés quelque part. On ne va pas acheter/configurer/racker un serveur dédié pour un service ! L'addition serait salée 😃

Notre but est donc de pouvoir virtualiser un certains nombres de services. Idéalement, je voudrai "deux clouds" : un privé (pour les besoins infra opérateur) et un public (pour les demandes clients). Etant un petit opérateur, je ne vais pas pouvoir, au début, en avoir deux malheureusement 🙁

Se pose la question de quel système utiliser. Je souhaite, idéalement, un hyperviseur open source, basé sur linux, bon forum, grande communauté, l'implémentation du SDN (vous allez voir pourquoi après) et du HCI. Un petit tableau récapitulatif :

VMware HyperV Proxmox XEN OpenStack OpenNebula
Tier 1 1 1 1 Orchestrateur multi hyperviseur Orchestrateur multi hyperviseur
Open Source Non Non Oui Oui Oui Oui
OS VMware Windows Debian XCP-NG Ca depend Alma / RHEL
Prix Fuck Broadcom Fuck Microsoft Gratuit Gratuit Gratuit Gratuit
SDN Oui via NSX Oui Oui Oui Oui Oui
Stockage Hyperconvergence VSAN S2D Ceph Ceph Ceph Ceph

OpenStack et OpenNebula sont plus des clouds public, VMware et HyperV c'est non !

Reste plus que Xen ou Promox. Etant plus à l'aise avec Promox, j'ai décidé de partir là dessus !

Solutions Proxmox

    • PVE : Proxmox Virtual Environment (un serveur où on installe l'OS Proxmox).
    • PBS : Proxmox Backup Server (un serveur qui permet de backuper les VM)
    • PDM : Proxmox Datacenter Manager (un serveur qui permet de gouverner les PVE que ce soit en multi cluster, mono cluster)

Installation Proxmox

Ce blog ne tend pas à montrer comment installer Proxmox, il existe déjà un wiki bien documenté et un OS fourni (ou installation via paquets). J'ai juste installé mon OS sur deux disques ZFS en mirror (équivalent au RAID1 mais sans la carte matérielle pour faire du RAID !).

Configuration réseau Proxmox

Au lieu de faire du L2 entre les leafs et les serveurs, je souhaite pousser l'EVPN/VXLAN au bout !

Utilisant la version 9 de proxmox, on a accès au SDN intégré en GUI. Cependant, je le trouve assez limité (si ce n'est inutile) quand il s'agit de relier le cluster à une fabric externe (comme ma fabric Arista). J'ai l'impression qu'ils ont pensé au SDN que pour les membres d'un cluster Proxmox.

Donc j'ai préféré utiliser la bonne vieille CLI de Debian. On verra par la suite si j'arrive à basculer sur le SDN de Proxmox (peut-être à la version 9.1). Proxmox est basé sur FRR donc bon ! Retour aux sources 😄

Je vais utiliser cette architecture au début : (rien de bien compliqué, mon vEOS est un leaf qui fait EVPN/VXLAN avec un hôte derrière)

💡
Avant toute chose, FRR ne supporte par l'EVPN en IPv6 .... Un ticket est en cours https://github.com/FRRouting/frr/issues/5885. En espérant une avancée un jour.

L'interco se fait dans le subnet 192.168.100.0/24 (.1 pour l'Arista et .2 pour Proxmox).

La Loopback de PVE1 est 172.16.1.51 et 172.16.1.1 pour l'Arista.

La conf du fichier /etc/network/interfaces du PVE :

root@pve1:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

iface ens18 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.1.154/24
        gateway 192.168.1.254
        bridge-ports ens18
        bridge-stp off
        bridge-fd 0

auto ens19
iface ens19 inet static
        address 192.168.100.2/24
auto lo1
iface lo1 inet manual
    pre-up ip link add lo1 type dummy
    address 172.16.1.51/32

L'interface ens18 et le vmbr0 c'est uniquement pour le management.

Et côté FRR ?

pve1# sh run
Building configuration...

Current configuration:
!
frr version 10.3.1
frr defaults datacenter
hostname pve1
log syslog informational
service integrated-vtysh-config
!
router bgp 65051
 bgp router-id 172.16.1.51
 timers bgp 20 60
 neighbor 192.168.100.1 remote-as 65051
 neighbor 192.168.100.1 update-source 192.168.100.2
 neighbor 192.168.100.1 capability extended-nexthop
 !
 address-family ipv4 unicast
  redistribute connected
 exit-address-family
 !
 address-family l2vpn evpn
  neighbor 192.168.100.1 activate
  advertise-all-vni
 exit-address-family
exit
!
end

Sur l'Arista, rien de nouveau :

TEST#sh run | s bgp
router bgp 65051
   router-id 172.16.1.1
   timers bgp 20 60
   distance bgp 20 200 200
   graceful-restart-helper long-lived
   maximum-paths 8 ecmp 16
   neighbor 192.168.100.2 remote-as 65051
   neighbor 192.168.100.2 update-source Ethernet1
   neighbor 192.168.100.2 description PVE1
   neighbor 192.168.100.2 ebgp-multihop 2
   neighbor 192.168.100.2 send-community extended
   !
   vlan 1000
      rd 65051:1000
      route-target both 1:1
      route-target both 65051:1000
      redistribute learned
   !
   address-family evpn
      neighbor 192.168.100.2 activate
   !
   address-family ipv4
      neighbor 192.168.100.2 activate
      redistribute connected

TEST#sh run int vxlan1
interface Vxlan1
   vxlan source-interface Loopback1
   vxlan udp-port 4789
   vxlan encapsulation ipv4
   vxlan vlan 1000 vni 1000

Mes sessions EVPN montent bien :

pve1# sh bgp evpn summary
BGP router identifier 172.16.1.51, local AS number 65051 VRF default vrf-id 0
BGP table version 0
RIB entries 7, using 896 bytes of memory
Peers 2, using 47 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
192.168.100.1   4      65051      2077      1584       46    0    0 05:55:58            2        2 N/A

Total number of neighbors 1

Maintenant, il faut créer une interface bridge linux qu'on va attribuer à la VM et qu'on link à une interface VXLAN. De retour dans le fichier /etc/network/interfaces :

auto VNET1000
iface VNET1000
    bridge_ports vxlan_VNET1000
    bridge_stp off
    bridge_fd 0
    mtu 1450

auto vxlan_VNET1000
iface vxlan_VNET1000
    vxlan-id 1000
    vxlan-learning off
    bridge-learning off
    vxlan-local-tunnelip 172.16.1.51
    mtu 1450

On restart le démon networking et on regarde en GUI ce que ca donne :

Plus qu'à tester ! On créer une VM et on lui attribue l'interface VNET1000 :

On lui attribue une IP : 10.0.0.1/24 et l'hôte derrière l'Arista 10.0.0.2/24.

On a bien les MACs dans les VNI sur les deux VTEPs :

pve1# sh evpn mac vni 1000
Number of MACs (local and remote) known for this VNI: 2
Flags: N=sync-neighs, I=local-inactive, P=peer-active, X=peer-proxy
MAC               Type   Flags Intf/Remote ES/VTEP            VLAN  Seq #'s
bc:24:11:8f:74:b6 local        fwpr100p0                            0/0
50:00:00:1b:00:00 remote       172.16.1.1                           0/0

TEST#sh mac address-table vlan 1000
          Mac Address Table
------------------------------------------------------------------

Vlan    Mac Address       Type        Ports      Moves   Last Move
----    -----------       ----        -----      -----   ---------
1000    5000.001b.0000    DYNAMIC     Et2        1       7:25:25 ago
1000    bc24.118f.74b6    DYNAMIC     Vx1        1       0:10:08 ago
Total Mac Addresses for this criterion: 2

On voit bien que les VTEPs se découvrent de façon dynamique :

pve1# sh evpn vni 1000
VNI: 1000
 Type: L2
 Vlan: 1
 Bridge: VNET1000
 Tenant VRF: default
 VxLAN interface: vxlan_VNET1000
 VxLAN ifIndex: 106
 SVI interface: VNET1000
 SVI ifIndex: 107
 Local VTEP IP: 172.16.1.51
 Mcast group: 0.0.0.0
 Remote VTEPs for this VNI:
    172.16.1.1 flood: HER
 Number of MACs (local and remote) known for this VNI: 2
 Number of ARPs (IPv4 and IPv6, local and remote) known for this VNI: 1
 Advertise-gw-macip: No
 Advertise-svi-macip: No

Un petit ping ?

[admin@MikroTik] > /ping 10.0.0.1
  SEQ HOST                                     SIZE TTL TIME       STATUS
    0 10.0.0.1                                   56  64 2ms2us
    1 10.0.0.1                                   56  64 2ms800us
    2 10.0.0.1                                   56  64 2ms546us
    sent=3 received=3 packet-loss=0% min-rtt=2ms2us avg-rtt=2ms449us
   max-rtt=2ms800us

EZ l'EVPN/VXLAN entre nos hyperviseurs et les leafs !!!

Wireshark

Rien de nouveau, on observe bien l'entête VXLAN entre nos deux VTEPs :

Limitations et conclusion

Pour le premier épisode de l'infra hosting, j'ai décidé de ne pas me baser sur le SDN intégré à la GUI de Proxmox, j'ai eu beaucoup de mal à monter l'EVPN entre les deux VTEPs et impossible de monter le VXLAN en utilisant la méthode d'apprentissage dynamique des VTEPs ... Obligé de mettre les peer en statique donc autant dire pas ouf.

De plus, il semblerait que je ne puisse pas faire du vlan-aware-bundle pour le VXLAN. Ce qui signifie un VLAN = une VNI = un RD. Dommage 😦

Le SDN Proxmox est basé sur IfUpDown2 (https://github.com/CumulusNetworks/ifupdown2) qui ne supporte pas le VXLAN en IPv6 ... Une discussion est en cours (https://github.com/CumulusNetworks/ifupdown2/pull/315). Il semblerait que le PR résout le problème mais NVIDIA ne l'a jamais passé en prod. Dans un monde qui tend en IPv6, c'est pas sérieux du tout !

C'est pour cela que j'ai décidé de passer en CLI 😃

Prochain épisode : Mise en cluster des Proxmox et si tout fonctionne, on commence à tâter du CEPH !

Je termine sur un mot de fin : recherche travail por favor (service infra/production/exploitation/avant vente d'un opérateur BtoB)