Exercice 07 : Déployer un cluster AKS et sa première application
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Créer un cluster AKS minimal et se connecter avec kubectl
- ✅ Déployer une application web sur AKS
- ✅ Exposer l'application via un Service de type LoadBalancer (IP publique Azure)
- ✅ Utiliser kubectl pour scaler et inspecter l'état du cluster
Durée estimée : 45 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis : kubectl installé, Azure CLI installée, notions Kubernetes Débutant
📖 Contexte
AKS (Azure Kubernetes Service) est le service Kubernetes managé d'Azure. Azure gère le plan de contrôle (control plane) : API server, etcd, scheduler. Vous gérez uniquement les nœuds workers (les VM qui font tourner vos conteneurs). AKS s'intègre nativement avec Azure Load Balancer, ACR (Container Registry) et Azure Monitor.
📋 Énoncé
Créez un cluster AKS, déployez une application et exposez-la publiquement.
🧭 Déroulement de l'exercice
Tâche 1 : Créer le cluster AKS
# Groupe de ressources
az group create --name rg-aks-exercice --location francecentral
# Activer le provider AKS (si premier usage)
az provider register --namespace Microsoft.ContainerService
# Créer le cluster AKS minimal (Standard_B2s = 2 vCPU, 4 Go RAM)
az aks create \
--name aks-exercice \
--resource-group rg-aks-exercice \
--node-count 2 \
--node-vm-size Standard_B2s \
--generate-ssh-keys \
--enable-addons monitoring \
--kubernetes-version 1.29
# Cette commande prend ~5 minutes
# Suivre la progression
az aks show \
--name aks-exercice \
--resource-group rg-aks-exercice \
--query "provisioningState" -o tsvIndice : Le cluster AKS crée automatiquement un Resource Group secondaire (MC_*) qui contient les VMs des nœuds, les load balancers et les disques. Ne supprimez jamais ce groupe directement - supprimez toujours le cluster via
az aks delete.
Tâche 2 : Configurer kubectl
# Télécharger les credentials et configurer kubectl
az aks get-credentials \
--name aks-exercice \
--resource-group rg-aks-exercice
# Vérifier la connexion
kubectl cluster-info
kubectl get nodes -o wide
# Les nœuds doivent être en état Ready
kubectl get nodes
# NAME STATUS ROLES AGE
# aks-nodepool1-xxxxx-vmss000000 Ready agent 5m
# aks-nodepool1-xxxxx-vmss000001 Ready agent 5mTâche 3 : Déployer une application
cat > aks-app.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: aks-app
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: aks-app
template:
metadata:
labels:
app: aks-app
spec:
containers:
- name: app
image: nginx:1.27-alpine
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 15
---
apiVersion: v1
kind: Service
metadata:
name: aks-app-service
namespace: default
annotations:
# Annote le service comme LoadBalancer externe
service.beta.kubernetes.io/azure-load-balancer-internal: "false"
spec:
type: LoadBalancer # Azure provisionne automatiquement un Azure Load Balancer
selector:
app: aks-app
ports:
- port: 80
targetPort: 80
protocol: TCP
EOF
kubectl apply -f aks-app.yaml
# Attendre l'IP publique (le LoadBalancer Azure se provisionne en ~1-2 min)
kubectl get service aks-app-service -w
# EXTERNAL-IP passe de <pending> à une IP publique AzureTâche 4 : Tester et scaler
# Récupérer l'IP publique du LoadBalancer
EXTERNAL_IP=$(kubectl get service aks-app-service \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "IP publique : $EXTERNAL_IP"
# Tester l'accès depuis internet
curl http://$EXTERNAL_IP
# → Page Nginx par défaut
# Voir les pods et sur quel nœud ils tournent
kubectl get pods -o wide
# Scaler à 4 réplicas
kubectl scale deployment aks-app --replicas=4
kubectl get pods -o wide # Les pods sont distribués sur les 2 nœuds
# Tester la résilience : supprimer un pod
POD=$(kubectl get pods -l app=aks-app -o jsonpath='{.items[0].metadata.name}')
kubectl delete pod $POD
kubectl get pods -w # Le Deployment recrée le pod
# Mettre à jour l'application (rolling update)
kubectl set image deployment/aks-app app=nginx:1.26-alpine
kubectl rollout status deployment/aks-appTâche 5 : Inspecter le cluster
# Voir les événements du cluster
kubectl get events --sort-by='.lastTimestamp' | tail -20
# Consommation des ressources (metrics-server inclus dans AKS)
kubectl top nodes
kubectl top pods
# Voir les logs de l'application
kubectl logs -l app=aks-app --tail=10
# Informations sur les nœuds
kubectl describe nodes | grep -A5 "Allocated resources"Tâche 6 : Nettoyer
# Supprimer le cluster AKS (supprime aussi le RG MC_*)
az aks delete --name aks-exercice --resource-group rg-aks-exercice --yes --no-wait
# Supprimer le groupe de ressources
az group delete --name rg-aks-exercice --yes --no-wait✅ Vérification du résultat
kubectl get nodesaffiche 2 nœuds en étatReadykubectl get podsaffiche 2 podsaks-appen étatRunningcurl http://$EXTERNAL_IPretourne la page Nginxkubectl top nodesaffiche la consommation CPU/mémoire des nœuds
💡 À retenir
AKS vs Kubernetes auto-hébergé :
| AKS | DIY Kubernetes | |
|---|---|---|
| Plan de contrôle | ✅ Gratuit, managé | ❌ À gérer |
| Mises à jour | ✅ Semi-automatiques | ❌ Manuelles |
| Intégration Azure | ✅ Native | ❌ Configuration manuelle |
| LoadBalancer | ✅ Automatique | ❌ MetalLB ou équivalent |
| Coût | Nœuds seulement | Nœuds + control plane |
Commandes AKS essentielles :
az aks create / delete / start / stop / scale
az aks get-credentials # Configurer kubectl
az aks upgrade # Mettre à jour la version Kubernetes✨ Solution Complète
# Créer, connecter, déployer en 3 commandes
az aks create --name mon-cluster --resource-group mon-rg \
--node-count 2 --node-vm-size Standard_B2s --generate-ssh-keys
az aks get-credentials --name mon-cluster --resource-group mon-rg
kubectl apply -f mon-app.yaml