Blog

Open Sourcing SAND, le démon de mise en réseau de Scalingo

Chargement...

10 min de lecture

Open Sourcing SAND, le démon de mise en réseau de Scalingo

Introduit pour la première fois par Scalingo en janvier 2019, SAND est un service autonome gérant des réseaux superposés qui s'intègre à Docker.

Première introduite par Scalingo en janvier 2019, SAND est un service autonome gérant des réseaux superposés qui s'intègre avec Docker. SAND (Scalingo Awesome Network Daemon) est conçu pour des entreprises à l'échelle web comme Scalingo, gérant des milliers de conteneurs chaque jour. SAND propose une API simple pour créer des réseaux superposés privés basés sur VXLAN afin de lier les conteneurs ensemble. Un des principaux avantages de cette solution est que SAND est indépendant de la technologie de conteneur sous-jacente. C'est l'un des piliers de l'infrastructure de Software-Defined Networking (SDN) de la plateforme de Scalingo.

Chez Scalingo, SAND est un élément critique de l'infrastructure alimentant certaines parties des réseaux de conteneurs. Il est actuellement utilisé pour faire fonctionner des centaines de clusters de bases de données.

Nous sommes ravis aujourd'hui d'annoncer le licenciement ouvert de SAND. En permettant aux autres membres de la communauté des réseaux définis par logiciel de tirer parti des planificateurs unifiés et de la co-localisation des charges de travail, Scalingo ouvrira la porte à de nouvelles façons de gérer les réseaux. De plus, le licenciement ouvert de SAND permettra une plus grande collaboration au sein de l'industrie et ouvrira le logiciel aux retours et contributions des ingénieurs de l'industrie, des développeurs indépendants et des universitaires du monde entier.

Fonctionnalités de la version actuelle

Scalingo fait fonctionner SAND depuis environ six mois en production et cela fonctionne très bien et se développe. L'objectif est d'offrir un moyen de gérer des réseaux superposés privés. Il est écrit en Go. L'API vous permet de CRUD un réseau privé et d'ajouter toute entité (appelée point de terminaison) à ce réseau.

La version initiale fournit également un pilote Docker pour s'intégrer facilement avec ce moteur de conteneurs.

Avantages d'utiliser SAND

Les réseaux privés créés avec SAND sont basés sur la technologie VXLAN (Virtual Extensible LAN). VXLAN isole différents réseaux tout comme les VLAN, mais encapsule les trames Ethernet de couche 2 dans des datagrammes UDP de couche 4. Ce protocole rend les VLAN plus évolutifs.

Alors que Docker fournit libnetwork qui permet de définir un réseau superposé, il est strictement lié à Docker. En revanche, SAND est complètement agnostique de la technologie de conteneur sous-jacente et vous permet d'utiliser autre chose que Docker.

Conception

Le démon de réseau SAND doit être installé sur tous les hôtes qui auront des conteneurs fonctionnant dans l'un des réseaux superposés. La configuration du réseau est stockée sur le magasin de valeurs clés etcd.

Chaque réseau superposé créé peut utiliser sa propre plage IP, mais il n'y a aucun problème à utiliser la même plage pour différents réseaux car ils sont complètement isolés les uns des autres. Par défaut, chaque réseau superposé recevra des adresses IP dans le format 10.0.0.0/24.

Créer un réseau est une opération sans effet où un ID VXLAN unique est alloué et où la configuration du réseau est stockée sur etcd.

Lorsqu'un premier point de terminaison est ajouté à un réseau, le service créera un espace de noms réseau dédié contenant l'interface de réseau VXLAN sur le serveur qui ajoute le point de terminaison. Une paire d'interfaces Ethernet virtuelles (veth) liera l'espace de noms ciblé (le réseau de conteneurs) et l'espace de noms superposé. Toutes les interfaces veth sont liées au VXLAN avec une interface de pont. En conséquence, il n'y a pas d'impact sur l'espace de noms racine du serveur exécutant SAND, tout est géré dans des espaces de noms dédiés.

Lorsqu'un point de terminaison est ajouté ou supprimé, tous les autres hôtes ayant au moins un point de terminaison dans le même réseau ajoutent des routes au point de terminaison nouvellement créé modifiant les tables ARP et FDB de l'interface VXLAN, permettant le routage entre les différents membres du réseau superposé.

Comment l'utiliser

Interface de ligne de commande autonome

SAND fournit une interface de ligne de commande permettant aux opérateurs de manipuler et de visualiser les réseaux superposés et leurs membres :

# On any member of the cluster
$ sand-agent-cli network-create
New network created:
* id=ed80c475-782d-4507-bd80-631b476d9ecc name=net-sc-ed80c475-782d-4507-bd80-631b476d9ecc type=overlay ip-range=10.0.0.0/24, vni=13

# On the node which is running the container to link
$ sand-agent-cli endpoint-create --network ed80c475-782d-4507-bd80-631b476d9ecc --ns /var/run/docker/netns/73d3c79736d3
New endpoint created:
* [ACTIVE]  ID=6ffc3990-b212-47f2-a5d1-2afe7526e548 networkID=ed80c475-782d-4507-bd80-631b476d9ecc hostname=dev.172.17.0.1.xip.st-sc.fr IP=10.0.0.2/24 NS=/var/run/docker/netns/73d3c79736d3

# The SAND overlay network is now accessible from the targeted namespace
$ nsenter --net=/var/run/docker/netns/73d3c79736d3 ip addr
483: sand0@if484: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 02:84:0a:00:00:02 brd ff:ff:ff:ff:ff:ff link-netns sc-ns-ed80c475-782d-4507-bd80-631b476d9ecc
        inet 10.0.0.2/24 brd 10

# On any member of the cluster
$ sand-agent-cli network-create
New network created:
* id=ed80c475-782d-4507-bd80-631b476d9ecc name=net-sc-ed80c475-782d-4507-bd80-631b476d9ecc type=overlay ip-range=10.0.0.0/24, vni=13

# On the node which is running the container to link
$ sand-agent-cli endpoint-create --network ed80c475-782d-4507-bd80-631b476d9ecc --ns /var/run/docker/netns/73d3c79736d3
New endpoint created:
* [ACTIVE]  ID=6ffc3990-b212-47f2-a5d1-2afe7526e548 networkID=ed80c475-782d-4507-bd80-631b476d9ecc hostname=dev.172.17.0.1.xip.st-sc.fr IP=10.0.0.2/24 NS=/var/run/docker/netns/73d3c79736d3

# The SAND overlay network is now accessible from the targeted namespace
$ nsenter --net=/var/run/docker/netns/73d3c79736d3 ip addr
483: sand0@if484: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 02:84:0a:00:00:02 brd ff:ff:ff:ff:ff:ff link-netns sc-ns-ed80c475-782d-4507-bd80-631b476d9ecc
        inet 10.0.0.2/24 brd 10

# On any member of the cluster
$ sand-agent-cli network-create
New network created:
* id=ed80c475-782d-4507-bd80-631b476d9ecc name=net-sc-ed80c475-782d-4507-bd80-631b476d9ecc type=overlay ip-range=10.0.0.0/24, vni=13

# On the node which is running the container to link
$ sand-agent-cli endpoint-create --network ed80c475-782d-4507-bd80-631b476d9ecc --ns /var/run/docker/netns/73d3c79736d3
New endpoint created:
* [ACTIVE]  ID=6ffc3990-b212-47f2-a5d1-2afe7526e548 networkID=ed80c475-782d-4507-bd80-631b476d9ecc hostname=dev.172.17.0.1.xip.st-sc.fr IP=10.0.0.2/24 NS=/var/run/docker/netns/73d3c79736d3

# The SAND overlay network is now accessible from the targeted namespace
$ nsenter --net=/var/run/docker/netns/73d3c79736d3 ip addr
483: sand0@if484: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 02:84:0a:00:00:02 brd ff:ff:ff:ff:ff:ff link-netns sc-ns-ed80c475-782d-4507-bd80-631b476d9ecc
        inet 10.0.0.2/24 brd 10

# On any member of the cluster
$ sand-agent-cli network-create
New network created:
* id=ed80c475-782d-4507-bd80-631b476d9ecc name=net-sc-ed80c475-782d-4507-bd80-631b476d9ecc type=overlay ip-range=10.0.0.0/24, vni=13

# On the node which is running the container to link
$ sand-agent-cli endpoint-create --network ed80c475-782d-4507-bd80-631b476d9ecc --ns /var/run/docker/netns/73d3c79736d3
New endpoint created:
* [ACTIVE]  ID=6ffc3990-b212-47f2-a5d1-2afe7526e548 networkID=ed80c475-782d-4507-bd80-631b476d9ecc hostname=dev.172.17.0.1.xip.st-sc.fr IP=10.0.0.2/24 NS=/var/run/docker/netns/73d3c79736d3

# The SAND overlay network is now accessible from the targeted namespace
$ nsenter --net=/var/run/docker/netns/73d3c79736d3 ip addr
483: sand0@if484: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 02:84:0a:00:00:02 brd ff:ff:ff:ff:ff:ff link-netns sc-ns-ed80c475-782d-4507-bd80-631b476d9ecc
        inet 10.0.0.2/24 brd 10

Créez un point de terminaison pour chaque entité qui doit rejoindre le réseau superposé, elles pourront communiquer instantanément entre elles.

Intégration Docker

Il est également possible d'intégrer SAND avec Docker en utilisant libnetwork de Docker RemotePlugin

La ressource réseau initiale doit être créée à l'aide de l'API/CLI SAND.

$ sand-agent-cli network-create
New network created:
* id=ed80c475-782d-4507-bd80-631b476d9ecc name=net-sc-ed80c475-782d-4507-bd80-631b476d9ecc type=overlay ip-range=10.0.0.0/24, vni=13

# Integrate the SAND network with Docker networks
$ docker network create \
  --driver sand --opt sand-id=ed80c475-782d-4507-bd80-631b476d9ecc \
  --ipam-driver sand --ipam-opt sand-id=ed80c475-782d-4507-bd80-631b476d9ecc \
  my-overlay-network

# Use the docker network when creating a container, the SAND network will be setup
$ docker run --network my-overlay-network -it ubuntu:latest bash
root@feb4eb485d57:/# ip addr
487: sand0@if488: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 02:84:0a:00:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.0.0.2/24 brd 10

$ sand-agent-cli network-create
New network created:
* id=ed80c475-782d-4507-bd80-631b476d9ecc name=net-sc-ed80c475-782d-4507-bd80-631b476d9ecc type=overlay ip-range=10.0.0.0/24, vni=13

# Integrate the SAND network with Docker networks
$ docker network create \
  --driver sand --opt sand-id=ed80c475-782d-4507-bd80-631b476d9ecc \
  --ipam-driver sand --ipam-opt sand-id=ed80c475-782d-4507-bd80-631b476d9ecc \
  my-overlay-network

# Use the docker network when creating a container, the SAND network will be setup
$ docker run --network my-overlay-network -it ubuntu:latest bash
root@feb4eb485d57:/# ip addr
487: sand0@if488: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 02:84:0a:00:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.0.0.2/24 brd 10

$ sand-agent-cli network-create
New network created:
* id=ed80c475-782d-4507-bd80-631b476d9ecc name=net-sc-ed80c475-782d-4507-bd80-631b476d9ecc type=overlay ip-range=10.0.0.0/24, vni=13

# Integrate the SAND network with Docker networks
$ docker network create \
  --driver sand --opt sand-id=ed80c475-782d-4507-bd80-631b476d9ecc \
  --ipam-driver sand --ipam-opt sand-id=ed80c475-782d-4507-bd80-631b476d9ecc \
  my-overlay-network

# Use the docker network when creating a container, the SAND network will be setup
$ docker run --network my-overlay-network -it ubuntu:latest bash
root@feb4eb485d57:/# ip addr
487: sand0@if488: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 02:84:0a:00:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.0.0.2/24 brd 10

$ sand-agent-cli network-create
New network created:
* id=ed80c475-782d-4507-bd80-631b476d9ecc name=net-sc-ed80c475-782d-4507-bd80-631b476d9ecc type=overlay ip-range=10.0.0.0/24, vni=13

# Integrate the SAND network with Docker networks
$ docker network create \
  --driver sand --opt sand-id=ed80c475-782d-4507-bd80-631b476d9ecc \
  --ipam-driver sand --ipam-opt sand-id=ed80c475-782d-4507-bd80-631b476d9ecc \
  my-overlay-network

# Use the docker network when creating a container, the SAND network will be setup
$ docker run --network my-overlay-network -it ubuntu:latest bash
root@feb4eb485d57:/# ip addr
487: sand0@if488: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 02:84:0a:00:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.0.0.2/24 brd 10

Essayer SAND

Nous espérons que vous essayez SAND par vous-même et que vous nous envoyez vos retours ! Vous pouvez apprendre comment nous utilisons SAND chez Scalingo en lisant nos articles de blog annonçant des clusters Elasticsearch et des clusters Redis.

Utilisation future

Avec SAND, nous avons développé la technologie sous-jacente pour construire automatiquement des réseaux privés via une API, également appelée Software Defined Networking. Actuellement, nous l'utilisons pour isoler des clusters de bases de données de notre offre de base de données en tant que service. À l'avenir, nous envisageons de nombreuses applications amusantes telles que Espaces Privés : toutes vos applications et bases de données dans le même réseau privé.

Photo de Sumner Mahaffey sur Unsplash

Etienne Michon, Scalingo

Étienne Michon

Docteur en informatique, Étienne Michon occupe actuellement le poste d'ingénieur R&D chez Scalingo. Il était l'un des premiers employés de Scalingo et il contribue grandement à faire grandir ce blog grâce à ses articles techniques de qualité.

Restez informé

Recevez des articles et des mises à jour de la plateforme dans votre boîte de réception.

Prêt à déployer en toute confiance ?

Découvrez des déploiements sans temps d'arrêt, une mise à l'échelle automatique intelligente et une infrastructure entièrement gérée. Commencez à déployer vos applications sur Scalingo dès aujourd'hui.

Aucune carte de crédit requise • Déployez en quelques minutes • Annulez à tout moment

Déployez une application ou base de données

Commencez à déployer

Rejoignez les équipes qui misent sur une plateforme conçue pour livrer rapidement, opérer sereinement, avec des valeurs européennes et un support humain.

Déployez une application ou base de données

Commencez à déployer

Rejoignez les équipes qui misent sur une plateforme conçue pour livrer rapidement, opérer sereinement, avec des valeurs européennes et un support humain.

Déployez une application ou base de données

Commencez à déployer

Rejoignez les équipes qui misent sur une plateforme conçue pour livrer rapidement, opérer sereinement, avec des valeurs européennes et un support humain.