9 Septembre 2016

Mise en place d’un réseau privé entre les noeuds

Le problème sur lequel je suis tombé hier est du au fait que les containers ne pouvaient pas accéder les uns aux autres simplement. La solution que j’ai trouvée est de créer un réseau en overlay (c’est à dire que les packets circulant dans ce réseau sont encapsulés et transite sur un autre réseau). Ce réseau est chiffré est accèssible uniquement par les service démarés explicitement sur ce réseau. L’avantage est qu’il n’est pas necessaire de rediriger les ports car les containers on un accès direct à chacun d’entre eux via un DNS.

Problèmes rencontrés

  • Soit deux service node1 et node2 basés sur nginx il n’est pas possible de faire un ping node1 sur le node2 et vice versa. Cela est du à une limitation du node balancer qui ne redirige pas les packets ICMP Issue GitHub. Il est possible qu’une prochaine version le permette mais sur la 1.12.1 ce n’est pas possible. Attention donc un ping qui n’aboutit pas ne veut donc pas dire que le service est inaccessible, l’outil curl quand à lui permet d’accéder à la page web servie par nginx.
  • Si on crée un service connecté à un réseau et que l’on expose un des ports du service (par exemple un service nginx sur le réseau my-net et on expose le port 80) le container verra deux cartes réseaux, une pour le port exposé et une autre pour le réseau my-net. Si on essaye de faire de même avec Spark cela pose problème car Spark choisit une carte réseau de façon arbitraire et ignore la seconde ce qui aboutit donc à soit une interface web inaccessible ou les workers qui n’arrivent pas à se connecter. Article décrivant le problème Une solution proposée est un proxy nginx qui lui ne souffre pas de ce problème. (worker <– (spark-net) –> master <– (spark-net) –> nginx <– (ingress) –> réseau)

Préparation d’un reverse proxy pour spark

Le reverse proxy va permetre d’éviter le problème cité plus haut. Commencons par créer la configuration de nginx :

server {  
    listen 80;  
    location / {  
        proxy_pass http://spark-master:8080;  
        proxy_set_header Host $host;  
        proxy_set_header X-Real-IP $remote_addr;  
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
        proxy_set_header X-Forwarded-Proto $scheme;  
    }  
}

Il faut ensuite créer le Dockerfile :

FROM nginx
COPY nginx-config /etc/nginx/conf.d/default.conf

Nous pouvons à présent démarer les test de cette image, pour commencer démarons un service spark-master :

docker service create --name spark-master --network spark-net nyanloutre/spark /start-master.sh

Puis le reverse proxy

docker service create --name spark-proxy --network spark-net -p 8080:80 nyanloutre/spark-proxy

On peut accéder à l’interface de Spark depuis http://cds-stage-mv1:8080/ ou en remplaceant cds-stage-mv1 par n’importequelle machine du cluster

L’image est disponible ici