Commit f8d9be9c authored by marmous's avatar marmous

Fix page layout issues

parent a86e909e
This dissertation presents the path to containerize and deploy a 15-year-old monolithic application suite on Windows environment. I explain how I containerize each piece of software with a limited budget, how I choose rollout architecture and the associated provider. This dissertation establish a state-of-the-art on Windows containers technologies and all its limitations.
\\
\\
Keywords : windows container, docker swarm, kubernetes, traefik, nginx, asp.net
\ No newline at end of file
Keywords : windows container, docker swarm, kubernetes, traefik, nginx, asp.net, asp
......@@ -3,7 +3,7 @@
Les fichiers de configuration pouvent contenir plus de 100 lignes. Ils sont disponibles en ligne afin d'éviter de surcharger le document.
\begin{itemize}
\item Fichier Dockerfile pour créer l'image Docker Kronos Efficient est \href{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/Dockerfile-ltsc2019}{disponible ici} ou à cette adresse \url{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/Dockerfile-ltsc2019}
\item Script Powershell de démarrage du conteneur Kronos Efficient est est \href{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/EntryPoint.ps1}{disponible ici} ou à cette adresse \url{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/EntryPoint.ps1}
\item Fichier YAML de livraison continue de l'image Docker Kronos Efficient est est \href{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/gitlab-ci.yml}{disponible ici} ou à cette adresse \url{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/gitlab-ci.yml}
\item Fichier YAML de déploiement d'une instance client au sein du cluster Swarm est est \href{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/docker-compose.yml}{disponible ici} ou à cette adresse \url{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/docker-compose.yml}
\item Script Powershell de démarrage du conteneur Kronos Efficient est \href{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/EntryPoint.ps1}{disponible ici} ou à cette adresse \url{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/EntryPoint.ps1}
\item Fichier YAML de livraison continue de l'image Docker Kronos Efficient est \href{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/gitlab-ci.yml}{disponible ici} ou à cette adresse \url{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/gitlab-ci.yml}
\item Fichier YAML de déploiement d'une instance client au sein du cluster Swarm est \href{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/docker-compose.yml}{disponible ici} ou à cette adresse \url{https://git.marmous.net/marmous/memoireingenieurcnam/-/raw/master/annexes/docker-compose.yml}
\end{itemize}
......@@ -4,7 +4,7 @@ Références globales \cite{MongoDB2017} \cite{DockerEngineDocs} \cite{FicherDoc
Un conteneur correspond à un processus métier, au sens informatique. Cela peut être une application ou une partie d’une application. Par défaut, un conteneur est isolé des autres conteneurs et de la machine sur laquelle il s’exécute, sa machine hôte. Il est possible de contrôler l’isolement du réseau, du stockage ou d’autres sous-systèmes sous-jacents d’un conteneur à partir d’autres conteneurs ou de la machine hôte. Un conteneur est défini par son image ainsi que toutes les options de configuration fournies. Lorsqu’un conteneur est supprimé, les modifications de son état qui ne sont pas stockées dans le stockage persistant disparaissent. Il est une entité éphémère en ce sens où aucune donnée n’est stockée par défaut.
\par
Les conteneurs ne sont pas issus de nouvelles technologies et sont en fait utilisés depuis des décennies. Ce sont des fonctionnalités introduites il y a 30 ans pour les groupes de contrôle (cgroups) et les espaces de noms et il y a 15 ans pour le système de fichier UnionFS.
\newpage
\section{Les technologies au cœur des conteneurs}
Au cœur des conteneurs, nous avons donc trois technologies principales : les groupes de contrôle (cgroups), les espaces de noms (namespaces) et les systèmes de fichier de type union (UnionFS pour Docker).
......
......@@ -59,7 +59,13 @@ Un service est défini par des informations telles que
\item des limites et réservations pour les CPU et la mémoire
\item le nombre de répliques désirés
\end{itemize}
Lors du déploiement d’un service, le manager accepte la définition du service envoyé par l’utilisateur et la considère comme l’état désiré du service. Il planifie ensuite la création du service sur les nœuds disponibles du cluster.
Lors du déploiement d’un service (voir figure \ref{fig:dockerengineclient}), le manager accepte la définition du service envoyé par l’utilisateur et la considère comme l’état désiré du service. Il planifie ensuite la création du service sur les nœuds disponibles du cluster.
\begin{figure}[h!]
\includegraphics[width=\linewidth]{etatart/images/dockerengineclient}
\caption{Création d’un service (source : docker.com)}
\label{fig:dockerengineclient}
\end{figure}
\subsection{Tâche}
......@@ -69,12 +75,6 @@ Une tâche est un mécanisme unidirectionnel. Elle progresse à travers une sér
\par
Swarm Mode a été pensé pour être un ordonnanceur et un orchestrateur à usage général. Les services et les tâches ne sont pas conscients des conteneurs qu’elles implémentent. En théorie, il est possible d’implémenter d’autres types de tâches telles que des tâches concernant des machines virtuelles ou des processus non conteneurisés. L’ordonnanceur et l’orchestrateur sont indépendants du type de tâche.
\begin{figure}[h!]
\includegraphics[width=\linewidth]{etatart/images/dockerengineclient}
\caption{Création d’un service (source : docker.com)}
\label{fig:dockerengineclient}
\end{figure}
\subsection{Services en attente}
Un service peut être configuré de telle sorte qu’aucun nœud dans le cluster ne puisse exécuter ses tâches. Dans ce cas, le service reste en attente. Voici quelques exemples de situations dans lesquelles un service peut rester en attente.
......
......@@ -5,6 +5,8 @@ Références globales \cite{K8sVSSwarmI} \cite{K8sVSSwarmII}
La force de Docker Swarm Mode réside dans sa simplicité d’installation et d’utilisation. Il est directement intégré à Docker. Il reprend la philosophie et les concepts de Docker, comme la compatibilité avec les fichiers docker-compose.yml. Cela rend son apprentissage très simple et dans la continuité de celui de Docker. Cette simplicité a un prix : l’extensibilité. Il n’est que très peu modulaire et se cantonne à rester dans le monde Docker. Il est impossible d’utiliser un autre moteur de conteneur que Docker. Il n’est pas possible non plus d’utiliser un autre planificateur que celui intégré. Docker est un projet jeune qui évolue rapidement. Bien que le projet soit libre et le poids important de Docker sur le marché des conteneurs, la communauté n’est pas aussi forte que celle de Kubernetes. La majeure partie des contributions provient de Docker Inc directement. Docker Swarm est idéal pour de petits ou moyens clusters. Il permet à moindre effort de déployer des applications avec la qualité de service des systèmes distribués.
\par
Kubernetes possède de multiples forces : son extensibilité, sa communauté, sa large adoption (d’où l’offre abondante de fournisseurs cloud), son expérience, sa rapide évolution, ses concepts et fonctionnalités avancées (pods, utilisations de multiples moteurs de conteneurs, configuration avancée des volumes, secrets…). Le seul véritable inconvénient est son coût d’apprentissage et de maîtrise. C’est pourquoi, il est recommandé dans le cadre d’une utilisation cloud ou si Docker n'est pas connu. Il est plutôt adapté à une utilisation demandant de grands besoins ou des fonctionnalités spécifiques qui ne sont pas fournies par Docker Swarm.
\par
~
\begin{table}[ht]
\begin{center}
......@@ -80,8 +82,6 @@ Configuration avancée des volumes et secrets & Support des conteneurs Windows t
\end{center}
\end{table}
\newpage
% \begin{figure}[h!]
% \includegraphics[width=\linewidth]{etatart/images/layercake}
% \caption{Représentation}
......
......@@ -6,7 +6,7 @@ Kronos Efficient, aujourd’hui en version 5.x, est un produit initialement dé
\subsection{Architecture}
Kronos Efficient est une application web qui repose entièrement sur les technologies de Microsoft. Elle utilise le serveur web IIS et le serveur de base de données Microsoft SQL Server. Elle est conçue en C\#/Asp.NET et intègre Efficient 4.x conçu en Delphi et Asp. La partie Efficient 4.x ne concerne que la gestion des temps, elle est entièrement imbriquée au sein de Kronos Efficient.
Kronos Efficient est une application web qui repose entièrement sur les technologies de Microsoft. Elle utilise le serveur web IIS et le serveur de base de données Microsoft SQL Server. Elle est conçue en C\#/ASP.NET et intègre Efficient 4.x conçu en Delphi et ASP. La partie Efficient 4.x ne concerne que la gestion des temps, elle est entièrement imbriquée au sein de Kronos Efficient.
Deux services Windows dialoguent avec l’application pour réaliser différents traitements en tâche de fond. Ils sont essentiels à son fonctionnement.
\newpage
......@@ -16,7 +16,7 @@ Deux services Windows dialoguent avec l’application pour réaliser différents
\label{fig:KE5ArchitectureBasique}
\end{figure}
Le premier, Agent, automatise des traitements fonctionnels (nommés contrôleurs). Il est écrit en C\#. Chaque contrôleur communique avec la partie Asp.NET par un service web dédié. Ils sont démarrés en parallèle. Un processus « orchestrateur » coordonne leur lancement basé sur un minuteur. Il utilise le système de communication interprocessus de Microsoft Message Queuing (MSMQ) pour donner l’ordre de démarrage.
Le premier, Agent, automatise des traitements fonctionnels (nommés contrôleurs). Il est écrit en C\#. Chaque contrôleur communique avec la partie ASP.NET par un service web dédié. Ils sont démarrés en parallèle. Un processus « orchestrateur » coordonne leur lancement basé sur un minuteur. Il utilise le système de communication interprocessus de Microsoft Message Queuing (MSMQ) pour donner l’ordre de démarrage.
\newline
Agent compte douze contrôleurs :
\begin{itemize}
......@@ -34,13 +34,14 @@ Agent compte douze contrôleurs :
\item BackgroundProcessor génère des rapports en tâche de fond
\end{itemize}
\newpage
Le second, Autotask, gère la communication entre les matériels (les lecteurs de badges et leur contrôleur) et la partie ASP de l’application web. Il est écrit en Delphi.
En plus des services web dédiés aux contrôleurs, Kronos Efficient expose deux services web. Un service web SOAP écrit en C\# est dédié à Kronos Efficient et un service web écrit en Delphi permet l’accès à Efficient 4.x. Ce dernier est utilisé par Autotask.
En plus des services web dédiés aux contrôleurs, Kronos Efficient expose deux services web. Un service web SOAP écrit en C\# est dédié à Kronos Efficient. La partie ASP l'utilise pour communiquer avec la partie ASP.NET. Les applications décrites dans la section suivante en font de même. Elle est documentée et peut être utilisée par nos clients pour intégrer Kronos Efficient dans leur infrastructure. Toutefois, cela ne permet pas l'accès à toute l'application. La partie ASP, par conséquent le moteur de calcul de gestion de temps, n'est pas accessible par cette API SOAP mais par un service web historique écrit en Delphi. Il est utilisé par Autotask et par certaines applications décrites dans la section suivante.
\subsection{L’écosystème de Kronos Efficient}
Au fur et à mesure des années, des besoins clients ont émergé et ont nécessité la création d’applications liées à Kronos Efficient. Il en existait cinq à notre catalogue, elles ne sont plus en vente actuellement, mais elles sont déployées chez la majorité de nos clients  :
Au fur et à mesure des années, des besoins clients ont émergé et ont nécessité la création d’applications liées à Kronos Efficient. Certaines ont été conçues pour répondre à un besoin d'un client en particulier et ont été généralisées, d'autres ont été conçues pour répondre à un besoin massif de nos clients ou nos équipes Consulting. Il en existe cinq à notre catalogue, elles ne sont plus en vente actuellement, mais elles sont déployées chez la majorité de nos clients  :
\begin{itemize}
\item Kronos Efficient Mobile
\item Kronos Efficient Acquisition
......@@ -49,26 +50,23 @@ Au fur et à mesure des années, des besoins clients ont émergé et ont nécess
\item Kronos Efftools
\end{itemize}
\subsection{Kronos Efficient Mobile}
Kronos Efficient Mobile est une application web adaptative, permettant une utilisation confortable de Kronos Efficient aux périphériques mobiles. Elle offre des fonctionnalités essentielles pour les salariés et les gestionnaires.
\par
D’un point de vue technique, elle est conçue en C\#/Asp.NET. Elle se connecte à Kronos Efficient par son service web SOAP.
\newpage
\subsection{Kronos Efficient Mobile}
Kronos Efficient Mobile est une application web adaptative, permettant une utilisation confortable de Kronos Efficient aux périphériques mobiles. Elle offre des fonctionnalités essentielles pour les salariés et les gestionnaires. D’un point de vue technique, elle est conçue en C\#/ASP.NET. Elle se connecte à Kronos Efficient par son service web SOAP.
\begin{figure}[h!]
\includegraphics[width=\linewidth]{introduction/images/MobileArch}
\begin{center}
\includegraphics[width=0.96\textwidth]{introduction/images/MobileArch}
\end{center}
\caption{Schéma de l’architecture de Kronos Efficient Mobile}
\label{fig:MobileArchitecture}
\end{figure}
\subsection{Kronos Efficient Acquisition}
Kronos Efficient Acquisition est un moteur d’acquisition de soldes de congés.
\par
Il est écrit en C\#. Il est constitué d’une interface graphique pour lancer des tests de calculs. Les règles d’acquisitions sont définies directement dans Kronos Efficient. Il peut être lancé en tant que service Windows ou application console. Il se connecte directement à la base de données de Kronos Efficient et demande des traitements à Kronos Efficient par un service web sur la partie ASP.
Kronos Efficient Acquisition est un moteur d’acquisition de soldes de congés. Il est écrit en C\#. Il est constitué d’une interface graphique pour lancer des tests de calculs. Les règles d’acquisitions sont définies directement dans Kronos Efficient. Il peut être lancé en tant que service Windows ou application console. Il se connecte directement à la base de données de Kronos Efficient et demande des traitements à Kronos Efficient par un service web sur la partie ASP.
\begin{figure}[h!]
\includegraphics[width=\linewidth]{introduction/images/AcquisitionArch}
\begin{center}
\includegraphics[width=0.96\textwidth]{introduction/images/AcquisitionArch}
\end{center}
\caption{Schéma de l’architecture de Kronos Efficient Acquisition}
\label{fig:AcquisitionArchitecture}
\end{figure}
......@@ -76,32 +74,34 @@ Il est écrit en C\#. Il est constitué d’une interface graphique pour lancer
\subsection{Kronos Efficient Analytics}
Kronos Efficient Analytics est un générateur avancé de rapport. Il permet de générer des rapports à partir de données issues de Kronos Efficient et de procédures stockées SQL Serveur. La mise en forme est faite par le format RDLC utilisé par Microsoft Report Viewer. L’application s’intègre dans Kronos Efficient.
\par
Il est écrit en C\#/Asp.NET. Il stocke la configuration des rapports dans une base de données. Il se connecte à Kronos Efficient par le service web SOAP.
Kronos Efficient Analytics est un générateur avancé de rapport. Il permet de générer des rapports à partir de données issues de Kronos Efficient et de procédures stockées SQL Serveur. La mise en forme est faite par le format RDLC utilisé par Microsoft Report Viewer. L’application s’intègre dans Kronos Efficient. Il est écrit en C\#/ASP.NET. Il stocke la configuration des rapports dans une base de données. Il se connecte à Kronos Efficient par le service web SOAP.
\begin{figure}[h!]
\includegraphics[width=\linewidth]{introduction/images/AnalyticsArch}
\begin{center}
\includegraphics[width=0.8\textwidth]{introduction/images/AnalyticsArch}
\end{center}
\caption{Schéma de l’architecture de Kronos Efficient Analytics}
\label{fig:AnalyticsArchitecture}
\end{figure}
\subsection{Kronos Efficient Import Tool}
Kronos Efficient Import Tool (KEIT) permet d’importer des données dans Kronos Efficient. Il accepte plusieurs sources de données différentes : fichiers TXT, INI, CSV, XML, bases de données SQL Server et Oracle et différents services web.
Il est écrit en C\#. Il est composé d’une application WinForm pour configurer et tester les imports, d’un service Windows et d’une application console pour les exécuter. Il stocke la configuration de chaque import dans un fichier XML. Il se connecte à Kronos Efficient par les deux services web suivant l’élément à importer.
\newpage
Kronos Efficient Import Tool (KEIT) permet d’importer des données dans Kronos Efficient. Il accepte plusieurs sources de données différentes : fichiers TXT, INI, CSV, XML, bases de données SQL Server et Oracle et différents services web. Il est écrit en C\#. Il est composé d’une application WinForm pour configurer et tester les imports, d’un service Windows et d’une application console pour les exécuter. Il stocke la configuration de chaque import dans un fichier XML. Il se connecte à Kronos Efficient par les deux services web suivant l’élément à importer.
\begin{figure}[h!]
\includegraphics[width=\linewidth]{introduction/images/KEITArch}
\begin{center}
\includegraphics[width=0.8\textwidth]{introduction/images/KEITArch}
\end{center}
\caption{Schéma de l’architecture de Kronos Efficient Import Tool}
\label{fig:KEITArchitecture}
\end{figure}
\newpage
\subsection{Kronos Efftools}
Kronos Efftools permet d’exporter les données calculées dans Kronos Efficient au format CSV ou XML. Il est principalement utilisé pour exporter les données de gestion des temps vers le logiciel de paie.
Il est intégré à Kronos Efficient grâce à son mécanisme de plug-in. Il est lié à une base de données dédiée dans laquelle sont stockés la configuration des exports et l’algorithme d’extraction des données. Il se connecte à la base de données de Kronos Efficient.
Kronos Efftools permet d’exporter les données calculées dans Kronos Efficient au format CSV ou XML. Il est principalement utilisé pour exporter les données de gestion des temps vers le logiciel de paie. Il est intégré à Kronos Efficient grâce à son mécanisme de plug-in. Il est lié à une base de données dédiée dans laquelle sont stockés la configuration des exports et l’algorithme d’extraction des données. Il se connecte à la base de données de Kronos Efficient.
\par
~
\begin{figure}[h!]
\includegraphics[width=\linewidth]{introduction/images/EfftoolsArch}
\begin{center}
\includegraphics[width=\linewidth]{introduction/images/EfftoolsArch}
\end{center}
\caption{Schéma de l’architecture de Kronos Efftools}
\label{fig:EfftoolsArchitecture}
\end{figure}
......@@ -14,8 +14,10 @@ Un prestataire cloud Interoute nous fournit l’infrastructure nécessaire, c’
\item d’un serveur web frontal
\item d’un serveur d’application par client.
\end{itemize}
\par
Il existe deux architectures différentes pour accéder à l’application : une avec accès direct au serveur et l’autre avec un proxy inverse. Dans les deux cas, l’utilisateur se connecte par son navigateur à un sous-domaine dédié, par exemple \url{https://kronosdemo.kronosefficient.com}.
\newpage
\begin{figure}[h!]
\includegraphics[width=\linewidth]{introduction/images/DirectAccessCloud}
\caption{Architecture avec accès direct au serveur d’application}
......@@ -23,7 +25,7 @@ Il existe deux architectures différentes pour accéder à l’application : un
\end{figure}
La première architecture est schématisée par la figure \ref{fig:KE5HostingAccesDirect}. Le pare-feu autorise des connexions uniquement sur le port 443 en TCP (HTTPS) et une règle NAT redirige le trafic vers le serveur d’application. Cette configuration nécessite une adresse IP publique par sous-domaine, et donc par client.
\newpage
\begin{figure}[h!]
\includegraphics[width=\linewidth]{introduction/images/WebFrontAccessCloud}
\caption{Architecture avec proxy inverse}
......
......@@ -4,15 +4,12 @@ La suite applicative Kronos Efficient est conteneurisée dans son ensemble et le
Comme nous venons de le voir, toutes les images de la suite Kronos Efficient prennent leurs paramètres (URL de service web, identifiants de service web, chaine de connexion à la base de données…) par l’API Docker. Chaque paramètre correspond à une variable d’environnement du conteneur. Chaque conteneur démarre sur un script Powershell qui vérifie les paramètres, les ajoute dans les fichiers de configuration, configure le serveur, attend qu’Efficient soit disponible dans le cas des applications travaillant avec le service web de Kronos Efficient, démarre l’application et boucle sur l’affichage des traces applicatives sur la sortie standard. Il y a des paramètres communs aux différents conteneurs. Pour éviter les erreurs de saisie, il faut un outil permettant de générer les fichiers de déploiement nécessaires à une instance client. Il peut prendre la forme d’une application ou d’un script.
\par
Le déploiement en lui-même est très simple. Il se fait par un fichier de configuration YAML. Par exemple, pour déployer une instance test de Kronos Efficient, il faut éditer un fichier YAML contenant la description des différents services à déployer conjointement, nommée stack. Un service correspond à un conteneur et une stack à un groupe de services. Ils peuvent communiquer entre eux par l’intermédiaire d’un réseau virtuel dédié à la manière d’un pod dans Kubernetes. Pour cet exemple, le fichier sera nommé test.kronosefficient.com.yml. Il faut ensuite déployer la stack par la commande suivante :
\begin{tcolorbox}[colback=consolebg,boxsep=1pt,left=2pt,right=2pt,top=0pt,bottom=0pt]
\begin{lstlisting}[style=DOS]
C:\>docker stack deploy -c test.kronosefficient.com.yml test
\end{lstlisting}
\end{tcolorbox}
Le paramètre \verb|-c| permet de spécifier que nous utilisons un fichier yml au format docker-compose et de préciser son chemin. Le paramètre \verb|test| correspond au nom de notre stack. Le format de fichier docker-compose est très utile. Il permet d’utiliser le même fichier pour déployer les conteneurs lors de la création des conteneurs, pour effectuer des tests manuels ou automatiques avec l’outil docker-compose et en production sur un cluster Docker Swarm. Il existe également un plug-in pour l’utiliser avec Kubernetes. Ainsi on a l’assurance d’avoir le même environnement dans toutes les phases de vie du produit, en développement, en test et en production, ce qui limite de façon drastique les problèmes de déploiement. Toutefois, certaines fonctionnalités sont uniquement disponibles pour docker-compose et d’autres uniquement pour Docker Swarm.
\par
Voici un extrait du fichier de déploiement dédié à l’instance Kronos Efficient de test.kronosefficient.com :
......
......@@ -30,7 +30,7 @@ J’ai été acteur sur l’ensemble des sous-projets que ce soit en tant que ma
De mon côté, j’ai réalisé seul le projet de conteneurisation et déploiement des instances Kronos Efficient par un orchestrateur de conteneurs.
\begin{table}[ht]
\begin{table}[h!]
\begin{center}
\begin{tabular}{ |c|c|c|c|c| }
\hline
......@@ -54,4 +54,4 @@ De mon côté, j’ai réalisé seul le projet de conteneurisation et déploieme
\caption{Résumé des projets}
\label{table:ResumeProjets}
\end{center}
\end{table}
\end{table}
\ No newline at end of file
Ce mémoire présente le chemin pour conteneuriser et déployer une suite d'applications monolithique vieille de 15 ans en environnement Windows. J'y explique comment j'ai conteneurisé chaque logiciel avec un budget limité, comment j'ai choisi l'architecture de déploiement et le fournisseur associé. Ce mémoire établit un état des lieux des technologies de conteneurisation sous Windows et de toutes ses limites.
\\
\\
Mots-clés : windows container, docker swarm, kubernetes, traefik, nginx, asp.net
\ No newline at end of file
Mots-clés : windows container, docker swarm, kubernetes, traefik, nginx, asp.net, asp
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment