Azure propose 4 services principaux pour héberger des containers + 1 registry pour les stocker. Choisir selon : besoin de control K8s, scale-to-zero, durée du workload.
A. Décider quel service utiliser#
| Service | Modèle | Use case | Note |
|---|---|---|---|
| ACI (Container Instances) | Single pod managé | Job ponctuel, batch, ad-hoc | Pas de scale, pas de LB. Démarre en quelques secondes |
| ACA (Container Apps) | Serverless, microservices | Microservices stateless avec scale-to-zero | Tourne sur AKS managé par MS, simplifie K8s |
| AKS (Kubernetes Service) | K8s complet | Workloads complexes, stateful, multi-tenants | Tu gères les nodes (cluster K8s natif) |
| Web App for Containers | App Service container | App web simple en container | Voir fiche 8 |
Pour AZ-104 : retenir quand utiliser quoi (questions scénario fréquentes). Pas besoin de connaître K8s en profondeur.
B. Azure Container Registry (ACR)#
Registry Docker privé managé. Stocke et distribue les images de containers (et autres OCI artifacts : Helm charts, etc.).
SKUs#
| SKU | Storage | Throughput | Geo-replication | Private Endpoint | Content Trust | Use case |
|---|---|---|---|---|---|---|
| Basic | 10 GB | Bas | ❌ | ❌ | ❌ | Dev/test |
| Standard | 100 GB | Moyen | ❌ | ❌ | ❌ | Prod modérée |
| Premium | 100 TiB | Haut | ✅ active-active | ✅ | ✅ | Prod multi-region, compliance |
Le SKU est modifiable à chaud (sauf que pour passer Premium → Standard/Basic il faut d'abord supprimer geo-replications + private endpoints).
Auth#
- Admin user : compte unique avec username/password (déconseillé, à désactiver).
- Service Principal : pour CI/CD pipelines.
- Managed Identity : recommandé. AKS / VM / App Service avec MI accède à l'ACR via RBAC.
- Entra ID + RBAC :
AcrPull,AcrPush,AcrDelete,AcrImageSigner(Premium).
ACR Tasks#
Build des images dans Azure (pas besoin de Docker local). 3 modes :
- Quick Task : build one-shot (
az acr build). - Triggered Task : build auto sur git push, base image update, ou schedule.
- Multi-step Task : pipeline (build → test → push) en YAML.
Avantage Tasks : build cross-architecture (ARM64), patching base image auto.
Features Premium importantes#
- Geo-replication : 1 registry, N regions, accès local depuis chaque region (pull rapide).
- Private Endpoint : registry uniquement accessible depuis VNet.
- Content Trust : signature des images (Docker Notary).
- Customer-Managed Keys (CMK) pour encryption.
- Repository-scoped tokens : auth granulaire par repo (au lieu d'auth tenant entier).
C. Azure Container Instances (ACI)#
Le plus simple : un container (ou un container group) qui tourne, billing à la seconde.
À retenir#
- Container group = unité de déploiement (1+ containers partageant le même hostname, IPs, storage). Équivalent d'un pod K8s.
- OS : Linux ou Windows. ⚠️ Tous les containers d'un même group = MÊME OS (pas de mix Linux + Windows).
- Networking :
- Public IP par défaut (avec FQDN optionnel
<label>.<region>.azurecontainer.io) → DNS name label = public networking obligatoire (privé = pas de FQDN public). - Possibilité de déployer dans un VNet (subnet dédié, IP privée)
- Public IP par défaut (avec FQDN optionnel
- Storage :
- Volumes : Azure File Shares (SMB), Empty Dir, Git repo, Secrets
- Restart policy :
Always/OnFailure/Never - Hyper-V isolation par défaut (chaque pod dans une VM légère).
Use cases AZ-104#
- Build agents (CI/CD)
- Batch jobs ponctuels
- Backend léger d'une queue (KEDA-style)
- POC/démos
Limites#
- ❌ Pas de scaling auto
- ❌ Pas de load balancing natif
- ❌ Pas de stateful (stockage persistant via Files mount uniquement)
- ❌ Pas de monitoring avancé natif
D. Azure Container Apps (ACA)#
Plateforme serverless pour microservices containerisés. Tourne sur AKS managé par MS — tu n'as pas accès à K8s directement.
Concepts clés#
- Environment : équivalent du cluster, contient les apps (1 environment = 1 VNet / Log Analytics).
- Container App : 1 application = N revisions.
- Revision : version immutable d'une app (snapshot du container + config).
- Scaling rules (KEDA) : scale-to-zero, HTTP, CPU/RAM, custom (queue length, etc.).
- Ingress : interne ou externe (HTTPS auto, custom domains, mTLS).
- Dapr intégré nativement (pour microservices distribués).
Plans / Environment types#
| Plan | Description | Subnet min |
|---|---|---|
| Consumption only | Pay-as-you-go par vCPU-second + RAM-second. Scale-to-zero. Pas d'UDR, pas de NAT GW custom | /23 |
| Workload profiles | Mix Consumption + Dedicated (général ou GPU/memory-optimized). Supporte UDR + NAT GW egress | /27 |
🚨 Piège exam : si la question demande "smallest subnet pour ACA workload profiles" → /27. Si /27 n'est pas dans les choix proposés (cas tutorialdojo), prendre la taille immédiatement plus grande disponible (ex /26). Pour Consumption only : /23 minimum (donc /22, /21… acceptables).
Choix de l'environment type est figé à la création (irréversible). Pour migrer Consumption → Workload profiles : recréer.
Connexion à un VNet existant :
- Subnet dédié à l'environment (pas partagé avec autre chose).
- Subnet vide au moment de la création de l'environment.
- 1 environment = 1 VNet (et 1 Log Analytics workspace).
Comparé à AKS#
- ✅ Plus simple (pas de gestion nodes, pas de YAML K8s)
- ✅ Scale-to-zero natif
- ❌ Moins de contrôle (pas d'accès K8s API natif)
- ❌ Pas pour workloads très spécifiques (DaemonSets, CRDs custom, etc.)
E. Azure Kubernetes Service (AKS)#
K8s managé : MS gère le control plane (gratuit ou payant selon SKU), tu gères les worker nodes.
Architecture#
- Cluster : 1 control plane + N node pools.
- Node pool : groupe de VMs (System pool obligatoire pour les services system + User pools pour tes apps).
- Pod : unité de déploiement K8s (1+ containers).
- kubectl : CLI K8s pour interagir avec le cluster.
SKUs (Tier)#
| Tier | Description |
|---|---|
| Free | Control plane gratuit, pas de SLA financier sur l'API K8s |
| Standard | Control plane payant, SLA 99.95%, recommandé prod |
| Premium | Standard + Long-Term Support (LTS) sur version K8s |
Auth & Networking#
- Auth : Entra ID (recommandé) ou local accounts. RBAC K8s + Azure RBAC.
- Networking models :
- Kubenet : NAT, IPs pods invisibles depuis VNet — 🚨 retiré le 31 mars 2028 → migrer vers Azure CNI Overlay (migration one-way irréversible)
- Azure CNI : pods avec IP du VNet, plus performant, IP plus consommé
- Azure CNI Overlay : compromis (pods en /24 superposé, IPs économisées) — recommandé MS pour la plupart des scénarios
- Network policies : Calico ou Azure Network Policy.
- Ingress : Application Gateway Ingress Controller (AGIC), ou Nginx, ou Application Routing.
Cluster ops#
- Upgrade K8s : control plane d'abord, puis nodes (rolling).
- Auto-upgrade channel :
none,patch,stable,rapid,node-image. - Cluster Autoscaler : scale automatique du nb de nodes.
- HPA (Horizontal Pod Autoscaler) : scale du nb de pods. ⚠️ Nécessite Kubernetes Metrics Server (récupère CPU/RAM des pods pour HPA) — installé par défaut sur AKS.
- VPA (Vertical Pod Autoscaler) : ajuste CPU/RAM des pods (supporté Linux et Windows sur AKS).
Storage K8s#
- PV / PVC (Persistent Volume / Claim).
- Storage classes : Azure Disk, Azure Files, Azure NetApp Files, Blob (CSI drivers).
Pour AZ-104#
Niveau d'attente AZ-104 = basique :
- Comprendre la hiérarchie (cluster, node pool, pod, deployment, service).
- Savoir créer un cluster + connecter
kubectl(az aks get-credentials). - Notion de node pool system vs user.
- Notion d'auto-scale.
- Pas de questions K8s pures (CRDs, operators, etc.).
🏢 Scénarios d'entreprise (CAF/WAF)#
Scenario 1 : Plateforme fintech microservices régulée (néobanque, paiement)#
Contexte business : Une néobanque fait tourner ~40 microservices (paiements, KYC, comptabilité) en 24/7, avec une latence exigeante et des règles strictes (PCI-DSS, DORA). Équipe SRE expérimentée. Choix architectural : AKS Standard tier (SLA 99.95% sur l'API K8s) car l'équipe maîtrise Kubernetes et a besoin de contrôle fin. Images dans un ACR Premium géo-répliqué. Mise à l'échelle par HPA (pods) + Cluster Autoscaler (nodes). Architecture / pattern :
- ACR Premium répliqué sur 2 régions EU → chaque cluster télécharge ses images en local (rapide + résilient).
--attach-acr: les nodes s'authentifient à l'ACR via Managed Identity, aucun secret dans le pipeline.- 1 cluster par région, Front Door en amont.
- Node pools séparés :
system(services K8s) +user-default(apps) +user-memory(moteur ledger) +user-spot(batch nocturne). - HPA partout avec min 3 (anti-fragile), Cluster Autoscaler 3-50 nodes.
- Network policy Calico + Azure Policy for AKS pour interdire les containers privilégiés et exiger des images signées. Trade-offs assumés :
- Gain : contrôle total et conformité réglementaire.
- Perte : AKS est complexe à opérer → justifié seulement avec une équipe SRE solide. Pièges à éviter :
- AKS Free tier en prod : pas de SLA financier sur l'API → un outage et l'audit DORA tombe.
- Mélanger system et user dans un seul node pool : un workload buggy peut affamer les services K8s. Séparer.
- Pas de ResourceQuota + LimitRange par namespace → un Deployment sans limites peut OOMKiller les voisins. Jamais un namespace sans quota.
- ACR Basic en multi-région : pas de géo-réplication → latence et point de panne unique.
- Question exam : "scaler les pods" = HPA (ni Cluster Autoscaler, ni VPA, ni Dashboard).
📐 Réf. — AKS landing zone accelerator (WAF) : System/User node pools séparés, Azure CNI Overlay, Entra ID + RBAC, ACR Premium geo-répliqué + --attach-acr via MI, Azure Policy for AKS sont les pratiques de l'architecture de référence AKS. Lien
Scenario 2 : Plateforme événementielle / e-commerce serverless (retailer DTC)#
Contexte business : Une marque grand public a un trafic très saisonnier (Noël, soldes) et presque rien le reste de l'année. Son backend est fait de microservices stateless. Objectif : payer 0€ la nuit. Choix architectural : Azure Container Apps (serverless) car il sait descendre à zéro instance (KEDA) quand il n'y a pas de trafic, sans gérer de cluster. On prend le type Workload profiles pour pouvoir router la sortie via un firewall. Architecture / pattern :
- 1 Container Apps Environment en Workload profiles (nécessaire pour avoir UDR + NAT Gateway, car un partenaire paiement whiteliste des IPs fixes).
- Apps "front" : scale sur le nombre de requêtes (min 0 la nuit, max 30).
- Apps "worker" : scale sur la longueur d'une file Service Bus (KEDA), min 0, démarre dès le 1er message.
- Déploiement canary via revisions + traffic split 90/10.
- ACR Standard (1 région), accès via Managed Identity. Ingress HTTPS + cert managé gratuit. Trade-offs assumés :
- Gain : on ne paie quasiment rien hors saison, et zéro cluster à gérer.
- Perte : le scale-to-zero crée un cold start, gênant sur les parcours sensibles. Pièges à éviter :
- Créer en Consumption puis vouloir router via firewall (UDR) → le type d'environnement est figé à la création, il faut tout recréer en Workload profiles.
- Subnet trop petit : /27 min en Workload profiles, /23 min en Consumption. Prévoir large.
- Scale-to-zero sur le checkout = cold start de quelques secondes = panier perdu. Sur ces apps "argent" : min 1 ou 2.
- Pas d'accès à l'API K8s : si on a besoin d'un CRD ou DaemonSet précis → migrer AKS (rare ici).
📐 Réf. — Azure Container Apps (serverless microservices) + WAF Cost : KEDA scale-to-zero, revisions + traffic split canary, Dapr et Workload profiles (UDP/NAT GW egress) sont les patterns recommandés pour des microservices serverless à coût optimisé. Lien
Scenario 3 : CI/CD build agents + batch jobs ponctuels (ESN, intégrateur)#
Contexte business : Une ESN de 50 devs lance des builds, tests et scripts de migration ponctuels. Pas besoin d'orchestrateur permanent : juste "lance un container, attends qu'il finisse, paie ce qui est consommé".
Choix architectural : Azure Container Instances (ACI) car c'est facturé à la seconde et le container s'arrête quand le job finit (restart policy Never). Images dans un ACR, état partagé via Azure Files.
Architecture / pattern :
- Image "ci-runner" (terraform + az CLI + node + .NET) construite via ACR Tasks (
az acr build) → pas de Docker sur les laptops. - GitHub Actions lance
az container create(secrets injectés depuis Key Vault) → le job tourne, sort, et la facturation s'arrête. - Restart policy
Never: un crash doit être visible, pas masqué par un retry. - Volume Azure Files monté pour passer des artefacts entre jobs d'un même pipeline.
- Container groups quand un job a besoin d'un sidecar (ex: app + nginx pour un test e2e). Trade-offs assumés :
- Gain : coût à l'usage, démarrage simple, zéro infra permanente.
- Perte : pas de load balancer ni d'autoscale → inadapté à une app qui tourne en continu. Pièges à éviter :
- Mélanger Linux + Windows dans le même container group → interdit, échec. Faire 2 groups.
- Exposer un DNS public sans restriction → endpoint scanné en quelques minutes. Subnet privé ou pas d'exposition.
- Utiliser ACI pour une app web 24/7 → pas de LB, pas de scale, et plus cher qu'App Service Basic. Pour du long-running : Container Apps ou App Service.
- ACR Basic = 10 GB → saturé vite avec beaucoup d'images/tags. Passer Standard (100 GB).
📐 Réf. — Azure Container Instances (use cases) : ACI pour les jobs ponctuels/batch/build-agents (billing à la seconde, restart policy Never, container groups avec sidecar) est le bon choix vs un orchestrateur permanent. Lien
DEMO — chemins portail#
ACR — créer + push une image#
Portail :
Container registries > Create→ SKU Basic/Standard/Premium, region, name (DNS unique :<name>.azurecr.io)- Optionnel :
Networking(Public/Selected/Private) +Encryption(CMK)
CLI :
# Login
az acr login --name myacr
# Tag + push une image locale
docker tag myapp:v1 myacr.azurecr.io/myapp:v1
docker push myacr.azurecr.io/myapp:v1
# Lister les repos / tags
az acr repository list --name myacr -o table
az acr repository show-tags --name myacr --repository myapp -o table
ACR Tasks — build dans Azure#
# Quick build (sans Docker local)
az acr build --registry myacr --image myapp:v1 .
# Triggered task sur push GitHub
az acr task create --registry myacr --name buildmyapp \
--image myapp:{{.Run.ID}} --context https://github.com/user/repo \
--branch main --git-access-token <PAT> --file Dockerfile
ACI — déployer un container#
Portail :
Container instances > Create→ image (Quickstart, ACR, Docker Hub)- Onglet Networking : Public IP (avec DNS label) ou Private (VNet/subnet)
- Onglet Advanced : restart policy, env vars (avec secrets), volumes (Azure Files)
CLI :
az container create -g myrg --name mycontainer \
--image myacr.azurecr.io/myapp:v1 \
--cpu 1 --memory 1.5 \
--registry-username <user> --registry-password <pwd> \
--dns-name-label mycontainer-prod \
--ports 80
Container Apps — créer + déployer#
Portail :
Container Apps Environment > Create(region, Log Analytics workspace, VNet optionnel)Container App > Createdans cet environment :- Image source : ACR / Docker Hub / quickstart
- Ingress : External (HTTPS public) ou Internal
- Scaling : min replicas, max replicas, rules (HTTP, CPU, custom)
CLI :
# Créer environment
az containerapp env create -g myrg --name myenv -l eastus
# Créer container app avec scale rules
az containerapp create -g myrg --name myapp \
--environment myenv \
--image myacr.azurecr.io/myapp:v1 \
--target-port 80 --ingress external \
--min-replicas 0 --max-replicas 10
AKS — créer un cluster basique#
Portail :
Kubernetes services > Create > Kubernetes cluster- Choisir : tier (Free/Standard), version K8s, node pool system (taille + count)
- Onglet Node pools : ajouter user pool si besoin
- Onglet Auth : Entra ID + RBAC (recommandé)
- Onglet Networking : Azure CNI Overlay, NSG, Application Routing
CLI :
# Créer cluster
az aks create -g myrg -n myaks \
--node-count 2 --enable-managed-identity \
--enable-cluster-autoscaler --min-count 1 --max-count 5 \
--network-plugin azure --network-plugin-mode overlay \
--enable-aad
# Récupérer kubeconfig pour kubectl
az aks get-credentials -g myrg -n myaks
# Tester
kubectl get nodes
kubectl get pods -A
AKS — attacher un ACR#
# Pour que les nodes AKS puissent pull depuis l'ACR sans creds
az aks update -g myrg -n myaks --attach-acr myacr
Containers — administering hosting (à savoir)#
- Logs :
- ACI :
az container logsou Log Analytics workspace - ACA :
az containerapp logs showouLogsblade (KQL) - AKS :
kubectl logs <pod>ou Container Insights (Log Analytics)
- ACI :
- Metrics : Azure Monitor (CPU/RAM/network) pour tous
- Scaling :
- ACI : ❌ pas de scale natif
- ACA : KEDA rules (HTTP, CPU, queue, custom)
- AKS : HPA (pods) + Cluster Autoscaler (nodes)