Cloud Delivery sur AKS
Aperçu
Mécanisme de livraison pour Kubernetes/Azure. Met en œuvre la sécurité de déploiement et la passerelle de vérification sur AKS. Conçu pour être spécifique à la pile — cette compétence ne se charge que lorsqu'une tâche implique k8s/AKS, de sorte que les projets sans déploiement cloud (par exemple, Docker Compose local uniquement) ne voient jamais ce contenu.
Règles de livraison
- Le développement local exécute la pile complète via Docker Compose, une commande, complet — une exigence de première classe.
- Les images sont construites en CI → GHCR, identifiées par leur digest de contenu, puis promues inchangées de l'aperçu à la préproduction jusqu'à la production. Jamais reconstruites par environnement.
- Environnements d'aperçu éphémères par PR. Chaque PR déploie dans son propre espace de noms isolé sur AKS pour examen, détruit lors de la fusion/fermeture. Le bac d'intégration ; peu coûteux à créer et à détruire.
- Gating de santé Kubernetes. Chaque charge de travail définit des sondes liveness, readiness et startup (câblées aux points de terminaison dans
observability-and-slos), une stratégie de mise à jour progressive avecmaxUnavailable/maxSurgebornés, et un PodDisruptionBudget. Utilisez un HPA pour la charge. - Livraison progressive vers la production. Canary ou blue-green via Argo Rollouts / Flagger avec analyse métrique automatisée liée aux SLOs ; un canary échoué s'annule automatiquement.
- Le rollback est de première classe et répété. Les images immuables adressées par digest rendent le rollback un redéploiement du digest précédemment bon (
kubectl rollout undo/ annuler le déploiement). Vérifié avant que les modifications risquées ne soient livrées. - Les migrations sont une étape de pipeline séparée et ordonnée, sûre pour l'extension (voir
zero-downtime-migrations), exécutée avant le code qui en dépend — jamais regroupé dans le pod qui a besoin du nouveau schéma. - La CI est la passerelle : lint, vérification de type, vérifications de contrat, tests, scans de sécurité s'exécutent sur chaque modification, et bloquent la fusion en mode
enforced. La CI construit également l'image et publie son attestation de provenance, puis promeut ce digest inchangé. - Parité dev/prod et configuration depuis l'environnement. Secrets depuis Azure Key Vault (via Secrets Store CSI driver ou sealed secrets) — jamais dans les images ou les
.envcommités. Ports/config depuis l'environnement. Les outils de dev uniquement (pgTAP, exécuteurs de tests) ne sont jamais livrés dans les images de production.
Le Pipeline
| Niveau | Déclencheur | Environnement | Digest |
|---|---|---|---|
| aperçu | PR ouverte / synchronisation | ns éphémère preview-<app>-pr-<N> | construit ici, étiqueté sha-<pr-head> |
| staging | fusion sur main | ns persistant staging | re-étiquetage du digest d'aperçu comme sha-<merge> |
| production | publication de version + approbation | ns production | digest du parent du commit de version |
Pourquoi le commit parent. Le commit de version de release-please ne modifie que CHANGELOG.md et le manifeste, donc son arbre n'est jamais celui que staging a fait tremper — tout ce que l'aperçu a construit pour la PR de version elle-même n'a jamais été promu au-delà de l'aperçu. Son parent est la dernière fusion de fonctionnalité, qui est exactement ce que staging a validé, tant que release-please maintient sa branche de version à la pointe de main (son comportement par défaut). Dériver le digest de git plutôt que de l'état du cluster en direct maintient la promotion reproductible.
Sécurité du re-étiquetage. La fusion squash produit un SHA de commit différent et, si main a bougé pendant que la PR était ouverte, un arbre différent. Deux gardes :
- Exiger "branches à jour avant la fusion" — un sous-ensemble de la règle des vérifications de statut requises — de sorte que l'arbre squash soit égal à l'arbre tête de PR par construction. Cette garde nécessite la protection de branche, donc elle n'existe qu'en mode
enforced; un projet en modeadvisorya la comparaison d'arbre ci-dessous comme seule garde, et doit s'attendre à ce que le chemin de reconstruction soit routinier plutôt qu'exceptionnel. - Vérifier plutôt que supposer : comparer
git rev-parse <merge>^{tree}par rapport à l'arbre tête de PR. Égaux → re-étiqueter. Inégaux → reconstruire au SHA de fusion. Ce n'est pas la reconstruction par environnement que les Règles de livraison interdisent : un arbre inégal signifie que le contenu lui-même diffère de ce que l'aperçu a validé, donc il n'y a aucun artefact à promouvoir réutilisable — et l'image reconstruite entre dans staging en tant que nouveau candidat plutôt qu'en tant que promotion. Notez ce qui est abandonné lorsque ce chemin est emprunté : cette image n'a jamais été examinée dans un environnement d'aperçu, donc "l'image livrée est l'image examinée" ne tient pas pour elle. Staging est alors sa première validation, pas sa seconde.
Le re-étiquetage est une opération de pointeur — pas de reconstruction, pas de pull :
docker buildx imagetools create -t "$REPO:sha-$MERGE_SHA" "$REPO@sha256:$DIGEST"
L'attestation reste liée au SHA tête de PR, donc enregistrer le mappage tête→fusion dans l'enregistrement de déploiement ; la configuration de l'image ne peut pas être modifiée sans reconstruction.
La passerelle d'approbation — une propriété, deux mécanismes :
| Mode | Mécanisme |
|---|---|
enforced | Environnement GitHub production avec examinateurs requis |
advisory | Un job workflow_dispatch de promotion ; l'exécuter est la décision |
Référence rapide
| Préoccupation | Mécanisme |
|---|---|
| Secrets | Key Vault → CSI driver ; pivotés ; jamais dans l'image |
| Santé | sondes liveness + readiness + startup ; readiness vérifie les vraies dépendances |
| Déploiement sûr | canary/blue-green, contrôlé par SLO, annulation automatique en cas d'échec |
| Rollback | redéploiement du digest précédemment bon ; répété avant les livraisons risquées |
| Environnement par PR | espace de noms isolé, détruit lors de la fusion |
| Schéma | étape séparée ordonnée, sûre pour l'extension, avant le code |
| Promotion | Re-étiqueter le digest ; jamais reconstruire par environnement |
| Approbation | Examinateurs d'environnement (enforced) ou envoi manuel (advisory) |
Pourquoi c'est isolé : tous les spécificités Azure/k8s vivent ici derrière un déclencheur spécifique à la pile. Un projet local uniquement ou sur un autre cloud substitue sa propre compétence de livraison ; les principes (artefact immuable, déploiement réversible + progressif, migrations découplées) proviennent de resilience-and-deploy-safety.
Raisonnement complet : Article XIX de la constitution, regroupé dans engineering-constitution/references/engineering-constitution.md.