
Un bilanciatore di carico di livello 4 orizzontalmente scalabile con Direct Server Return per Linux che utilizza XDP/eBPF
Questo README è in fase di aggiornamento per riflettere le modifiche recenti – alcune informazioni potrebbero non corrispondere al codice attuale. Questa iterazione del codice non è ancora pronta per ambienti di produzione – utilizza una release v0.2 per ambienti reali
Un bilanciatore di carico di livello 4 (L4LB) orizzontalmente scalabile con Direct Server Return (DSR) per Linux che utilizza XDP/eBPF.
Se pensi che possa essere utile o hai domande/suggerimenti, sentiti libero di contattarmi a [email protected] o aprire un'issue su GitHub.
Ora supporta IPv6 e distribuzione a livello 3 (noto anche come tunneling)! La libreria XVS è stata aggiornata per includere queste funzionalità e inoltre elimina la necessità di eseguire controlli di salute da un namespace di rete, semplificando notevolmente il codice. Questo porrà fine al requisito che tutti i backend condividano una VLAN con il bilanciatore di carico.
Le restrizioni attuali del codice impediscono di abilitare il tunneling per servizio. Utilizzare l'opzione -tunnel consente di abilitare globalmente il tunneling di livello 3 utilizzando uno schema singolo (IP-in-IP, GRE, FOU o GUE). In futuro, il codice verrà aggiornato per consentire la configurazione del tunneling a livello di servizio.
Il bilanciamento del carico di livello 2 continuerà ad essere supportato – la ragione principale per cui è stato avviato il progetto è stata la mancanza di supporto di livello 2 da parte del bilanciatore di carico Katran di Facebook.
Un file di configurazione di esempio per IPv6/L3 è incluso – seguirà una documentazione più dettagliata.
VC5 è un bilanciatore di carico di rete progettato per sostituire gli apparecchi hardware legacy. Permette di distribuire servizi con indirizzi IP virtuali (VIP) a gruppi di server backend ("reali"). I server reali possono eseguire i servizi stessi o agire come proxy per un altro livello di server (ad es. HAProxy che funge da router HTTP/offload SSL di livello 7 quando è necessario prendere decisioni a livello applicativo). L'unico requisito è che i VIP siano configurati su un dispositivo loopback su ciascun server reale, ad es.: ip addr add 192.168.101.1/32 dev lo
I servizi e i server reali sono specificati in un file di configurazione, insieme alle definizioni dei controlli di salute. Quando i server backend superano i controlli e sono disponibili in numero sufficiente per fornire un servizio, gli indirizzi IP virtuali vengono annunciati ai router tramite BGP.
Ora è supportata la distribuzione del traffico sia a livello 2 che a livello 3. La distribuzione a livello 2 richiede che i server reali condividano una VLAN con il bilanciatore di carico; quando riceve un pacchetto da distribuire, il bilanciatore aggiorna gli indirizzi hardware ethernet nel pacchetto utilizzando l'indirizzo MAC del server reale come destinazione e il proprio indirizzo MAC come sorgente, e inoltra il pacchetto attraverso l'interfaccia appropriata, aggiornando l'ID VLAN 802.1Q se i pacchetti sono con tag VLAN.
La distribuzione a livello 3 richiede che i pacchetti vengano incapsulati in un protocollo di tunneling indirizzato all'IP del server reale e inoltrati tramite un router (a meno che il server e il bilanciatore di carico non condividano una VLAN). Se, una volta incapsulato, un pacchetto supera la dimensione massima di trasmissione della rete, viene inviato un messaggio ICMP alla sorgente con indicazioni sull'MTU appropriato da utilizzare. I server backend devono solo decapsulare i pacchetti – non è richiesta la tunneling bidirezionale con i bilanciatori di carico.
Un server con un'interfaccia di rete da 10 Gbit/s dovrebbe essere in grado di supportare un servizio HTTP con larghezza di banda in egress superiore a 100 Gbit/s grazie alla natura asimmetrica della maggior parte del traffico Internet. Per servizi più piccoli, una o due macchine virtuali modeste saranno probabilmente sufficienti per gestire un servizio che genera alcuni gigabit/s di traffico in uscita.
Se un'istanza non è sufficiente, è possibile aggiungere più server per scalare orizzontalmente la capacità (e fornire ridondanza) utilizzando la funzionalità ECMP del router. Sono supportate interfacce in bonding 802.3ad e trunking VLAN 802.1Q (vedi directory examples/).
Non sono richiesti moduli del kernel o configurazioni complesse, anche se per ottenere le migliori prestazioni si consiglia un driver per scheda di rete con supporto della modalità nativa XDP (ad es.: mlx4, mlx5, i40e, ixgbe, ixgbevf, nfp, bnxt, thunder, dpaa2, qede). Un elenco completo è disponibile nella pagina di supporto dei driver del progetto XDP.
Per ottenere i migliori risultati, si consiglia di disabilitare/disinstallare irqbalance.
Dovrai selezionare un IP primario da passare al bilanciatore. Viene utilizzato come ID del router BGP.
Un semplice esempio su un server con una singola interfaccia ethernet senza tag:
apt-get install git make libelf-dev golang-1.20 libyaml-perl libjson-perl ethtool (o l'equivalente della tua distribuzione)ln -s /usr/lib/go-1.20/bin/go /usr/local/bin/go (assicurati che il binario Go sia nel tuo PATH)git clone https://github.com/davidcoles/vc5.gitcd vc5/cmdcp config.sample.yaml config.yaml (modifica config.yaml in base alle tue esigenze)make (scarica la libreria libbpf, compila il binario e il file JSON di configurazione)./vc5 10.1.10.100 config.json eth0 (modifica utilizzando l'indirizzo IP del tuo server e l'interfaccia ethernet)ip addr add 192.168.101.1/32 dev lo)