Architecte de vos plateformes/produits et agitateur de séries temporelles

Conception, développement, déploiement et exploitation de vos plateformes, applications et données.

Contactez-nous !

Docker, dans un contexte hybride Windows et Linux

docker swarm container windows linux

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.

AVR Solutions

docker kubernetes gitlab CD

Contexte

AVR Solutions souhaite gagner en productivité/flexibilité/agilité dans la réalisation et le déploiement de ses développements. Elle se pose la question de pouvoir utiliser des conteneurs Docker à cette fin.

Notre réponse

  • Etude de faisabilité de l’utilisation des conteneurs Docker dans le contexte AVR Solutions sur les postes de développeurs et pour les différents environnements de déploiements (Tests, Préproduction, Production)
  • Mise en place d’une instance Gitlab à fin d’évaluation de la solution en remplacement de Github
  • Mise en place d’une Docker Registry pour stocker des images de conteneurs Windows
  • Mise en place d’un cluster Docker Swarm hybride (Hôtes Windows & Linux) pour tester le fonctionnement de l’application métier. Bien que prometteur, le résultant n’est pas satisfaisant à ce stade.

Bénéfices

  • Connaissance de Docker et de son écosystème (Docker, Kubernetes, Rancher, etc) grâce à une veille sur Docker depuis 2013 et utilisé en production dès 2015.)
  • Apports théoriques et pratiques permettant de tester concrètement et rapidement les hypothèses de l’étude. Au final, le rapport d’opportunité est pragmatique et permet à AVR Solutions de se définir un plan d’action."

Web, Ops & Data - Mars 2017

docker container gcp google shell fish log graphql sre push rwd responsive opensource queue message sécurité ssl sha1 npm yarn javascript

Admin Sys

  • l y a un poisson dans ma coquille ! : J’avais fait il y a quelques années un détour par le shell zsh via “Oh My ZSH” mais je n’étais pas allé bien loin, revenant au final au bon vieux bash. L’article m’a donné envie d’essayer fish et pour le moment, je trouve ça plutôt pas mal. Ne pas se fier à la première impression du site :)
  • Pour faire fonctionner virtualenv(wrapper) avec Fish: VirtualFish
  • Pour enrichir votre Fish, vous pouvez vous appuyer sur fisherman ou le projet oh-my-fish

Containers

  • Adventures in GELF : où l’on apprend notamment que les logs sont par défaut au format JSON et surtout qu’il n’y a pas de rotation des journaux par défaut :’( ; l’article montre ensuite les intérêts du format GELF (avoir un message sous la forme d’un dictionnaire/tableau au format clé/valeur) et les limites (connextion UDP) avec les solutions de contournement actuelles et les solutions à venir prochainement.
  • Announcing Docker Entreprise Edition : Docker Inc annonce une version “Docker Community Edition” et une version “Docker Entreprise Edition” (avec support). Il y aura désormais une version stable trimestrielle (avec changement de versionning à la Ubuntu : YY.MM et une politique de support de 4 mois) ou une version “bleeding edge” mensuelle pour la version communautaire (support mensuel). Pour la version entreprise, c’est trimestrielle avec 1 an de support & maintenance. Docker Inc se dote également d’un programme de certification pour la partie matérielle, système sous jacent, les plugins et les conteneurs en eux même. Une réponse notamment fait à Docker de trop changer le comportement de docker et de ses composants/fonctionnalités d’une version à une autre.
  • CoreOS a l’intention de donner rkt à la Cloud Native Computing Foundation qui hébergedéjà de nombreux projets cloud dont Kubernetes. Docker Inc va faire de même avec containerd. Si le billet de CoreOS laissait penser un travail commun, le billet de Docker ne me donne pas cette impression. Donc a priori chacun va travailler de son côté et on regarde qui sort vainqueur à la fin ? La guerre des containers n’est pas finie…
  • From dotCloud to docker : Une retrospective sur l’histoire de Docker.

Cloud

  • Google Cloud Platform: your Next home in the cloud : Google avait jusqu’à présent plutôt un positionnement de marché de niche où pour aller sur leur cloud il fallait adopter leurs produits. Avec la Conférence Google Cloud Next 2017, s’opère un sacré changement et que Google semble revendiquer : devenir un acteur global du cloud et être en mesure d’accompagner ses clients sur l’ensemble de leurs sujets. S’il ne fallait qu’un exemple, je pendrais bien celui de la certification de SAP HANA sur GCP. On notera aussi l’arrivée de Postgresql en service managé, de nouveaux langages pour App Engine, etc. Je vous laisse trouver les nouveautés mais pour moi la nouveauté est ce changement de positionnement de Google. Les autres fournisseurs de cloud ne doivent pas forcément être ravis de ce changement ; reste à voir si Google convaincra les autres clients. Si par ailleurs, les clients sont déjà chez Google Suite, on peut imaginer qu’ils passent plus aisément dans Google Cloud pour n’avoir qu’un fournisseur…
  • 100 announcements from Google Cloud Next 17 : la liste complète des 100!! annonces…

DevOps

  • Site Reliability Engineering : le terme de Site Reliability Engineering (SRE) prend de plus en plus d’ampleur depuis quelques mois. Un SRE est une personne avec un profil plutôt développeur mais qui est aussi à l’aise sur la partie “opérations” et donc en mesure d’assurer l’exploitation de son application (avec les incidents liés) ; il travaille donc sur les 2 tableaux pour son application. Google partage dans ce livre son expérience de la mise en place de ses équipes SRE pour une partie de leurs produits.

GraphQL

  • Use all the databases - part1 et Use all the databases - part 2 : Deux billets présentant GraphQL qui se veut un successeur de REST. L’article montre comment avec une seule requête faite sur un endpoint GraphQL, on peut aller récupérer des données dans plusieurs bases de données. Intéressant, mais à voir si cela n’est pas trop magique et si on ne crée pas un SPOF de l’application en procédant ainsi.
  • GraphQL Guide : site du livre en cours de préparation sur GraphQL
  • Appolo : le client de référence sur GraphQL utilisable notamment avec React (Native), AngularJS, iOS & Android.

HTML5

  • Managing Push Subscriptions : nouvel article d’une série sur les bonnes pratiques à adaopter lorsque l’on génère des notifications en Push via WebPush.
  • State of Responsive Images 2017 : en version courte, c’est mieux, mais c’est pas encore tout à fait ça. Plus sérieusement, un état des lieux sur les images responsives, ce qui a été fait, les chantiers incomplets voire ratés.

Javascript

  • NPM vs Yarn : une revue assez détaillée des avantages de Yarn sur NPM.

Opensource

Queues & Messages

  • Why Messaging Queues Suck : Réflexion intéressante autour des bus de messages et de la soi-disante agnosticité des producteurs de topics vis à vis de leur consommateurs. Au final, de part les procédures de définition d’accès à un topic (dans un contexte cloud), la partie agnosticité est toute relative. Du coup, pour l’auteur, il est plus intéressant de faire des “endpoints” HTTP entre 2 services et que ce soit le client qui implémente son propre système de queue en interne. Cela mérite réflexion et peut avoir ses intérêts en fonction de votre architecture.

Sécurité

  • Announcing the first SHA1 collision : Google a annoncé la première collision obtenue avec le protocole de chiffrement SHA-1. Une collision est obtenue lorsque la signature de deux fichiers est identique, alors que théoriquement, chaque fichier devrait avoir une signature unique. Même si les conditions pour obtenir cette collision reste assez peu exploitable de part les ressources nécessaires pour le faire, la dépréciation de SHA-1 est accélérée. Par ex, Firefox, qui avait prévu de le finaliser l’abandon du support de SHA-1 avec la version 52 du navigateur vient de le faire en accéléré suite à cette publication et Google Chrome en a fait de même.
  • Incident report on memory leak caused by Cloudflare parser bug : un bug identifié par l’équipe de Google a révélé que depuis septembre 2016 et jusqu’à fin février 2017, un composant de l’infrastructure de Cloudflare divulguait des informations sensibles (identifiants, cookies, etc) de ses utilisateurs lorsqu’il parsait des pages HTML mal formées. L’article de NextImpact l’explique bien, il faut globalement changer vos mots de passes et renouveller vos cookies pour les sites utilisant Cloudflare (une liste ici ou ce site)
  • HTTPS : De SSL à TLS 1.3 : rétrospective et explications sur les différents mécanismes de chiffrement disponibles, leurs forces/faiblesses et l’avenir avec TLS 1.3

Affini Tech

python gcp docker framework pipeline

Contexte

Affini-Tech est une société d’ingénierie “Big Data” dont l’objectif est d’accompagner ses clients dans la prise en main et l’exploitation de leurs données. Elle souhaite faire évoluer son site web et développer un framework de traitement de données (pipelines) pour permettre à ses clients de manipuler plus facilement leurs données.

Notre réponse

  • Site Web : Analyse critique du site Affini-Tech.com et du blog et recommendation du CMS Statique Lektor
  • Développement logiciel : sur la base d’un POC existant et de chaines de traitement de données mis en place pour des clients sur Google Cloud Platform, développement d’une première version d’un framework de traitement de données (pipeline) permettant de manipuler simplement des données via des tâches génériques (exécution d’une requête SQL, chargement de fichiers dans une base, etc) ou des tâches spécifiques (code python & fonction simplifiées).

Bénéfices

  • Site Web : capitalisation sur plus de 10 ans d’expériences pour fournir une réponse adaptée aux besoins exprimés
  • Développement logiciel : capitalisation sur une expertise technique (python, docker) permettant d’obtenir une première version d’un framework générique permettant de déployer des chaines de traitement de données."

Web, Ops & Data - Janvier 2017

docker arm hypriot api rest raml python csp kubernetes spark kafka stream rancher json ansible devops elasticsearch postgres timezone pip virtualenv sql service worker react foundation

Nouvelle année, nouveau format - au programme une édition mensuelle mixant brèves et des choses plus construites/élaborées (j’espère le mois prochain)

En Bref

API

ARM / RPi

  • Setup Kubernetes on a Raspberry Pi Cluster easily the official way! : Kubernetes, la solution d’orchestration de conteneurs, devient de plus en plus utilisable sur un enrionnement ARM (Raspberry, etc). Il faut que je réessaie ça sur mon Picocluster ; les derniers essais n’étaient pas très probant mais je n’avais pas utilisé apparemment le bon driver réseau (ie flannel et non pas weave pour ARM comme indiqué dans le billet).
  • HypriotOS 1.2 avec Docker 1.13 est également disponible pour vos RPi.

Big Data

  • Databricks and Apache Spark 2016 Year in Review : Databricks, l’éditeur de Spark, fait sa revue de l’année 2016 et des apports significatifs réalisés sur Spark : Support SQL, Structured Streaming, Spark 2.x.
  • Introduction to Kafka Streams with a Real-Life Example : l’auteur montre les limites de la combinaison Kafka+Spark (j’en ai vécu une partie) et propose son retour d’expérience sur la migration vers Kafka Streams (et conforte l’opinion que j’avais). Reste la problématique du monitoring de Kafka Streams à améliorer même si des solutions adhoc sont listées.
  • Towards a realtime streaming architecture : dans la continuité du billet précédent, retour d’expérience d’une entreprise passant de Spark+Kafka à Kafka, Kafka Streams, Kafka Connect et Akka pour faire du vrai streaming (et pas du micro-batch). Intéressant de voir qu’ils jugent Flink trop complexe pour le moment au regard de leurs besoins. Globalement, l’article montre le problème récurrent dans une architecture big data de la maitrise de l’ensemble des composants pour bien les faire fonctionner. Confluent, en apportant Kafka Streams et Kafka Connect autour de Kafka, semble avoir trouver le bon créneau combinant (une relative) simplicité technologique et performance.

CLI

Container & Orchrestration

DevOps

  • 10 astuces Ansible : revue de 10 bonnes pratiques concernant l’outil d’automatisation Ansible. Il me manquait la personnalisation du logger et de ansible.cfg

Elasticsearch

Opinions

  • Tools & Teams : au-delà du “Utiliser le bon outil pour la bonne tâche”, c’est surtout d’utiliser les outils avec lesquelles une équipe est efficace à un instant donnée. La vision a long terme étant d’aller au-delà des outils vers les concepts afin d’avoir une compétence/expérience qui s’affranchit plus facilement des outils (qui ne sont pas éternels).

Postgres

  • Simple but handy postgresql features : Sympa le \watch ou jsonb_pretty pour respectivement surveiller le résultat d’une requête et affichrer proprement une donnée au format JSON.

Python

  • Records, SQL for Humans : comme tous les projets de Kenneth Reitz (requests, maya, etc), une API simple pour manipuler des données (ici des requêtes SQL)
  • pytz : World Timezone Definitions for Python - permet de faire des calculs sur les dates, la librairie gérerait également les heures d’été/d’hiver dans les calculs.
  • Announcing Pipenv! : Vous réviez d’un outil combinant pip et virtualenv et avec des options supplémentaires, Kenneth Reitz l’a fait durant un week-end…

Sécurité

  • Web Security 101 : présentation des principaux concepts, des cas d’exemples et des moyens de se prémunir.
  • Introducing support for Content Security Policy Level 2 : Microsoft Edge se dote du support de niveau 2 de Content Security Policy (CSP) afin de permettre au propriétaire d’un site de mieux protéger ses clients en déclarant les ressources autorisées ou pas.
  • Github’s Post CSP Journey : retour des équipes de Github sur l’implémentation de CSP et les points encore à adresser (spoiler : non, CSP n’est pas l’arme ultime). Ces points sont peut être des cas marginaux pour des sites classiques mais pas pour Github. Intéressant à lire.

Web