Architecture Kubernetes
DevOps
Il fut un temps, les applications fonctionnaient comme un seul processus pouvant รชtre appelรฉs monolithiques pour faire lโanalogie entre lโapplication et un grand bloc de pierre. Lโรฉquipe de dรฉveloppement ยซ dev ยป transmettait lโapplication ร lโรฉquipe opรฉrationnelle ยซ ops ยป qui se chargeait de la dรฉployer sur les machines. Celles-ci รฉtaient de grandes tailles, ce qui rendait le cycle de release trรจs lent et trรจs peu frรฉquent. Avec les mรฉthodologies de gestion de projet de type ยซ waterfall ยป, il fallait attendre 1 an ou plus avant de pouvoir dรฉployer lโapplication sur une infrastructure. La sรฉparation entre ces deux รฉquipes posait quelques problรจmes. Les dรฉveloppeurs ne pensaient quโร dรฉvelopper et ne se souciaient guรจre de comment fonctionnait leurs codes sur lโenvironnement de production. Tant que tout fonctionnait sur leurs machines, ils avaient fait leur part du boulot. Aujourdโhui, on voit les choses autrement: They care not just about implementing user features, but also actively ensure their work flows smoothly and frequently through the entire value stream without causing chaos and disruption to IT Operations or any other internal or external customer.[1]
Lโรฉquipe opรฉrationnelle a pour but dโassurer la stabilitรฉ et la qualitรฉ de lโinfrastructure. Elle prรฉparait les machines ร accueillir lโapplication avec toutes les dรฉpendances nรฉcessaires. Puis, une fois en production, elle assure que lโapplication ne tombe pas en panne et quโelle respecte un certain niveau de performance. Leurs objectifs respectifs crรฉent alors un fossรฉ entre les deux รฉquipes et gรฉnรจrent un conflit majeur. Les devs veulent coder le plus de fonctionnalitรฉs possibles dans un temps restreint, alors que les ops veulent un code stable qui respecte plusieurs critรจres de qualitรฉ qui ne concernent pas les fonctionnalitรฉs mรฉtier. DevOps met en place une sรฉrie dโรฉtapes au dรฉveloppement du logiciel formant un cycle qui intรจgre les dรฉveloppeurs et les รฉquipes opรฉrationnelles. Des tรขches sont automatisรฉes : les tests unitaires, la gestion de la configuration des machines et le dรฉploiement. La mise en production de nouvelles fonctionnalitรฉs est plus frรฉquente. Ce nouveau systรจme permet dโamรฉliorer la collaboration, la productivitรฉ de chaque รฉquipe et permet dโรชtre plus compรฉtitif vis-ร -vis de la concurrence.
Kubernetes
Les microservices peuvent รชtre dรฉployรฉs de maniรจre trรจs rapide grรขce ร docker et peuvent รชtre rรฉpliquรฉs puisquโils sont tous indรฉpendants. Toutefois, comment gรฉrer tout cela manuellement si des containers sont dispersรฉs dans un grand nombre de machines ? Dans le cas oรน il y a un container qui pose un problรจme, comment le dรฉtecter ? Lequel aurait besoin de plus de rรฉplications pour subvenir ร une subite augmentation de la charge ? Lโรฉquipe opรฉrationnelle monitore les serveurs et si un de ces derniers tombe en panne, il devra crรฉer de nouveaux containers avec les services dรฉchus dans un autre serveur. Kubernetes permet justement dโautomatiser le dรฉploiement, la gestion de demande de puissance et la gestion des applications containerisรฉes.[6] Ainsi, lโรฉquipe ops pourra dรฉlรฉguer la responsabilitรฉ de gรฉrer les applications dรฉployรฉes ร lโรฉquipe dev et le systรจme peut รชtre programmรฉ pour pouvoir sโautogรฉrer sans la supervision dโun humain. Kubernetes sโoccupera de dรฉployer un container avec lโapplication qui รฉtait prรฉsente dans la machine qui est tombรฉe en panne, dans une machine qui a la capacitรฉ de lโaccueillir. Dans le cas oรน une machine est trรจs fortement sollicitรฉe et ne parvient plus ร suivre ร la sollicitation dโun ou plusieurs services, Kubernetes pourra รชtre programmรฉ pour rรฉagir et dรฉployer des containers offrant les services nรฉcessaires sur dโautres machines et via un LoadBalancing, dispatcher les requรชtes pour rรฉpondre ร cette demande.
Puis bien รฉvidemment, enlever des containers quand ils ne seront plus nรฉcessaires et utilisent inutilement du temps computationnel. Ce travail de Bachelor va dรฉcrire comment Kubernetes met en place cette fonctionnalitรฉ de gestion de la charge et en faire un case study. Pour rรฉsumer, tous ces changements tant au niveau du dรฉveloppement dโune application que de son maintien, ont engendrรฉ de nouveaux concepts avec leurs nouvelles problรฉmatiques. Les premiรจres architectures dโapplications รฉtaient monolitques et leurs composants รฉtaient fortement couplรฉs. Dorรฉnavant, celles-ci sont distribuรฉes et basรฉes sur des microservices indรฉpendants, dispatchรฉs sur plusieurs machines et gรฉrรฉs par un orchestrateur de conteneurs, Kubernetes.
Worker Node
Un worker node (WN) est une machine physique ou une VM qui dรฉtient toutes les ressources nรฉcessaires afin de garantir lโexรฉcution dโun ou plusieurs pods. [15] Cette entitรฉ va hรฉberger tous les services quโun dรฉveloppeur aura dรฉcidรฉ de dรฉployer (Figure 4). Chaque WN est composรฉ dโun Kubelet, dโun kube-proxy et dโun Container runtime. Le Kubelet a comme responsabilitรฉ de gรฉrer tous les pods ainsi que leurs containers contenus dans le WN. Lui-mรชme contient un composant appelรฉ ยซ cAdvisor ยป qui lui sโoccupe de rรฉcupรฉrer des mรฉtriques sur chaque container de chaque pods. Le Kube-proxy a comme responsabilitรฉ de rediriger le trafic rรฉseau vers les pods contenant les services requis. Pour cela, il contient une table ยซ IPTable ยป qui dรฉtient les adresses des pods. Le Container runtime est extรฉrieur ร Kubernetes. Cโest le composant qui gรจre les containers dans un WN, Docker dans le cadre de notre mรฉmoire. Pour crรฉer un container, le Kubelet inspecte le descriptor dโun pod du WN et communique les images qui y sont mentionnรฉes au Container runtime via le protocole REST. Ce dernier tรฉlรฉcharge lโimage ร partir de DockerHub si lโimage nโest pas disponible localement et instancie un container avec cette image. Si un pod est supprimรฉ ou dysfonctionne, le Kubelet a la responsabilitรฉ dโarrรชter le ou les containers qui y รฉtaient hรฉbergรฉs via le container runtime.
ReplicationController, ReplicaSet
Le Replication Controller (RC) a la charge de crรฉer, supprimer et de maintenir une ou plusieurs instances dโun pod selon le nombre de rรฉplicas mentionnรฉ dans le descriptor du RC. Il est situรฉ au sein du master node (voir chapitre 3.7 Master Node) Un RC sโoccupe uniquement des pods qui contiennent un certain type dโimage ร qui on va assigner un label dans son descriptor. Si le descriptor mentionne uniquement le label A, il ne se prรฉoccupera pas des pods ayant un label B. [16] Dans la Figure 5 : Schรฉma du rรดle du Replication Controller, nous pouvons voir que le descriptor du RC ne mentionne que le label ยซ A ยป avec une image ยซ A ยป. Un pod ayant le label ยซ A ยป ร gauche de la Figure 5 : Schรฉma du rรดle du Replication Controller ne fonctionne plus. Le descriptor mentionne quโil faut trois rรฉplicas actifs alors quโil nโy en a plus que deux. Par consรฉquent, le RC en crรฉe un nouveau pour sโajuster au descriptor. Mais ce nโest pas lui qui les assigne aux WN. Lโassignation du pod ร un WN est effectuรฉe par le Scheduler, cette รฉtape sera expliquรฉe dans un prochain chapitre. Le pod ayant le label ยซ B ยป est supprimรฉ lui aussi. Cependant, aucun RC ne sโen occupe. Il nโy aura plus aucun pod ayant le label B. Rรฉpliquer un pod veut dire en crรฉer un nouveau avec les mรชmes caractรฉristiques.
Dans le schรฉma de la figure 5 ร droite, le pod liรฉ au trait-tillรฉ vert est un pod ayant les mรชmes caractรฉristiques que les pods contenant le label ยซ A ยป. Le descriptor du RC indique combien de pods dโun certain type il doit maintenir en permanence. Ainsi, en augmentant manuellement ce nombre, le RC crรฉe immรฉdiatement de nouveaux pods de ce type. Cโest une maniรจre dโaugmenter manuellement la disponibilitรฉ dโun service. Chaque type de pod รฉtant gรฉrรฉ par des RC distincts, il faudrait changer chacun de leurs descriptors respectifs pour les ยซ scaler ยป ensemble. Par exemple, admettons que le nombre de pod de type ยซ FrontEnd ยป a รฉtรฉ augmentรฉ. Sachant quโil communique toujours avec un pod ยซ Backend ยป, il pourrait รชtre judicieux dโaugmenter le nombre de ce dernier aussi. Kubernetes utilise un autre concept pour gรฉrer plusieurs types de pods simultanรฉment : le ReplicaSet. Ce dernier fonctionne de la mรชme maniรจre quโun RC, mais il est possible de sรฉlectionner plusieurs types de pods avec des labels diffรฉrents dans son descriptor.1
Conclusion
En conclusion, la solution proposรฉe par Kubernetes rรฉpond parfaitement ร la problรฉmatique de maniรจre simple et efficace. On constate que lโaccรจs de type Nodeport offre une solution simple de loadbalancer. De plus, en cas de forte fluctuation du trafic, le systรจme sโajuste pour rรฉpondre au besoin automatiquement grรขce ร lโHPA. De ce fait, les dรฉveloppeurs peuvent se concentrer sur les aspects mรฉtiers de leurs applications. La phase dโรฉtude de cette technologie รฉtait assez complexe car cette technologie est en constante รฉvolution et mโรฉtait inconnue. Jโai dรป passer par une รฉtude de lโarchitecture de Kubernetes : ses composants et leurs interactions, afin de comprendre le fonctionnement du systรจme global. Cependant, la partie pratique de ce manuscrit est acadรฉmique, le dรฉploiement de services plus complexes sur des machines de production nรฉcessiterait un approfondissement car la technologie est plus vaste que lโรฉchantillon qui a รฉtรฉ dรฉcrit. Heureusement, Kubernetes possรจde une grande communautรฉ dโutilisateurs, trรจs active et une excellente documentation. Si le temps nรฉcessaire ร maitriser Kubernetes semble long, plusieurs alternatives payantes existent comme : Azure Kubernetes Service [36], Amazon EKS [37], etc. qui facilitent son usage. Pour conclure, je suis trรจs satisfait par les connaissances et compรฉtences acquises lors de la rรฉdaction de ce mรฉmoire. Jโespรจre pouvoir les approfondir lors de mon arrivรฉe chez mon prochain employeur qui sโavรจre utiliser Kubernetes.
|
Table des matiรจres
Montรฉe en puissance des microservices avec Kubernetes
Dรฉclaration
Remerciements
Rรฉsumรฉ
Liste des tableaux
Liste des figures
1. Introduction
1.1 DevOps
1.2 Microservices
1.3 Docker
1.4 Kubernetes
2. Problรฉmatique
2.1 CQRS
2.2 Publish and Subscribe
3. Architecture Kubernetes
3.1 Introduction
3.2 Docker
3.2.1 Docker deamon & docker-cli
3.2.2 Docker Image
3.2.3 Dockerfile
3.2.4 DockerHub
3.3 Pods
3.4 Worker Node
3.5 ReplicationController, ReplicaSet
3.6 HorizontalPodAutoscalling
3.7 Master Node
3.8 Service
3.8.1 NodePort :
3.8.2 LoadBalancer :
3.8.3 Ingress :
4. Accรจs aux services par une requรชte externe
4.1 Introduction
4.2 Networking
4.3.1 Ajustement du nombre de pods vis-ร -vis du trafic
4.3.2 Crรฉation des pods suite ร une mise-ร -jour de lโetcd
4.3.3 Sรฉlection du worker node
5. Installation
5.1 Docker
5.2 Minikube
5.2.1 Introduction
5.2.2 Prรฉrequis
5.2.3 Virtualisation VT-x ou AMD-v
5.2.4 Hyperviseur
5.2.5 Kubectl
5.2.6 Minikube
6. Case study
6.1 Introduction
6.2 Crรฉation de lโimage NBA avec Docker
6.2.1 Dockerfile
6.2.2 Docker CLI
6.3 Publier lโimage sur DockerHub
6.4 Crรฉer un container avec lโimage NBA
6.5 Essai de montรฉe en puissance
6.5.1 Introduction
6.5.2 Crรฉation minikube
6.5.3 Crรฉation ReplicaSet
6.5.4 Diminution manuelle du nombre de pods ยซ nba ยป
6.5.5 NodePort Service
6.5.6 HPA
7. Conclusion
Bibliographie
Tรฉlรฉcharger le rapport complet