Continuons à nous intéresser à un autre service disponible sur Azure : le conteneur, aussi appelé virtualisation en micro-service. La conteneurisation est une méthode populaire pour le déploiement et la mise à l’échelle des applications depuis déjà plusieurs années. Peu importe l’hébergeur de Cloud public choisi, le conteneur reste un modèle très plébiscité par son fonctionnement, ses coûts et sa rapidité de mise en œuvre.
Avant de partir dans un exercice sur Azure, je vous propose de parcourir ensemble quelques notions importantes.
Qu’est-ce qu’un conteneur ?
Les conteneurs sont des environnements virtualisés, dont le but est d’exécuter généralement un micro-service. A la différence des machines virtuelles IaaS, les conteneurs sont dépourvus du système d’exploitation, car cette gestion OS est réalisée à un niveau supérieur. Cela rend leur création plus facile et ils sont beaucoup plus légers.
Un orchestrateur de conteneurs est utile pour gérer les conteneurs, mais également aussi pour manager les ressources exécutants ces conteneurs.
Conteneur ou machines virtuelles ?
Les machines virtuelles s’exécutent dans un hyperviseur (hôte) dans lequel chacune d’entre elles doit inclure son propre système d’exploitation invité (guest). En revanche, chaque conteneur partage le même système d’exploitation hôte ou noyau système. Donc l’un s’appuie sur l’autre :
Par contre, construire une application dans des conteneurs apportent plusieurs avantages non négligeables :
- Moins lourd : Les conteneurs requièrent moins de ressources que les environnements de machines virtuelles, car ils n’incluent pas les images du système d’exploitation.
- Plus rapide : Le démarrage d’un conteneur ne prend donc généralement que quelques secondes, contre plusieurs minutes pour une machine virtuelle.
- Amélioration de la portabilité : Les applications qui s’exécutent dans des conteneurs peuvent être facilement déployées sur différents types de systèmes d’exploitation et de plateformes matérielles.
- Efficacité accrue : Les conteneurs permettent de déployer, de corriger ou de faire évoluer les applications beaucoup plus rapidement.
- Optimisation du développement d’applications : Les conteneurs accélèrent les cycles de développement, de test et de production grâce à la méthodologie agile et DevOps.
ACI vs AKS (K8s) ?
AKS et ACI sont deux plateformes populaires d’orchestration de conteneurs proposées par Microsoft Azure.
- AKS est un service Kubernetes entièrement géré qui fournit une plateforme d’orchestration de conteneurs hautement disponible, évolutive et sécurisée.
- ACI est une plateforme de conteneurs sans serveur qui vous permet d’exécuter des conteneurs sans avoir à gérer l’infrastructure sous-jacente.
Nodes vs Pods ?
- Node : Un nœud correspond à une machine virtuelle. Cependant, vous pourriez créer un nœud à partir de presque n’importe quoi. Considérons un node comme un ensemble de ressources CPU et RAM qui peuvent être utilisées.
- Pods : Kubernetes n’exécute pas les conteneurs directement ; ces derniers sont contenus dans une structure intermédiaire appelée Pod. Tous les conteneurs d’un même pod partagent les mêmes ressources et le même réseau local. Les conteneurs peuvent facilement communiquer avec d’autres conteneurs dans le même pod, comme s’ils étaient sur la même machine, tout en maintenant un certain degré d’isolation par rapport aux autres.
Kubernetes vs. Docker ?
Docker est une plateforme de conteneurisation et un moteur d’exécution, tandis que Kubernetes est une plateforme permettant d’exécuter et de gérer des conteneurs à partir de nombreux moteurs d’exécution de conteneurs. Kubernetes prend en charge de nombreux moteurs d’exécution de conteneurs, y compris Docker.
En résumé, Docker et Kubernetes ne poursuivent pas le même objectif : Docker vous permet de développer, déployer et donc itérer plus vite sur votre produit, tandis que Kubernetes est la solution pour le “runner” en production.
Padok
Afin de vous familiariser les conteneurs disponibles sur Azure sous différentes formes, je vous propose de suivre cet exercice dédié à ACI et AKS. La version originale de l’exercice conçu par Microsoft est également disponible en anglais sur la page GitHub juste ici.
Voici la liste des tâches modifiées que nous allons réaliser :
- Etape I : Test d’Azure Container Instances
- Etape II : Enregistrement les fournisseurs de ressources AKS
- Etape III : Déploiement d’un cluster Azure Kubernetes Service
- Etape IV : Déploiement des pods dans le cluster AKS
- Etape V : Variation du nombre de Pods
- Etape VI : Variation du nombre de Nodes
- Etape VII : Mix entre AKS et ACI
- Etape VIII : Test d’une application multi-conteneurs
Comme je le répète régulièrement, une ressource déployée entraîne un début de facturation de la part de Microsoft. Il est donc important de correctement dimensionner les ressources, et de les supprimer quand elles ne sont plus utilisées.
Rappel des prérequis :
Pour réaliser cet exercice sur ASK / ACI, il vous faudra disposer de :
- Un tenant Microsoft
- Une souscription Azure valide
Mon environnement Azure de départ ne contient aucune autre ressource, commençons par Azure Container Instances.
Etape I – Test d’Azure Container Instances :
Connectez-vous sur le portail Azure, puis authentifiez-vous :
Commencez par rechercher le service Container instances depuis la barre, en haut de votre portail Azure :
Cliquez-ici pour créer votre service Azure Container Instance :
Remplissez tous les champs comme ceci, puis cliquez sur Suivant :
Dans l’onglet Réseau, nommez votre ACI. Celui-ci doit être valide et unique, puis cliquez sur Suivant :
Lancez la validation Azure :
Une fois la validation Azure réussie, cliquez-ici pour commencer la création :
Attendez environ une minute que le processus de création se termine, puis cliquez ici :
Reprenez le FQDN de votre instance ACI :
Ouvrez un nouvel onglet de navigateur, puis collez l’URL correspondante :
Retournez sur votre portail afin de consulter le log de votre instance.
Vérifiez l’entrée représentant la requête HTTP GET générée par l’affichage de l’application dans le navigateur :
Cette première étape très rapide sur ACI est maintenant terminé. Intéressons-nous maintenant à Azure Kubernetes Service (AKS), un orchestrateur managé de conteneurs disponible sur Azure.
Etape II – Enregistrement les fournisseurs de ressources AKS :
Pour cela, ouvrez Azure Cloud Shell depuis la barre bleue en haut de votre portail Azure :
Si besoin, créez un compte de stockage si celui-ci vous le demande :
Saisissez les deux commandes suivantes pour enregistrer les fournisseurs de ressources suivants :
- Microsoft.Kubernetes
- Microsoft.KubernetesConfiguration
Register-AzResourceProvider -ProviderNamespace Microsoft.Kubernetes
Register-AzResourceProvider -ProviderNamespace Microsoft.KubernetesConfiguration
Vérifiez l’avancement de l’enregistrement de ces 2 fournisseurs au niveau de votre souscription Azure :
Quelques minutes plus tard, constatez le changement de statut :
Nous environnement est maintenant prêt pour AKS. Nous allons maintenant créer notre premier cluster AKS composé d’un seul worker node.
Etape III – Déploiement d’un cluster Azure Kubernetes Service :
Depuis la barre de recherche, trouvez le service Kubernetes :
Cliquez-ici pour créer votre cluster Kubernetes sur Azure :
Renseignez les champs suivants :
Prenez soin de désactiver la mise à l’échelle automatique, puis cliquez sur Suivant :
Cochez la case suivante pour activer les nœuds virtuels ACI, puis cliquez sur Suivant :
Conservez l’option Kubernetes RBAC, puis cliquez sur Suivant :
Azure CNI est grisé à cause de l’ajout de nœuds virtuels ACI, cliquez sur Suivant :
Décochez la case des alertes, puis lancez la validation Azure :
Une fois la validation Azure réussie, cliquez-ici pour commencer la création :
Attendez environ trois minutes que le processus de création se termine :
Constatez la bonne disponibilité du nœud ASK déployé :
Notre environnement AKS est prêt à recevoir des conteneurs. Passons à l’étape suivante pour réaliser cela.
Etape IV – Déploiement des pods dans le cluster AKS :
Ouvrez à nouveau Azure Cloud Shell :
Basculez de PowerShell à Bash, puis confirmez :
Exécutez la procédure suivante pour récupérer les informations d’identification permettant d’accéder au cluster AKS :
RESOURCE_GROUP='az104-09c-rg1'
AKS_CLUSTER='az104-9c-aks1'
az aks get-credentials --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER
Exécutez la commande suivante pour obtenir la liste des nœuds actifs sur AKS :
kubectl get nodes
Notez la présence d’un nœud virtuel représenté par ACI :
Exécutez la commande suivante afin de déployer l’image nginx depuis le Docker Hub :
kubectl create deployment nginx-deployment --image=nginx
Exécutez la commande suivante pour obtenir la liste des pods actifs sur AKS :
kubectl get pods
Exécutez la commande suivante pour obtenir les statuts et le nombre de la conteneurs actifs sur AKS :
kubectl get deployment
Retrouvez cette même information sur le portail Azure :
Exécutez la commande suivante pour exposer, donc rendre le pod accessible depuis Internet :
kubectl expose deployment nginx-deployment --port=80 --type=LoadBalancer
Exécutez la commande suivante afin d’obtenir l’adresse IP publique de l’équilibreur de charge dédié à votre application :
kubectl get service
Retrouvez cette même information sur le portail Azure, puis ouvrez un nouvel onglet de navigateur en collant l’adresse IP correspondante :
Vérifiez que la page du navigateur affiche bien le message suivant :
Afin de comprendre la force des conteneurs, jouons un peu avec le nombre de pods dans l’étape suivante.
Etape V – Variation du nombre de Pods :
Nous allons faire évoluer les charges de travail conteneurisées dans votre cluster Azure Kubernetes.
Exécutez la commande suivante pour mettre à l’échelle le déploiement en augmentant le nombre de pods à 2 :
kubectl scale --replicas=2 deployment/nginx-deployment
Contrôler la mise à l’échelle du déploiement via la commande suivante :
kubectl get pods
Retrouvez cette même information sur le portail Azure :
Il est également possible d’augmenter le nombre de worker nodes dans notre environnement AKS. Pour cela, l’étape suivante nous le montre.
Etape VI – Variation du nombre de Nodes :
Exécutez la procédure suivante pour mettre à l’échelle le cluster en augmentant le nombre de nœuds à 2 :
RESOURCE_GROUP='az104-09c-rg1'
AKS_CLUSTER='az104-9c-aks1'
az aks scale --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER --node-count 2
Attendez plusieurs minutes que le traitement de création du nœud se termine :
Retrouvez ce nombre actualisé sur le portail Azure :
Exécutez la commande suivante pour vérifier le résultat de la mise à l’échelle du cluster :
kubectl get nodes
Retrouvez cette même information sur le portail Azure :
Exécutez la commande suivante pour mettre le déploiement à l’échelle sur 10 répliques :
kubectl scale --replicas=10 deployment/nginx-deployment
Exécutez la commande suivante pour vérifier le résultat :
kubectl get pods
Retrouvez cette même information sur le portail Azure :
Exécutez la commande suivante pour vérifier la répartition des pods sur les nœuds du cluster :
kubectl get pod -o=custom-columns=NODE:.spec.nodeName,POD:.metadata.name
Retrouvez cette même information sur le portail Azure :
Exécutez la procédure suivante pour remettre à l’échelle le cluster à 1 nœud :
az aks scale --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER --node-count 1
Quelques minutes plus tard, retrouvez cette même information sur le portail Azure :
kubectl get pod -o=custom-columns=NODE:.spec.nodeName,POD:.metadata.name
Exécutez la commande suivante pour vérifier la répartition des pods sur le seul nœud restant du cluster :
AKS supporte très bien l’ajout de conteneurs managés ACI. Testons un peu cela.
Etape VII – Mix entre AKS et ACI :
Vérifiez l’état de l’enregistrement du fournisseur ACI à l’aide de la commande suivante :
az provider list --query "[?contains(namespace,'Microsoft.ContainerInstance')]" -o table
L’exemple suivant montre que le fournisseur Microsoft.ContainerInstance est enregistré :
Si le fournisseur n’est pas enregistré, il faut l’enregistrer à l’aide de la commande suivante :
az provider register --namespace Microsoft.ContainerInstance
Exécutez la commande suivante pour obtenir la liste des noeux actifs sur AKS :
kubectl get nodes
Créez un fichier nommé virtual-node.yaml en y copiant le contenu YAML suivant, ou récupérez son contenu juste ici :
apiVersion: apps/v1
kind: Deployment
metadata:
name: aci-helloworld
spec:
replicas: 1
selector:
matchLabels:
app: aci-helloworld
template:
metadata:
labels:
app: aci-helloworld
spec:
containers:
- name: aci-helloworld
image: mcr.microsoft.com/azuredocs/aci-helloworld
ports:
- containerPort: 80
nodeSelector:
kubernetes.io/role: agent
beta.kubernetes.io/os: linux
type: virtual-kubelet
tolerations:
- key: virtual-kubelet.io/provider
operator: Exists
Cliquez sur Téléverser pour lancer l’opération de transfert vers Azure :
Choisissez le fichier précédemment généré :
Exécutez l’application à l’aide de la commande suivante :
kubectl apply -f virtual-node.yaml
Constatez l’apparition de l’application sur votre portail Azure, puis attendez :
Exécutez la commande suivante pour exposer, donc rendre le pod disponible depuis Internet :
kubectl expose deployment aci-helloworld --port=80 --type=LoadBalancer
Ouvrez un nouvel onglet de navigateur, puis collez l’adresse IP correspondante.
Vérifiez que la page du navigateur affiche bien le message Welcome to Azure Container Instances! :
Exécutez la commande suivante pour mettre à l’échelle le déploiement en augmentant le nombre de pods à 5 :
kubectl scale --replicas=5 deployment/aci-helloworld
Retrouvez cette même information sur le portail Azure :
Cliquez sur votre nœud ACI :
Constatez la bonne présence de votre application et de ses répliques :
Un dernier test pour mieux comprendre le découplage d’une application dans plusieurs conteneurs.
Etape VIII – Test d’une application multi-conteneurs :
Créer un fichier nommé azure-vote-v2.yaml en y copiant le contenu YAML suivant, ou récupérez son contenu juste ici :
apiVersion: apps/v1
kind: Deployment
metadata:
name: azure-vote-back
spec:
replicas: 1
selector:
matchLabels:
app: azure-vote-back
template:
metadata:
labels:
app: azure-vote-back
spec:
nodeSelector:
kubernetes.io/role: agent
beta.kubernetes.io/os: linux
type: virtual-kubelet
tolerations:
- key: virtual-kubelet.io/provider
operator: Exists
containers:
- name: azure-vote-back
image: mcr.microsoft.com/oss/bitnami/redis:6.0.8
env:
- name: ALLOW_EMPTY_PASSWORD
value: "yes"
ports:
- containerPort: 6379
name: redis
---
apiVersion: v1
kind: Service
metadata:
name: azure-vote-back
spec:
ports:
- port: 6379
selector:
app: azure-vote-back
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: azure-vote-front
spec:
replicas: 1
selector:
matchLabels:
app: azure-vote-front
template:
metadata:
labels:
app: azure-vote-front
spec:
nodeSelector:
kubernetes.io/role: agent
beta.kubernetes.io/os: linux
type: virtual-kubelet
tolerations:
- key: virtual-kubelet.io/provider
operator: Exists
containers:
- name: azure-vote-front
image: mcr.microsoft.com/azuredocs/azure-vote-front:v1
ports:
- containerPort: 80
env:
- name: REDIS
value: "azure-vote-back"
---
apiVersion: v1
kind: Service
metadata:
name: azure-vote-front
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: azure-vote-front
Cliquez sur Téléverser pour lancer l’opération de transfert vers Azure :
Exécutez l’application à l’aide de la commande suivante :
kubectl apply -f azure-vote-v2.yaml
Constatez l’apparition de l’application sur votre portail Azure, puis attendez :
Environ 2 minutes plus, constatez le changement de statut en vert :
Vérifiez la bonne affectation de votre application sur le nœud ACI :
Cette information avait été renseigné dans le fichier YAML :
Ouvrez un nouvel onglet de navigateur en collant l’adresse IP correspondante :
Vérifiez que la page du navigateur affiche bien l’application de vote :
Testez l’application en votant pour Chiens ou Chats :
Ouvrez un nouvel onglet en navigation privée :
Vérifiez la persistance des votes précédemment réalisés :
Effacez votre résultat, puis fermez l’onglet de navigation privé :
Rafraichissez la page de test, puis constatez le même effacement des précédents votes :
Conclusion
Grâce à ce petit exercice, nous avons bien compris que le conteneur n’est qu’un moyen parmi d’autres pour faire tourner une application, avec de nombreux avantages.
Mais, quelle que soit la plateforme choisie, il est toujours primordial de suivre les bonnes pratiques pour concevoir, mettre en œuvre et gérer vos applications : à savoir la surveillance, optimisations, sécurité, confirmé et coûts 😎.