CérénIT

Suite à une mission, synthèse sur la possibilité à date de gérer des conteneurs Linux et Windows avec Docker.

Contexte

Les tests ont été réalisés, début mai 2017, sur les environnements suivants :

  • VM Ubuntu 16.04 LTS, à jour, avec Docker 17.03-ee
  • VM Windows Serveur 2016, à jour, avec Docker 17.03-ee.

En début de mission, il était supposé qu'une application métier en C# pourrait migrer vers ASP.net Core (la version opensource de .Net et sa déclinaison ASP) et donc sur un conteneur Linux. La suite nous prouva que toutes les APIs ne sont pas (et ne seront pas forcément) dans la version opensource de .Net et qu'il nous fallait envisager des conteneurs Windows à court terme et une infrastructure hybride Windows & Linux, tant au niveau des hôtes que des conteneurs.

Support de Windows dans le monde des conteneurs.

Avant d'aller plus loin, il faut bien avoir en tête la jeunesse du support de Windows dans le monde des conteneurs. Il faut distinguer deux niveaux de supports de l'OS Windows :

  • Support de Windows comme machine hôte et au sein de laquelle seraient exécutés des conteneurs,
  • Support de Windows comme OS de conteneur, celui-ci s'exécutant sur une machine hôte Windows et/ou Linux

Support de Windows comme machine hôte :

  • Docker Toolbox : annoncé en Aout 2015 avec le pré-requis de Virtualbox pour avoir une VM linux en intermédiaire, le projet est maintenant abandonné au profit de Docker for Windows.
  • Docker for Windows 10 : disponible depuis Juillet 2016, il permet d'exécuter soit des containers windows, soit des containers linux mais pas les deux en même temps.
  • Docker for Windows Server 2016 : disponible depuis septembre 2016. Il ne supporte que des conteneurs Windows.
  • Kubernetes supporte, en version alpha, Windows Server 2016 depuis la version 1.5 (décembre 2016). Néanmoins, toutes les fonctionnalités de Kubernetes ne sont pas encore implémentées à date : Kubernetes 1.5 supporting production workloads & Windows Server Support Comes to Kubernetes
  • Rancher supporte Windows en version expérimentale depuis la version 1.3 (Janvier 2017) ; Support de Windows dans Rancher

Support de Windows comme OS de container :

  • disponible depuis l'été 2016 pour Docker,
  • Depuis fin 2016 pour Kubernetes en version alpha,
  • Depuis début 2017 en version expérimentale pour Rancher 1.3+.

Dans le cadre de la DockerCon d'Avril 2017, Docker et Microsoft ont annoncé le support des conteneurs Linux sous Microsoft Server 2016 via Hyper-V. Il devrait alors être possible de pouvoir lancer simultanément des conteneurs Linux ET Windows sous Windows Server 2016. Il n'y a pas de date connue pour la sortie de la version supportant cette nouveauté. Il faudra surveiller les prochaines releases trimestrielles de Docker pour savoir quand cela sera utilisable de façon "stable".

En somme, en continuant notre test plus loin, nous savons que nous entrons dans un monde immature avec un support incomplet.

Cluster Swarm hybride Windows/Linux

La première surprise fut de voir qu'il était possible de créer un cluster Swarm avec un noeud Windows et un noeud Linux sans pré-requis particulier.

Il faut ensuite créer manuellement le réseau overlay pour son application (ce sera supporté dans docker-compose 1.13+, version 3.2 du format). Si vous utiliser docker-compose, il faudra alors spécifier ce réseau comme un réseau externe afin que l'application s'y attache à son lancement.

Afin de piloter le déploiement des conteneurs sur les bons hôtes, il convient d'ajouter des labels (ou de s'appuyer sur des labels existants comme node.platform.OS). Ainsi, un conteneur Windows se déploira sur un hôte Windows et idem pour du Linux.

Jusque là, tout va bien mais c'est là que les limitations se font sentir :

  • Le réseau "Overlay", permettant de ne faire qu'un réseau virtuel avec l'ensemble des noeuds d'un cluser Swarm, n'est supporté que depuis février 2017. Il faut donc s'assurer d'avoir une VM à jour et le patch correspondant.
  • Le "Routing Mesh", qui permet d'avoir de publier un service sur un port donné et d'accéder à ce service depuis n'importe quel noeud du cluster depuis l'extérieur, n'est pas encore supporté.
  • Le Service Discovery sous Swarm se fait normalement via des IPs Virtuelles. Ce mode n'est pas supporté par Windows et il faut se rabbatre sur du DNS Round Robbin. Ce mode sera utilisable dans un fichier docker-compose en version 1.13+ et le format 3.2+. En attendant, il faut déployer les services manuellement.
  • Enfin, pour exposer des ports, il est obligatoire de les publier au niveau de l'hôte faute de quoi vos conteneurs ne pourront pas communiquer ensemble. L'allocation des ports est dynamique par défaut mais semble être figeable (non testé sous Windows).

Donc au final :

  • Swarm, en dehors d'apporter une résolution DNS, n'apporte pas grand chose pour le moment. Si les ports sont figeables et sous réserve de ne pas avoir plusieurs instances d'un même composant pour cause d'unicité de port, alors cela permettrait de faire un peu plus de choses.
  • Docker-compose en version 1.13 et le format 3.2+ permettrait de piloter une application déployable sur un cluster Swarm en étant capable de gérer la partie réseau et le endpoint dnsrr. Il faudra attendre la prochaine version stable de docker-ee sous Windows pour le valider.

Bon à savoir également :

  • Published Ports On Windows Containers Don't Do Loopback. Cela vous évitera de perdre du temps à comprendre pourquoi votre conteneur ne répond pas sur localhost sur votre poste windows.
  • Pour une docker registry privée supportant les images Windows, il faut une version 2.5+ de la Docker Registry. La version actuelle est 2.6+

Une série de trois vidéos, publiées il y a quelques jours, montrent bien ce qu'il est possible de faire avec Swarm à ce jour.

Pour conclure, il est possible d'utiliser des conteneurs Windows mais que ce n'est pas encore la panacée. Cela reste néanmoins prometteur et les annonces de Microsoft vont dans le bon sens. Il va falloir attendre quelques mois pour envisager cela plus sereinement.

Update 16/8/2017 : La version 17.06 entreprise edition semble résoudre les limites évoquées précédemment.

Le Blog

Nous partageons ici notre veille et nos réflexions

Tags

docker elasticsearch kubernetes kafka postgres sécurité ansible tick traefik python rancher stream spark csp grafana mysql aws rest microservice cassandra hpkp influxdb arm reverse-proxy chronograf kibana container log orientdb swarm devops cluster mobile windows rethinkdb linux architecture replication terraform monitoring hsts serverless documentation api licence redis hypriot bash rsyslog wagtail agile npm big data javascript lean angularjs graphql grav scale syslog-ng logstatsh event sourcing debian hue serverless architecture test css dashboard git alerte mailing-list https cors sri null cqrs newsletter telegraf fluentd filebeat firebase kapacitor grid publicité sympa flash cncf lambda index search solr fullstack openweb revue de code rkt k8s checklist certificat revocation performance confluent microsoft raml beat json tiers timezone shipyard pip virtualenv sql apm service worker rpo ebs react foundation date cloud incident devoxx rto fleet yarn vnc ssh openshit reindex nomad docker-compose ssl falcor html scaleway infrastructure as code iac statistique sha1 message anonymisation gcp http curl jq data-pipelining select beam google queue shell fish sre push rwd responsive opensource packaging amazon emr crash electron travail frontend médecine unikernel jwt akka desktop société vue.js continous-delivery laravel framework php automatisation loi code géospatial machine-learning cli vpc multi-cloud ksql elassandra immutable header hadoop cookie nosql csrf hacker ingénierie over-engineering ux liste de diffusion

Syndicate

Atom 1.0 RSS