Comprendre les concepts de montées de version des applications dans un cluster Kubernetes.
L'objectif de ce Lab 9 est aussi de voir comment répartir le trafic réseau entre plusieurs versions d'une application.
Les patterns les plus classiques en termes de répartition de trafic entre plusieurs versions d'une application étant :
- le Rolling Update - https://kubernetes.io/docs/tutorials/kubernetes-basics/update/update-intro/
- le vert/bleu (ou noir/rouge chez Netflix)
- le A/B testing
- le canary
Déploiement du "resource group":
az group create \
--location "eastus2" \
--resource-group "RG-AKS-Lab-9"
Déploiement d'un virtual network:
az network vnet create \
--resource-group "RG-AKS-Lab-9" \
--name AKSvnet \
--location "eastus2" \
--address-prefixes 10.0.0.0/8
Déploiement du subnet:
SUBNET_ID=$(az network vnet subnet create \
--resource-group "RG-AKS-Lab-9" \
--vnet-name AKSvnet \
--name subnetAKS \
--address-prefixes 10.240.0.0/16 \
--query id \
--output tsv)
Création d'une "Managed Identity":
IDENTITY_ID=$(az identity create \
--resource-group "RG-AKS-Lab-9" \
--name idAks \
--location "eastus2" \
--query id \
--output tsv)
Création d'une "Azure Container Registry"
az acr create \
--name "acrlab009" \
--resource-group "RG-AKS-Lab-9" \
--sku basic
Création du cluster AKS
az aks create \
--resource-group "RG-AKS-Lab-9" \
--name "AKS-Lab-9" \
--location "eastus2" \
--network-plugin azure \
--generate-ssh-keys \
--node-count 2 \
--enable-cluster-autoscaler \
--min-count 1 \
--max-count 3 \
--vnet-subnet-id $SUBNET_ID \
--enable-managed-identity \
--assign-identity $IDENTITY_ID \
--attach-acr "acrlab009" \
--yes
Connexion au cluster AKS
az aks get-credentials --resource-group RG-AKS-Lab-9 --name AKS-Lab-9
API v1:
-> Allez dans ./API/v1 et lancer cette commande
az acr build -t api/api:1.0.0 -r "acrlab009" .
API v2:
-> Allez dans ./API/v2 et lancer cette commande
az acr build -t api/api:2.0.0 -r "acrlab009" .
Tests des pushs:
az acr repository show --name acrlab009 --image api/api:1.0.0
Installation de l'application:
Allez dans ./Manifest
kubectl apply -f ./v1
Check:
watch kubectl get all --namespace namespacelab9
ctl+c pour sortir
Pour visionner la version déployée
kubectl rollout history deployment api-deployment --namespace namespacelab9
Pour mettre une annotation à la version (revision)
kubectl annotate deployments.apps api-deployment kubernetes.io/change-cause="version blue" --namespace namespacelab9
kubectl rollout history deployment api-deployment --namespace namespacelab9
kubectl get all --namespace namespacelab9
Executer la commande:
curl http://<EXTERNAL-IP>
Mise à jour de l'application en "rolling updates" avec des stratégies
Allez dans le répertoire ./Manifest/v2/rollingupdate et observer le fichier update.yaml ( au niveau "spec et strategy").
cd ..
kubectl apply -f ./rollingupdate/update.yaml
Visionner la mise à jour de la version 2
watch kubectl get all --namespace namespacelab9
attendre qu'il n'y est plus que trois pods
même procéder que pour la verion 1
kubectl rollout history deployment api-deployment --namespace namespacelab9
kubectl annotate deployments.apps api-deployment kubernetes.io/change-cause="version green" --namespace namespacelab9
kubectl rollout history deployment api-deployment --namespace namespacelab9
test
curl http://<EXTERNAL-IP>
Pour revenir à la version 1
kubectl rollout undo deployment.apps/api-deployment --to-revision=1 --namespace namespacelab9
test
curl http://<EXTERNAL-IP>
Mise à jour de l'application avec la méthode "blue green"
On va repartir sur deux déploiements
On détruit la configuration
kubectl delete namespace namespacelab9
Premier déploiement: Dans le répertoire ./Manifest/v2/bluegreen:
kubectl apply -f ./namespace.yaml
kubectl apply -f ./deploymentv1.yaml
kubectl apply -f ./service.yaml
Test:
kubectl get all --namespace namespacelab9
curl EXTERNAL-IP
{"message":"hello API Bleue"}
Deuxième déploiement:
kubectl apply -f ./deploymentv2.yaml
Redirection des flux vers la nouvelle version
Editer le fichier service.yaml
et modifier le "selector" et passez "app: API-v2"
Appliquer la configuration:
kubectl apply -f ./service.yaml
Check:
curl EXTERNAL-IP
{"message":"hello API Green"}
Pour repasser à la version précédente remodifier le fichier service.yaml
et modifier le "selector" et passer "app: API-v1"
Mise à jour de l'application avec la méthode "canary"
On va repartir sur deux déploiements
On détruit la configuration
kubectl delete namespace namespacelab9
Premier déploiement avec 3 réplicas:
Dans le répertoire ./Manifest/v2/canary:
kubectl apply -f ./namespace.yaml
kubectl apply -f ./deploymentv1.yaml
kubectl apply -f ./service.yaml
Test:
kubectl get all --namespace namespacelab9
curl EXTERNAL-IP
{"message":"hello API Bleue"}
Deuxième déploiement avec 1 réplica: (75-25)
kubectl apply -f ./deploymentv2.yaml
Test:
kubectl get all --namespace namespacelab9
Répéter la commande curl EXTERNAL-IP
Vous devez avoir une fois sur quatre:
{"message":"hello API Green"}
az group delete --name "RG-AKS-Lab-9"