Del silicio al vapor
"O cuando la computación dejó de ser un lugar" Hubo una época en que podíamos señalar un servidor
Es GitOps, impulsado por el Kubernetes Resource Model (KRM), gestionando todo: desde deployments hasta IAM, DNS, bases de datos SQL gestionadas y reglas de firewall — con una única API, un único modelo y una única fuente de verdad en Git.
Basado en el artículo original publicado por Pierre-Gilles Mialon.
Este artículo es con opinión, y muy marcada. Está forjada a través de la experiencia con despliegues de Kubernetes a gran escala, impulsada por debates con colegas, conversaciones con mantenedores de OSS, cientos de estudiantes de CKA/CKAD entrenados... y más de una que otra caída de servicio (outage). 🙃
En una sesión reciente en KubeCon Paris 2024, los oradores intentaron argumentar que KRM no era un modelo viable para la ingeniería de plataforma.
Pero quizás no entendieron el punto. Con lo que realmente estaban luchando... era con ArgoCD.
GitOps KRM-Native es más que una palabra de moda — es un patrón de arquitectura. Uno que finalmente aporta verdadera simplicidad a la ingeniería de plataforma.
Es GitOps, impulsado por el Kubernetes Resource Model (KRM), gestionando todo: desde deployments hasta IAM, DNS, bases de datos SQL gestionadas y reglas de firewall — con una única API, un único modelo y una única fuente de verdad en Git.
Con herramientas como Config Connector (GCP), Crossplane, ACK (AWS) o la salida KRM de Pulumi, toda tu infraestructura se convierte en un conjunto de recursos de Kubernetes.
🧱 Todo se declara en YAML.
🎯 Todo es declarativo, inmutable, componible — y versionado en Git.
🌍 Por Qué GitOps KRM-Native Es el Futuro
Como ingeniero de plataforma, estás construyendo un sistema para alojar muchas aplicaciones y servicios, posiblemente desarrolladas por docenas de equipos. Quieres:
KRM cumple con todo esto — porque es:
Supongamos que estás desplegando un microservicio que necesita:
Tradicionalmente, esto significaría:
Con GitOps KRM-Native, todo eso va a un único repo de Git, bajo una estructura de carpetas clara, completamente declarativo. La plataforma reconcilia el resto.
Si alguna vez tuviste que rastrear una caída de producción (outage) hasta un permiso de IAM faltante o una regla de firewall olvidada — verás el valor inmediatamente.
Probablemente estás aquí porque has probado GitOps. Quizás ya estás ejecutando ArgoCD en producción. Quizás simplemente lo viste en una demo en una conferencia y pensaste: "¡Wow, esa UI es genial!". Y sí — lo es.
Pero aquí está el giro: esa interfaz brillante viene con equipaje arquitectónico.
Hagámoslo simple:
No es que uno sea mejor en todos los contextos — pero si tu objetivo es GitOps KRM-Native, una de estas herramientas se alinea más profundamente con la filosofía de diseño de Kubernetes. Y no es el que tiene pestañas y gráficos.
Empecemos con RBAC.
kubectl auth can-i y listo.¿Suena conveniente? Lo es — hasta que falla. Pregúntale a cualquiera que haya visto a un desarrollador borrar accidentalmente cargas de trabajo de producción a través de la UI de ArgoCD un viernes por la noche.
Un equipo subió un cambio a ArgoCD, editó algo en vivo a través de la UI web (en contra de las mejores prácticas), y rompió la mitad de la plataforma — con un retraso de 24 horas debido a la reconciliación de drift. ¿Adivina en qué día cayó ese período de 24 horas? Sí, domingo.
El corazón de GitOps es que Git es la fuente de verdad. No un usuario, no un dashboard, no una UI — Git.
¿El riesgo?
Ahora tienes un plano de control mutable, accesible para humanos (y posiblemente sistemas de CI), con permisos amplios y mutación en tiempo real del estado del cluster.
Déjame preguntarte:
Si tu controlador de GitOps tiene un CVE, quieres que esté aislado y de solo lectura, no sentado frente a tu cluster con modo dios habilitado.
Seamos honestos: ArgoCD está ganando corazones con su UI. Se ve genial, funciona bien en demos, y los equipos se sienten productivos.
Pero esa conveniencia tiene un costo:
Mientras tanto, Flux es... bueno, una herramienta principalmente de CLI. Se integra maravillosamente en GitHub Actions, GitLab CI y pipelines. Se ejecuta como controladores nativos de Kubernetes. Emite eventos. Se integra con SOPS, Kustomize, OCI, Helm, multi-tenancy y modelos de operator.
Flux no se ve bien. Flux funciona bien.
🛠️ Tip: ¿Quieres una UI para Flux? Usa Headlamp — es limpia, respeta el RBAC y es componible.
Otra diferencia clave: Flux es event-driven. ArgoCD hace polling.
Esto significa:
¿Resultado? Flux es más rápido, más reactivo y más nativo de Kubernetes.
Recuerda, Kubernetes no se trata de programar cron jobs — se trata de convergencia reactiva.
Gestionar secretos en GitOps es doloroso. Flux abraza esto integrándose con SOPS de forma nativa (out-of-the-box).
¿El enfoque de ArgoCD?
"GitOps no es para secretos." — Literalmente en la documentación
En cambio, ArgoCD pasa el problema a vaults, sincronizaciones externas o herramientas de side-channel. Buena suerte uniendo eso en un modelo de despliegue unificado.
Ah, GitOps. Nos encanta.
Pero recientemente, ha surgido un nuevo sabor de las sombras de KubeCon EU 2025 — algo a la vez familiar y radical: Gitless GitOps.
Vamos a desempacarlo.
En resumen, Gitless GitOps reemplaza los repositorios de Git con artefactos OCI (Open Container Initiative) almacenados en registros de contenedores.
En lugar de sincronizar YAMLs desde Git:
La fuente de verdad ahora es un artefacto firmado e inmutable, no una rama de Git.
Porque Git — con toda su grandeza — tiene algunas desventajas en cadenas de suministro de grado de producción:
Los flujos de trabajo basados en OCI permiten:
Esto hace que Gitless GitOps sea ideal para entornos de alta conformidad: finanzas, salud, defensa.
Con Git, validar que un YAML no fue manipulado es difícil. Con OCI, es criptográficamente verificable.
A diferencia de los servidores de Git, los registros OCI se replican fácilmente entre regiones y zonas.
Esta es una gran ventaja para:
¿Necesitas desplegar el mismo manifest en 50 clusters de edge? La replicación OCI es tu amigo.
En GitOps tradicional:
En Gitless GitOps:
Tu superficie de ataque acaba de reducirse. 🎯
Gitless GitOps elimina la sobrecarga del git pull. No más hacer checkout de repos completos. No más parsear cientos de YAMLs en cada sincronización.
Obtienes un único artefacto, firmado, validado y listo para usar.
Eso hace que Gitless sea rápido. Y en CD, velocidad = seguridad.
Sí... y no.
Todavía:
Pero ya no necesitas acceso directo a Git.
Entonces, ¿sigue siendo "GitOps"?
¿Una razón más por la que FluxCD brilla?
Flux tiene soporte de primera clase para artefactos OCI:
OCIRepository.Kustomization.¿ArgoCD? No tanto. El soporte es experimental, fragmentado y mayormente impulsado por la comunidad.
Si hablas en serio sobre GitOps basado en OCI, Flux está millas por delante.
Los equipos aman ArgoCD... hasta que algo sale mal:
Lo he visto. Probablemente ustedes también.
Si la batalla entre ArgoCD y Flux es sobre filosofía, entonces Helm vs Kustomize es sobre artesanía.
Helm es popular. Extremadamente popular. Da a los equipos la ilusión de velocidad, reusabilidad y estructura. Pero bajo el capó... a menudo es un campo minado basado en plantillas que explota bajo presión.
¿Kustomize? Es más silencioso, más opinionado, y a veces frustrante al principio. Pero una vez que lo dominas, nunca miras atrás.
Vamos a desglosarlo.
Helm es como los frameworks de JavaScript: Lo resuelve todo a la vez — hasta que no lo hace.
--dry-run y --debug mientras rezas? ✔️Sí, Helm te da superpoderes. Pero vienen con un precio alto: complejidad a largo plazo.
if para manejar casos de uso.Y cuando falla, ¿adivina quién recibe el pager a las 2 AM?
Kustomize adopta un enfoque diferente.
En lugar de renderizar plantillas, compone recursos.
Es declarativo de principio a fin.
Esto lo hace un poco más difícil al principio — tienes que entender el modelo, planificar tu estructura, escribir tu base correctamente. ¿Pero una vez que eso está hecho?
Aquí está la clave:
Las plantillas requieren interpretación. Las composiciones son solo configuración.
En escenarios de respuesta a incidentes, la simplicidad salva vidas. Si alguna vez tuviste que solucionar problemas en un Helm chart con cinco condicionales anidados mientras tu SLO arde... sabes a lo que me refiero.
Kustomize reduce la carga cognitiva. Puedes ejecutar kustomize build y ver el estado real.
No hay proyección mental. Lo que ves es lo que Kubernetes obtiene.
Seamos honestos: Helm se usa en todas partes no porque sea bueno — sino porque es fácil de empezar.
La mayoría de las empresas:
Luego el equipo de SRE pasa los siguientes 6 meses intentando refactorizarlo.
🧨 Pregúntate:
He visto docenas de plataformas caídas por la complejidad de los Helm charts.
Seamos honestos: YAML no es la idea de nadie de un formato agradable.
Ahora añade Go templating, lógica sensible a la indentación y anidamiento.
🔁 ¿El resultado? Escribes YAML dentro de strings dentro de Go templates dentro de YAML. ¿Qué podría salir mal?
Kustomize evita todo esto. No es sexy. Pero es limpio.
¿Y no es eso lo que todos queremos cuando estamos solucionando problemas en prod?
Hay un caso de uso legítimo para Helm: cuando el vendor te da un chart y no puedes evitarlo.
A veces está certificado. A veces es la única instalación soportada. A veces está tan fuertemente acoplado que escribir tus propios manifests sería una locura.
Eso está bien.
Pero incluso aquí, Flux vuelve a ganar.
¿Por qué?
HelmRelease y HelmChart.Mientras tanto, ArgoCD... renderiza el chart a través de helm template y aplica la salida.
Así es: Argo en realidad no respeta la API de Helm. La simula.
Aquí hay otro patrón peligroso:
Los equipos usan Helm no solo como un motor de plantillas — sino como un orquestador.
Definen el orden de instalación, dependencias, reintentos, hooks, todo dentro de Helm.
Pero aquí está el problema:
Esta es una receta para drift, duplicación y confusión.
Si necesitas orquestación — orquestación real, inteligente y consciente de dependencias — deberías estar usando operators.
Los operators son ciudadanos de primera clase de Kubernetes. Exponen CRDs. Siguen el patrón controller. Respetan la lógica de convergencia.
¿Y la mejor parte?
Se integran limpiamente con GitOps.
Puedes declarar operator, CRDs en Git, reconciliarlos con Flux, y todo se comporta como debería.
No luches contra el modelo. Abrázalo.
¿Tienes miedo de escribir operators? No lo tengas.
Ni siquiera necesitas Go — a menos que quieras.
Un operator bien construido te permite encapsular la lógica una vez y reutilizarla de forma segura. No más hacks de Helm. No más pegamento de CLI. No más "simplemente vuelve a ejecutar el job."
Si has estado en ingeniería de plataforma por más de cinco minutos, probablemente te has dado cuenta de esto:
Nuestro verdadero trabajo no es escribir código — es eliminar el caos con estructura.
Y hacemos eso pegando herramientas juntas. CI con CD. Git con infra. Secretos con apps. DNS con servicios.
Pero aquí está la trampa: Cuanto más pegamento usas, más frágil se vuelve tu plataforma.
🧠 Regla general:
El mejor pegamento es el que no necesitas.
En una plataforma GitOps robusta, quieres minimizar la superposición de herramientas:
Cada vez que añades "solo una herramienta más" para llenar un vacío — estás introduciendo:
La ingeniería de plataforma no se trata de construir máquinas de Rube Goldberg. Se trata de componer herramientas simples de la forma más simple posible.
Kubernetes usa namespaces. Eso no es opcional — es fundamental.
Malos nombres = mala UX. Y no solo para humanos.
Veamos este comportamiento de DNS:
foo → resuelve foo en el namespace actual.foo.bar → resuelve foo en el namespace bar.Ahora, esto es lo que no debes hacer:
mynamespace-dev-staging-prodnamespace-team1-infra-env8¿Por qué?
Algunos equipos piensan que están ahorrando dinero poniendo dev, staging y prod en el mismo cluster.
No lo están.
En cambio, están pagando con:
Los clusters son baratos. Los ingenieros no. Los incidentes son caros. También lo son las demandas.
Usa clusters separados por entorno.
Quieres:
prod-eu-west1paymentapi-gateway🧭 Entonces tu ruta en Git se convierte en:
clusters/prod-eu-west1/payment/api-gateway/
Y tu KRM se aplica limpiamente:
paymentapi-gatewayclusters/prod-eu-west1/payment/api-gateway🧩 Es sistemático, determinístico, CI-friendly y legible para humanos.
¿La mejor estrategia de GitOps?
Deja que tu estructura de Git defina la estructura de tu cluster.
De esa manera:
¿Quieres que tu CI construya el artefacto correcto, lo suba al cluster correcto y lo aplique en el namespace correcto?
Esto también habilita:
Evita repetirte — especialmente en YAML.
Usa ConfigMaps para definir primitivas base como:
projectIdenvironmentregionsharedVPCdnsZoneDeja que se propaguen a través de overlays.
📌 Decláralo una vez. Refiérelo en todas partes.
De esa manera, ¿cuando tu proyecto de GCP cambia? Actualizas una línea — no 400 archivos YAML.
También es tu boleto dorado para despliegues multi-región. O tu estrategia de Disaster Recovery (DR).
A veces, sin darte cuenta, estás escribiendo tu Plan de Continuidad del Negocio... en YAML. De nada, CIO. 😎
Si tus YAMLs están bien estructurados, con valores base comunes y overlays de entorno:
Esto hace que tu plataforma sea fácil de replicar, fácil de probar y fácil de escalar.
Ya sea que estés desplegando a dev, staging, prod, o eu-west2, es solo cuestión de cambiar variables de contexto.
✨ El contexto lo es todo. Trátalo como oro.
Seamos realistas por un segundo.
🧑💻 A los desarrolladores les encanta la libertad.
🧑🔧 A los operators les encanta la predictibilidad.
Ambos son válidos. Pero cuando eres responsable de ejecutar producción — la precisión lo es todo.
Porque si tu definición no coincide con lo que se está ejecutando en tu cluster...
💥 Ocurre el drift.
Drift es la diferencia entre:
Es el duende invisible que causa:
Drift es la antítesis de GitOps. Y la mayoría de los equipos ni siquiera se dan cuenta de cuánto drift tienen — hasta que es demasiado tarde.
El drift se cuela cuando:
kubectl o una UI.¿El resultado? Tu fuente de verdad ya no es... verdadera.
Hablemos de las herramientas GitOps y su actitud hacia el drift:
| Herramienta | Política de Drift | Tipo de Reconciliación |
|---|---|---|
| Flux | ❌ No se permite drift | Event-driven, sincronización completa |
| Kustomize | ❌ Sin plantillas = Sin drift | Solo declarativo |
| ArgoCD | ✅ Acepta drift | Polling, detección lenta |
| Helm | ✅ Tolera drift | Renderiza plantillas, no hay enforcement |
| Config Sync | ❌ Previene ediciones | Enforzado con admission controller |
Si valoras la confianza en tu sistema, quieres el primer grupo. Si disfrutas persiguiendo fantasmas, ve con el segundo.
Aquí está la cosa:
Para los devs, el fallo suele ser sobre bugs de lógica.
Para los ops, el fallo suele ser sobre desajuste de estado (state mismatch).
Los devs piensan:
Los ops piensan:
Estos no son bugs en el código. Son bugs en la realidad de la infraestructura.
En Ops, la precisión es supervivencia.
Por eso herramientas como Flux y Kustomize importan tanto. Te dan fuertes garantías:
¿Quieres ser aún más estricto?
🛡️ Config Sync de Google incluye un admission controller que:
kubectl apply si no viene de Git.Este es el enfoque sin concesiones para la prevención del drift.
Puede sonar rígido — pero en entornos regulados, es una bendición.
Como dirían los Rolling Stones:
“You can’t always get what you want, But if you try sometimes, you just might find... You get what you need.”
Kustomize + Flux = exactamente eso.
Sin ruido de templating. Sin adivinar. Sin lógica secreta de --dry-run. Solo infraestructura pura, declarativa — que se mantiene declarada.
Eso es lo que necesitas.

"O cuando la computación dejó de ser un lugar" Hubo una época en que podíamos señalar un servidor
El lado "defensivo" de la ciberseguridad es, a menudo, el lado "ofensivo" con una licencia diferente. La misma AI que puede "detectar una vulnerabilidad para parchearla" también puede "detectar una vulnerabilidad para explotarla".