Simuleer een netwerk met hoge latentie met Docker-containers en “tc” -opdrachten

Met docker-containers is het heel eenvoudig om een ​​netwerk met hoge latentie in één machine te simuleren. In dit bericht zullen we zien hoe.

Voorbereiding

We zullen de volgende vier bestanden maken.

docker-compose.yml

We gaan netwerkgerelateerde zaken wijzigen, dus de NET_ADMIN-mogelijkheid is nodig.

client/Dockerfile

We moeten iproute2 installeren om het tc commando te gebruiken. We zullen hier ook het ping-commando installeren voor testdoeleinden.

server/Dockerfile

Dan, de server-side. U kunt een Nginx-container en dergelijke gebruiken, maar hier gebruiken we een eenvoudige server die in Go is geschreven. Merk op dat we hier ook iproute2 installeren.

server/main.go

Een zeer r y eenvoudige HTTP-server.

Latenties toevoegen

Nu zijn we klaar.

Laten we eerst de twee containers laten werken met het volgende commando.

Voer vervolgens de volgende twee opdrachten uit. Deze voegen 100 ms latenties toe aan het uitgaande verkeer op de twee containers.

Laten we eens kijken of het goed is gegaan. We verwachten dat de RTT tussen de twee 200 ms zal zijn.

Het ziet er goed uit!

Wat gebeurt er

Wanneer we een docker-container maken, worden er een paar virtuele netwerkinterfaces gemaakt. Een daarvan behoort tot de hostcomputer en de andere behoort tot de container (hier worden netwerknaamruimten gebruikt). En de host-side is verbonden met een virtuele bridge, waardoor de containers met elkaar kunnen communiceren. Raadpleeg deze pagina voor meer informatie over Docker-netwerken.

Op Linux-machines komt uitgaand netwerkverkeer eerst in een “wachtrij”. En meestal worden ze zo snel mogelijk naar de buitenwereld gestuurd in de FIFO-volgorde.

Het gedrag van deze wachtrij is configureerbaar. We kunnen bijvoorbeeld latenties toevoegen (zoals we in dit bericht hebben gedaan), of we kunnen een deel van het verkeer willekeurig verwijderen. Dit mechanisme wordt ‘Discipline in de wachtrij’ of ‘qdisc’ genoemd. Het “tc qdisc… netem…” commando dat we uitvoerden was precies voor het emuleren van een netwerk met hoge latentie in de qdisc.

“qdiscs” zijn configureerbaar voor elke netwerkinterface. In ons voorbeeld hebben we de qdisc geconfigureerd die is gekoppeld aan de eth0-netwerkinterface. Standaard heeft een Docker-container een eth0 virtuele netwerkinterface, die is verbonden met de hostmachine.

Merk op dat we de opdracht tc in elk van de twee containers hebben gebruikt. Dit komt doordat qdisc alleen uitgaand verkeer beïnvloedt. We voerden de opdracht in beide uit om een ​​werkelijke bi-directionele latentie van 100 ms te maken, die de echte omgevingen beter weerspiegelt.

Dit bericht is ook beschikbaar in het Japans.