Cloud Delivery en AKS
Resumen
Mecanismo de entrega para Kubernetes/Azure. Implementa seguridad en despliegues y la compuerta de verificación en AKS. Diseñada específica por stack — esta skill solo se carga cuando la tarea involucra k8s/AKS, de modo que los proyectos sin despliegue cloud (por ejemplo, Docker Compose solo local) nunca ven este contenido.
Reglas de Entrega
- El desarrollo local ejecuta el stack completo mediante Docker Compose, un solo comando, integral — un requisito de primera clase.
- Las imágenes se construyen en CI → GHCR, identificadas por su digest de contenido, luego se promocionan sin cambios de preview → staging → producción. Nunca se reconstruyen por entorno.
- Entornos de vista previa efímeros por PR. Cada PR despliega en su propio namespace aislado en AKS para revisión, eliminado al fusionar/cerrar. Banco de pruebas de integración; baratos de crear y destruir.
- Compuerta de salud de Kubernetes. Cada carga de trabajo define probes de liveness, readiness y startup (conectadas a los endpoints en
observability-and-slos), una estrategia de actualización continua conmaxUnavailable/maxSurgeacotados, y un PodDisruptionBudget. Usa un HPA para la carga. - Entrega progresiva a producción. Canary o blue-green mediante Argo Rollouts / Flagger con análisis automático de métricas vinculado a SLOs; un canary fallido se aborta automáticamente.
- Rollback es de primera clase y ensayado. Las imágenes inmutables y direccionadas por digest hacen que un rollback sea redeploy del digest previamente bueno (
kubectl rollout undo/ abortar el rollout). Verificado antes de enviar cambios arriesgados. - Las migraciones son un paso de pipeline separado y ordenado, seguro de expansión (ver
zero-downtime-migrations), ejecutadas antes del código que depende de ellas — nunca empaquetadas en el pod que necesita el nuevo esquema. - CI es la compuerta: lint, typecheck, contratos, pruebas, escaneos de seguridad se ejecutan en cada cambio y bloquean la fusión en modo
enforced. CI también construye la imagen y publica su atestación de procedencia, luego promociona ese digest sin cambios. - Paridad dev/prod y configuración desde el entorno. Secretos desde Azure Key Vault (a través del driver CSI de Secrets Store o sealed secrets) — nunca en imágenes o
.envcommit. Puertos/config desde el entorno. Herramientas solo para dev (pgTAP, runners de pruebas) nunca se envían en imágenes de producción.
El Pipeline
| Nivel | Disparador | Entorno | Digest |
|---|---|---|---|
| preview | PR abierto / sincronizado | ns efímero preview-<app>-pr-<N> | construido aquí, etiquetado sha-<pr-head> |
| staging | fusión a main | ns persistente staging | reetiquetado del digest de preview como sha-<merge> |
| production | release publicado + aprobación | ns production | digest del padre del commit de release |
Por qué el commit padre. El commit de release de release-please solo modifica CHANGELOG.md y el manifest, por lo que su árbol nunca es el que staging absorbió — cualquier cosa que preview construyó para el PR de release en sí nunca fue promocionada más allá de preview. Su padre es la última fusión de funcionalidad, que es exactamente lo que staging ha estado validando, siempre que release-please mantenga su rama de release en la punta de main (su comportamiento por defecto). Derivar el digest de git en lugar del estado del clúster en vivo mantiene la promoción reproducible.
Seguridad del reetiquetado. Squash-merge produce un SHA de commit diferente y, si main se movió mientras el PR estaba abierto, un árbol diferente. Dos salvaguardas:
- Exigir "ramas actualizadas antes de fusionar" — un subconjunto de la regla de comprobaciones de estado requeridas — de modo que el árbol squash sea igual al árbol head del PR por construcción. Esta guarda necesita protección de rama, por lo que solo existe en modo
enforced; un proyecto en modoadvisorytiene la comparación de árbol siguiente como su única guarda, y debe esperar que el camino de reconstrucción sea rutinario en lugar de excepcional. - Verificar en lugar de asumir: comparar
git rev-parse <merge>^{tree}contra el árbol head del PR. Igual → reetiquetar. Desigual → reconstruir en el SHA de fusión. Eso no es la reconstrucción por entorno que las Reglas de Entrega prohíben: un árbol desigual significa que el contenido en sí difiere de lo que preview validó, por lo que no hay artefacto promocionable para reutilizar — y la imagen reconstruida entra en staging como un candidato fresco, no como una promoción. Ten en cuenta lo que se pierde cuando se toma este camino: esa imagen nunca fue revisada en un entorno de vista previa, por lo que "la imagen enviada es la imagen revisada" no se cumple para ella. Staging es entonces su primera validación, no la segunda.
El reetiquetado es una operación de puntero — sin reconstrucción, sin pull:
docker buildx imagetools create -t "$REPO:sha-$MERGE_SHA" "$REPO@sha256:$DIGEST"
La atestación permanece vinculada al SHA head del PR, por lo que registra la asignación head→merge en el registro de despliegue; la configuración de la imagen no se puede editar sin reconstruir.
La compuerta de aprobación — una propiedad, dos mecanismos:
| Modo | Mecanismo |
|---|---|
enforced | Entorno de GitHub production con revisores requeridos |
advisory | Un trabajo workflow_dispatch de promoción; ejecutarlo es la decisión |
Referencia Rápida
| Aspecto | Mecanismo |
|---|---|
| Secretos | Key Vault → driver CSI; rotados; nunca en imagen |
| Salud | probes de liveness + readiness + startup; readiness verifica dependencias reales |
| Despliegue seguro | canary/blue-green, con compuerta de SLO, autoabort en fallo |
| Rollback | redeploy del digest previamente bueno; ensayado antes de envíos arriesgados |
| Entorno por PR | namespace aislado, eliminado al fusionar |
| Esquema | paso ordenado separado, seguro de expansión, antes del código |
| Promoción | Reetiquetar el digest; nunca reconstruir por entorno |
| Aprobación | Revisores de entorno (enforced) o envío manual (advisory) |
Por qué esto está aislado: todos los detalles específicos de Azure/k8s viven aquí detrás de un disparador específico de stack. Un proyecto solo local o de otra nube sustituye su propia skill de entrega; los principios (artefacto inmutable, despliegue reversible y progresivo, migraciones desacopladas) provienen de resilience-and-deploy-safety.
Razonamiento completo: Artículo XIX de la constitución, incluido en engineering-constitution/references/engineering-constitution.md.