Skip to content

Latest commit

 

History

History
260 lines (231 loc) · 6.17 KB

File metadata and controls

260 lines (231 loc) · 6.17 KB

Montées de version de l'application: Rolling update, Blue Green, Canary

Objectif:

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 :

Création de l'environnement de démonstration

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

Build and Push les deux versions d'application

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

Déploiement de l'application

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

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.yamlet 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"}

Nettoyage du Lab_9

az group delete --name "RG-AKS-Lab-9"