Uso de Ingress de Kubernetes en OpenShift: Cómo se Generan las Rutas y Cuándo Usar Cada Una

Uso de Ingress de Kubernetes en OpenShift: Cómo se Generan las Rutas y Cuándo Usar Cada Una

Introducción
OpenShift, la plataforma de Kubernetes de Red Hat, tiene su propia forma de exponer servicios a clientes externos. En Kubernetes estándar, normalmente usarías un recurso de Ingreso junto con un controlador de ingreso para enrutar el tráfico externo a los servicios. Sin embargo, OpenShift introdujo el concepto de un Ruta y un Enrutador integrado (construido sobre HAProxy) desde el principio, antes de que el Ingreso de Kubernetes siquiera existiera. Hoy en día, OpenShift admite tanto Rutas como objetos de Ingreso estándar, lo que a veces puede llevar a confusión sobre cuándo usar cada uno y cómo se relacionan.

Este artículo explora cómo OpenShift maneja los recursos de Ingreso de Kubernetes, cómo se traducen en Rutas, las limitaciones de este enfoque y orientación sobre cuándo usar Ingreso versus Rutas.

Rutas de OpenShift y el Enrutador: Una Visión Rápida


Las Rutas de OpenShift son recursos específicos de OpenShift diseñados para exponer servicios externamente. Son servidas por el Enrutador de OpenShift, que es un proxy basado en HAProxy que se ejecuta dentro del clúster. Las Rutas admiten características avanzadas como:

  • Backends ponderados para división de tráfico
  • Sesiones persistentes (afinidad de sesión)
  • Múltiples modos de terminación TLS (borde, paso a través, re-encriptar)
  • Subdominios comodín
  • Certificados personalizados y SNI
  • Enrutamiento basado en rutas

Debido a que las Rutas son nativas de OpenShift, el Enrutador entiende estas características de manera nativa y puede configurarse en consecuencia. Esta integración estrecha permite capacidades de enrutamiento poderosas y flexibles adaptadas a los entornos de OpenShift.

Uso de Ingreso de Kubernetes en OpenShift (Comportamiento Predeterminado)


A partir de OpenShift Container Platform (OCP) 3.10, se admiten los recursos de Ingreso de Kubernetes. Cuando creas un Ingreso, OpenShift lo traduce automáticamente en una Ruta equivalente detrás de escena. Esto significa que puedes usar manifiestos estándar de Ingreso de Kubernetes, y OpenShift se encargará de exponer tus servicios externamente creando Rutas en consecuencia.

Ejemplo: Ingreso de Kubernetes y Ruta Resultante

Aquí hay un manifiesto de Ingreso simple:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: www.example.com
    http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test-service
            port:
              number: 80

OpenShift creará una Ruta similar a:

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: example-route
spec:
  host: www.example.com
  path: /testpath
  to:
    kind: Service
    name: test-service
    weight: 100
  port:
    targetPort: 80
  tls:
    termination: edge

Esta traducción automática simplifica la migración y admite casos de uso básicos sin requerir manifiestos específicos de Ruta.

Ajuste del Comportamiento con Anotaciones (Ingreso ➝ Ruta)

Cuando usas Ingreso en OpenShift, solo se respetan las anotaciones conscientes de OpenShift durante la traducción de Ingreso ➝ Ruta. Las anotaciones específicas del controlador para otros controladores de ingreso (por ejemplo, nginx.ingress.kubernetes.io/*) son ignoradas por el Enrutador de OpenShift. Las siguientes anotaciones son comúnmente usadas y admitidas por el enrutador de OpenShift para ajustar la Ruta generada:

Propósito Anotación Valores Típicos Efecto en la Ruta Generada
Terminación TLS route.openshift.io/termination edge · reencrypt · passthrough Establece spec.tls.termination de la Ruta al modo elegido.
Redirección HTTP→HTTPS (borde) route.openshift.io/insecureEdgeTerminationPolicy Redirect · Allow · None Controla spec.tls.insecureEdgeTerminationPolicy (comúnmente Redirect).
Balanceo de carga del backend haproxy.router.openshift.io/balance roundrobin · leastconn · source Establece el algoritmo de balanceo de HAProxy para la Ruta.
Timeout por ruta haproxy.router.openshift.io/timeout duración como 60s, 5m Configura el timeout de HAProxy para solicitudes en esa Ruta.
Cabecera HSTS haproxy.router.openshift.io/hsts_header por ejemplo, max-age=31536000;includeSubDomains;preload Inyecta la cabecera HSTS en las respuestas (borde/re-encriptar).

Nota: Las características avanzadas como backends ponderados/canario o hosts comodín no son expresables a través de Ingreso estándar. Usa una Ruta directamente para esos casos.

Ejemplo: Ingreso con anotaciones del enrutador de OpenShift

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress-https
  annotations:
    route.openshift.io/termination: edge
    route.openshift.io/insecureEdgeTerminationPolicy: Redirect
    haproxy.router.openshift.io/balance: leastconn
    haproxy.router.openshift.io/timeout: 60s
    haproxy.router.openshift.io/hsts_header: max-age=31536000;includeSubDomains;preload
spec:
  rules:
  - host: www.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: test-service
            port:
              number: 80

Este Ingreso se realizará como una Ruta con TLS de borde y una redirección automática de HTTP→HTTPS, usando balanceo de menos conexiones y un timeout de ruta de 60s. La cabecera HSTS será añadida por el enrutador en las respuestas HTTPS.

Limitaciones de Usar Ingreso para Generar Rutas
Aunque conveniente, usar Ingreso para generar Rutas tiene limitaciones:

  • Falta de características avanzadas: Los backends ponderados y las sesiones persistentes requieren anotaciones específicas de Ruta y no son compatibles a través de Ingreso.
  • Modos de paso a través y re-encriptar TLS: Estos requieren anotaciones específicas de OpenShift en las Rutas y no son compatibles a través de Ingreso estándar.
  • Ingreso sin host: Un Ingreso sin un nombre de host no creará una Ruta; las Rutas requieren un host.
  • Hosts comodín: Los hosts comodín (por ejemplo, *.example.com) solo son compatibles a través de Rutas, no Ingreso.
  • Compatibilidad de anotaciones: Algunas anotaciones de Ruta de OpenShift no tienen equivalentes en Ingreso, lo que lleva a brechas de configuración.
  • Soporte de protocolo: Ingreso solo admite protocolos HTTP/HTTPS, mientras que las Rutas pueden manejar protocolos no HTTP con TLS de paso a través.
  • Riesgo de deriva de configuración: Debido a que las Rutas creadas a partir de Ingreso son gestionadas por OpenShift, las ediciones manuales a la Ruta generada pueden ser sobrescritas o causar inconsistencias.

Estas limitaciones significan que para configuraciones de enrutamiento avanzadas o características específicas de OpenShift, es preferible usar Rutas directamente.

Cuándo Usar Ingreso vs. Cuándo Usar Rutas
Elegir entre Ingreso y Rutas depende de tus requisitos:

  • Usa Ingreso si:
  • Quieres portabilidad entre plataformas de Kubernetes.
  • Tienes manifiestos de Ingreso existentes y quieres minimizar los cambios.
  • Tu aplicación usa solo enrutamiento básico HTTP o HTTPS.
  • Prefieres manifiestos neutrales a la plataforma para pipelines de CI/CD.
  • Usa Rutas si:
  • Necesitas características avanzadas de enrutamiento como backends ponderados, sesiones persistentes o múltiples modos de terminación TLS.
  • Tu implementación es específica de OpenShift y puede aprovechar las características nativas de OpenShift.
  • Requieres estabilidad y soporte completo para las capacidades de enrutamiento de OpenShift.
  • Necesitas exponer protocolos no HTTP o usar modos de paso a través/re-encriptar TLS.
  • Quieres usar hosts comodín o anotaciones personalizadas no compatibles con Ingreso.

En muchos casos, los equipos usan una combinación: Ingreso para portabilidad y Rutas para necesidades avanzadas o específicas de OpenShift.

Conclusión


En OpenShift, los recursos de Ingreso de Kubernetes se convierten automáticamente en Rutas, permitiendo la exposición básica de servicios externos con un esfuerzo mínimo. Esto permite a los usuarios aprovechar los manifiestos existentes de Kubernetes y mantener la portabilidad. Sin embargo, para escenarios de enrutamiento avanzados y para utilizar completamente las potentes características del Enrutador de OpenShift, se recomienda usar Rutas directamente.

Ambos, Ingreso y Rutas, coexisten sin problemas en OpenShift, permitiéndote elegir la herramienta adecuada para los requisitos de tu aplicación.

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.

Preguntas frecuentes

¿Qué diferencia hay entre una Route de OpenShift y un Ingress de Kubernetes?

Route es la API nativa de OpenShift, anterior a Ingress, para exponer servicios; Ingress es el estándar upstream de Kubernetes. Se solapan funcionalmente, pero las Routes soportan de forma nativa los modos TLS de OpenShift (edge, reencrypt, passthrough), mientras que Ingress es portable a cualquier distribución.

¿OpenShift soporta el Ingress estándar de Kubernetes?

Sí. Al crear un Ingress, el router de OpenShift genera automáticamente las Routes equivalentes, así que los manifiestos upstream funcionan sin cambios. Las Routes generadas pertenecen al Ingress: edita el Ingress, no las Routes.

¿Route o Ingress en OpenShift?

Usa Ingress si tus manifiestos deben ser portables o vienen de Helm charts upstream. Usa Route cuando necesites comportamiento específico de OpenShift (reencrypt, passthrough) o tu plataforma sea OpenShift por política. Mezclar funciona, pero estandarizar en uno mantiene sanos los diffs de GitOps.

¿Cómo funciona el TLS cuando un Ingress genera una Route?

La configuración TLS del Ingress (bloque tls con un Secret de certificado) se traduce en una Route con terminación edge. Para reencrypt o passthrough necesitas Routes directamente o la anotación route.openshift.io/termination en el Ingress.

Talos Linux: Sistema Operativo Inmutable y Seguro para Kubernetes

Talos Linux: Sistema Operativo Inmutable y Seguro para Kubernetes

Introducción

Gestionar un clúster de Kubernetes puede volverse rápidamente abrumador, especialmente cuando tu sistema operativo agrega complejidad innecesaria. Entra Talos Linux: un sistema operativo innovador, optimizado para contenedores e inmutable, diseñado explícitamente para entornos de Kubernetes. Este SO especializado para Kubernetes representa un cambio de paradigma en la gestión de nodos. Es impulsado por API, completamente seguro y elimina los métodos de gestión tradicionales, incluidos SSH y los gestores de paquetes.

Talos Linux revoluciona la gestión de nodos simplificando drásticamente las operaciones y mejorando la seguridad. En este análisis profundo, exploraremos por qué Talos está captando atención, su arquitectura central y las implicaciones prácticas para los equipos de Kubernetes.

¿Qué es Talos Linux? Características del SO inmutable para Kubernetes

Talos Linux es una distribución de Linux de código abierto especializada, meticulosamente diseñada para ejecutar Kubernetes de manera segura y eficiente. A diferencia de los sistemas operativos de propósito general, Talos descarta todas las características irrelevantes y se enfoca exclusivamente en Kubernetes, asegurando:

  • Diseño Inmutable: Los cambios se manejan a través de actualizaciones atómicas en lugar de intervenciones manuales.
  • Gestión Impulsada por API: Los administradores usan talosctl, una CLI que interactúa de manera segura con los nodos a través de una API gRPC.
  • Seguridad por Defecto: Sin acceso SSH, endurecimiento integral del kernel, integración TPM, cifrado de disco y características de arranque seguro.
  • Mínimo y Predecible: Talos minimiza el uso de recursos y reduce la sobrecarga operativa al eliminar servicios y procesos innecesarios.

Mantenedores y Respaldo

Talos es mantenido por Sidero Labs, reconocidos por su experiencia en herramientas de Kubernetes y aprovisionamiento de hardware. La comunidad activa y de código abierto de ingenieros nativos de la nube y SREs contribuye continuamente a su crecimiento y evolución.

Análisis Profundo de la Arquitectura de Talos

Talos Linux emplea un diseño radical que prioriza la seguridad, la simplicidad y el rendimiento:

  • Interacción Solo por API: No hay acceso tradicional a la shell, eliminando muchas vulnerabilidades comunes asociadas con SSH.
  • Actualizaciones Atómicas: Las actualizaciones del sistema son atómicas: las nuevas versiones arrancan directamente en un estado estable y validado.
  • Eficiencia de Recursos: El diseño simplificado de Talos reduce significativamente su huella, asegurando una utilización óptima de recursos y tiempos de inicio más rápidos.
  • Medidas de Seguridad Mejoradas: Incorpora protecciones a nivel de kernel, arranque seguro, cifrado de disco y seguridad basada en TPM, alineándose con requisitos de cumplimiento estrictos.

Distribución de Kubernetes basada en Talos Linux

Sidero Labs también ofrece una distribución completa de Kubernetes construida directamente sobre Talos Linux, conocida como “Talos Kubernetes”. Esta distribución simplificada combina los beneficios de Talos Linux con componentes de Kubernetes preconfigurados, facilitando y acelerando el despliegue de clústeres de Kubernetes altamente seguros y listos para producción. Esto simplifica aún más la gestión de clústeres al reducir la sobrecarga y la complejidad típicamente asociadas con la instalación y el mantenimiento de Kubernetes por separado.

Casos de Uso en el Mundo Real

Talos brilla particularmente bien en escenarios que demandan mayor seguridad, predictibilidad y operaciones simplificadas:

  • Clústeres Conscientes de la Seguridad: Las arquitecturas de confianza cero se benefician enormemente del modelo inmutable y de acceso restringido de Talos.
  • Computación en el Borde e IoT: Su consumo mínimo de recursos y su gestión robusta a través de API lo hacen ideal para implementaciones en el borde, donde la gestión remota es esencial.
  • Pipelines de CI/CD y GitOps: La configuración declarativa, compatible con metodologías YAML y GitOps, permite entornos de Kubernetes automatizados y reproducibles.

Cómo Descargar y Probar Talos Linux

Talos Linux es fácil de probar y evaluar. Puedes descargarlo directamente desde los lanzamientos oficiales de Talos en GitHub. Sidero Labs proporciona documentación completa y guías de inicio rápido para desplegar Talos Linux en varias plataformas, incluidos servidores bare-metal, máquinas virtuales y entornos en la nube como AWS, Azure y GCP. Para una prueba rápida, ejecutarlo dentro de una máquina virtual local o contenedor es una opción conveniente.

Talos Comparado con Opciones de SO Tradicionales

Talos presenta ventajas distintas en comparación con opciones más familiares como Ubuntu, CoreOS o Flatcar:

Característica Talos Ubuntu Flatcar
Acceso SSH ❌ ✅ ✅
Gestor de Paquetes ❌ ✅ (apt) ✅ (rpm)
Nativo de Kubernetes ✅ Incorporado ❌ ✅ (a través de herramientas)
Seguridad por Defecto 🔒 Alta Moderada Alta
SO Inmutable ✅ ❌ ✅
Eficiencia de Recursos ✅ Alta Moderada Alta
Gestión Impulsada por API ✅ ❌ Limitada

Lo que No Puedes Hacer con Talos Linux

El diseño especializado de Talos Linux restringe intencionalmente ciertas funcionalidades tradicionales del sistema operativo. Notablemente:

  • Sin Acceso SSH: El acceso directo a la shell de los nodos está deshabilitado. Todas las interacciones deben ocurrir a través de talosctl.
  • Sin Gestores de Paquetes: Las herramientas tradicionales como apt, yum o similares están ausentes; los cambios se realizan a través de actualizaciones inmutables.
  • Sin Aplicaciones Adicionales: No admite la ejecución de servicios o cargas de trabajo adicionales, no relacionados con Kubernetes, directamente en los nodos de Talos.

Estas restricciones, aunque pueden parecer limitantes, refuerzan las mejores prácticas de seguridad en Kubernetes, mejoran significativamente la postura de seguridad y aseguran un entorno operativo predecible y consistente ideal para implementaciones de producción.

Conclusión

Talos Linux representa un cambio sustancial en la gestión de nodos de Kubernetes: seguro, ligero y completamente enfocado en Kubernetes. Para las organizaciones que priorizan la seguridad, el cumplimiento, la simplicidad operativa y la eficiencia, Talos proporciona una base robusta y preparada para el futuro.

Si tu estrategia de Kubernetes valora el minimalismo, la seguridad y la simplicidad, Talos Linux ofrece razones convincentes para considerar su adopción.

—

Referencias
– Documentación de Talos
– Sidero Labs
– Repositorio de Talos en GitHub

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.

Frequently Asked Questions

¿Puedo usar Talos Linux con cualquier distribución de Kubernetes?

Sí, Talos Linux es compatible con cualquier distribución estándar de Kubernetes, incluyendo Kubernetes vanilla, así como distribuciones como k3s y k0s. Sidero Labs también ofrece Talos Kubernetes, una distribución preconfigurada que combina Talos Linux con componentes de Kubernetes optimizados. La API de Talos (talosctl) gestiona el ciclo de vida del nodo independientemente de la distribución de Kubernetes que ejecutes encima.

¿Cómo soluciono problemas en Talos Linux sin acceso SSH?

Talos Linux proporciona herramientas de diagnóstico a través de su API gRPC y la CLI talosctl. Puedes usar comandos como talosctl logs para ver registros del sistema, talosctl dashboard para métricas en tiempo real, y talosctl support para generar bundles de diagnóstico. Para depuración avanzada, Talos soporta contenedores efímeros de Kubernetes que pueden ejecutarse temporalmente en el nodo para tareas de troubleshooting.

¿Es Talos Linux adecuado para entornos de desarrollo local?

Talos Linux es óptimo para producción pero puede usarse en desarrollo. Para entornos locales, considera usar Talos en máquinas virtuales o mediante Docker/Podman para pruebas. Sin embargo, para desarrollo rápido, distribuciones como Minikube o Kind con SO tradicionales pueden ser más convenientes. Talos brilla en entornos que requieren consistencia entre desarrollo, staging y producción.

¿Qué ventajas tiene Talos Linux sobre Ubuntu para Kubernetes?

Talos Linux ofrece: 1) Seguridad por defecto (sin SSH, arranque seguro, TPM), 2) Inmutabilidad (actualizaciones atómicas y rollback), 3) Minimalismo (menor superficie de ataque y uso de recursos), y 4) Gestión declarativa (API-driven vs. manual). Ubuntu es más flexible pero requiere hardening manual y tiene mayor complejidad operativa para cargas de trabajo Kubernetes puras.

¿Cómo maneja Talos Linux el almacenamiento persistente?

Talos Linux soporta volúmenes persistentes de Kubernetes estándar. Para almacenamiento local, configura Local Persistent Volumes o integra con soluciones como Ceph, Longhorn, o proveedores cloud. El sistema de archivos raíz es inmutable y de solo lectura; el almacenamiento de aplicaciones se gestiona exclusivamente a través de Kubernetes, no directamente en el SO.

XSLTPlayground.com: la herramienta moderna para probar, optimizar y depurar XSLT en tiempo real

XSLTPlayground.com: la herramienta moderna para probar, optimizar y depurar XSLT en tiempo real

Trabajar con XSLT en flujos de datos modernos y sistemas impulsados por XML siempre ha sido poderoso… pero no siempre fácil. Las herramientas a menudo son pesadas, obsoletas o requieren configuración local y entornos complejos. Por eso estoy emocionado de anunciar el lanzamiento de XSLTPlayground.com, un editor de XSLT gratuito, de código abierto, basado en el navegador y diseñado específicamente para casos de uso del mundo real.

✅ Sin instalaciones. Sin complejidad. Solo abre tu navegador y transforma.

🚀 ¿Por qué XSLT Playground?

🔁 Transformaciones XSLT en Tiempo Real para Escenarios del Mundo Real

A diferencia de las herramientas heredadas o las demostraciones web limitadas, XSLT Playground admite transformaciones complejas que involucran múltiples fuentes XML, plantillas parametrizadas y retroalimentación real. Ya sea que trabajes en integración de datos, puertas de enlace API, informes basados en XML o actualizaciones de sistemas heredados, esta herramienta te ayuda a probar e iterar rápidamente.

🧩 Soporte de Parámetros de Entrada Múltiple

Uno de los mayores puntos de dolor en las pruebas de XSLT es simular entornos reales. Con XSLTPlayground.com, puedes definir múltiples fuentes de entrada (por ejemplo, flujos de datos, configuración o metadatos) y pasarlos a tu XSLT de manera sincronizada, tal como en un flujo de datos de producción.

⚙️ Sincronización Automática de Parámetros

Cuando cargas una hoja de estilo con parámetros requeridos, el Playground los detecta automáticamente y crea campos de entrada para ti en el lateral. Todo lo que necesitas hacer es completar los valores. Esta función inteligente elimina las conjeturas y ayuda a evitar errores en tiempo de ejecución.

⚡ Información sobre Rendimiento y Optimización

¿Necesitas saber si tu optimización está funcionando? Mostramos el tiempo de ejecución para cada transformación, ayudándote a comparar versiones y elegir el enfoque más rápido, todo sin desplegar sistemas completos o instrumentar código. Aunque no es una herramienta de evaluación comparativa, la retroalimentación es invaluable para ajustes en tiempo real.

🌐 100% Gratis, Basado en la Web y de Código Abierto

No necesitas instalar herramientas voluminosas como Oxygen XML o ejecutar complementos de Eclipse solo para probar una hoja de estilo. XSLTPlayground.com es completamente basado en la web, gratuito y construido para ser abierto y extensible. ¿Quieres contribuir o alojar tu propia versión? El código fuente está en GitHub.

🖱️ Soporte de Arrastrar y Soltar

Sube tus archivos XML o XSLT simplemente arrastrándolos al navegador. Todos los componentes — entradas, hojas de estilo, salidas — admiten arrastrar y soltar para una iteración más rápida.

🎨 Opciones de Impresión Bonita y Exportación

Tu salida se imprime automáticamente de manera bonita para facilitar la lectura, y con solo un clic puedes descargar tu XSLT y el resultado de la transformación, lo que facilita compartir, archivar o importar en proyectos más grandes.

🔗 Pruébalo ahora: https://xsltplayground.com

Ya seas un desarrollador, ingeniero de datos o trabajes con sistemas heredados, esta es la herramienta que has estado esperando. Di adiós a la complejidad de configurar pruebas de XSLT y di hola a las transformaciones instantáneas, en cualquier lugar y en cualquier momento.

¿Quieres contribuir o seguir el desarrollo? Dale una estrella al proyecto en GitHub o envía comentarios directamente desde el sitio.

Helm v3.17 y el flag –take-ownership: qué problema resuelve y cuándo deberías usarlo

Helm v3.17 y el flag --take-ownership: qué problema resuelve y cuándo deberías usarlo

Helm ha sido durante mucho tiempo el estándar para gestionar aplicaciones de Kubernetes utilizando gráficos empaquetados, aportando un nivel de reproducibilidad y automatización al proceso de implementación. Sin embargo, algunas tareas operativas, como renombrar una versión o migrar objetos entre gráficos, tradicionalmente han requerido soluciones complicadas. Con la introducción del flag --take-ownership en Helm v3.17 (lanzado en enero de 2025), finalmente se aborda un punto de dolor de larga data, al menos parcialmente.

En esta publicación, exploraremos:

  • Qué hace el flag --take-ownership
  • Por qué era necesario
  • Las advertencias y limitaciones
  • Casos de uso del mundo real donde ayuda
  • Cuándo no usarlo

Entendiendo la Propiedad de Objetos en Helm

Cuando Helm instala o actualiza un gráfico, inyecta metadatos—etiquetas y anotaciones—en cada objeto de Kubernetes gestionado. Estos incluyen:

app.kubernetes.io/managed-by: Helm
meta.helm.sh/release-name: my-release
meta.helm.sh/release-namespace: default

Estos metadatos cumplen un papel importante: Helm los utiliza para rastrear y gestionar recursos asociados con cada versión. Como medida de seguridad, Helm no permite que otra versión modifique objetos que no posee y cuando intentas hacerlo verás mensajes como el siguiente:

Error: Unable to continue with install: Service "provisioner-agent" in namespace "test-my-ns" exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error: key "meta.helm.sh/release-name" must equal "dp-core-infrastructure11": current value is "dp-core-infrastructure"

Si bien esto protege a los usuarios de sobrescrituras accidentales, crea limitaciones para casos de uso avanzados.

Por Qué Se Necesitaba --take-ownership

Supongamos que quieres:

  • Renombrar una versión existente de Helm de api-v1 a api.
  • Mover un ConfigMap o Service de un gráfico a otro.
  • Reconstruir el estado durante la reconciliación de GitOps cuando los metadatos anteriores de Helm se han desviado.

Anteriormente, tu única opción era:

  1. Desinstalar la versión existente.
  2. Reinstalar con el nuevo nombre.

Este enfoque introduce tiempo de inactividad, y en sistemas de producción, eso a menudo no es aceptable.

Qué Hace el Flag

helm upgrade my-release ./my-chart --take-ownership

Cuando se pasa este flag, Helm:

  • Omitirá la validación de propiedad para objetos existentes.
  • Sobrescribirá las etiquetas y anotaciones para asociar el objeto con la versión actual.

En la práctica, esto te permite reclamar la propiedad de recursos que anteriormente pertenecían a otra versión, permitiendo transferencias sin problemas.

⚠️ Lo Que No Hace

Este flag no:

  • Limpia referencias de la versión anterior.
  • Te protege de futuras desinstalaciones de la versión original (que aún podrían eliminar recursos compartidos).
  • Te permite adoptar recursos de Kubernetes completamente no gestionados (aquellos no creados inicialmente por Helm).

En resumen, es un mecanismo para eludir las verificaciones de propiedad de Helm, no un gestor de ciclo de vida completo.

Casos de Uso del Mundo Real

Veamos escenarios comunes donde esta característica es útil.

✅ 1. Renombrar una Versión Sin Tiempo de Inactividad

Antes:

helm uninstall old-name
helm install new-name ./chart

Ahora:

helm upgrade new-name ./chart --take-ownership

✅ 2. Migrar Objetos Entre Gráficos

Estás refactorizando un gráfico grande en otros más pequeños y modulares y necesitas reasignar ciertos objetos Service o Secret.

Este flag permite que la nueva versión tome control del objeto sin eliminarlo o recrearlo.

✅ 3. Reconciliación de Desviaciones en GitOps

Si los objetos fueron desplegados fuera de banda o sus metadatos cambiaron sin intención, las herramientas de GitOps que usan Helm pueden recuperarse sin intervención manual usando --take-ownership.

Mejores Prácticas y Recomendaciones

  • Usa este flag intencionalmente, y documenta dónde se aplica.
  • Si es posible, elimina la versión anterior después de la migración para evitar confusiones.
  • Monitorea de cerca el comportamiento de Helm al gestionar objetos compartidos.
  • Para recursos no gestionados por Helm, continúa usando kubectl annotate o kubectl label para alinear manualmente los metadatos.

Conclusión

El flag --take-ownership es una adición bienvenida al arsenal de la CLI de Helm. Aunque no es una solución universal, suaviza muchas de las asperezas que enfrentan los desarrolladores y SREs durante la evolución de versiones y la adopción de GitOps.

Aporta una mejora sutil pero poderosa, especialmente en entornos complejos donde la propiedad de los recursos no es estática.

Mantente actualizado con las versiones de Helm, y considera este flag como tu nuevo aliado en la ingeniería avanzada de versiones.

Kyverno en Kubernetes: aplicar políticas estándar y personalizadas paso a paso (vs PSA)

Kyverno en Kubernetes: aplicar políticas estándar y personalizadas paso a paso (vs PSA)

En el ecosistema de Kubernetes, la seguridad y la gobernanza son aspectos clave que requieren atención continua. Aunque Kubernetes ofrece algunas características de seguridad listas para usar (OOTB) como la Admisión de Seguridad de Pods (PSA), estas pueden no ser suficientes para entornos complejos con requisitos de cumplimiento variables. Aquí es donde Kyverno entra en juego, proporcionando una solución poderosa pero flexible para gestionar y hacer cumplir políticas en todo tu clúster.

En esta publicación, exploraremos las diferencias clave entre Kyverno y PSA, explicaremos cómo se puede usar Kyverno en diferentes casos de uso y te mostraremos cómo instalar y desplegar políticas con él. Aunque la creación de políticas personalizadas se cubrirá en una publicación separada, haremos referencia a algunas políticas preconstruidas que puedes usar de inmediato.

¿Qué es Kyverno?

Kyverno es un motor de políticas para Kubernetes que permite validar, mutar y generar recursos del clúster con políticas escritas en YAML plano — sin aprender ningún lenguaje nuevo. Funciona como admission controller: cuando alguien aplica un recurso, Kyverno intercepta la petición y la permite, la rechaza, la corrige al vuelo o crea recursos adicionales, según las reglas que hayas definido.

Usos típicos: exigir que todo pod declare límites de recursos, bloquear imágenes de registries no confiables, requerir etiquetas en los namespaces, inyectar automáticamente una NetworkPolicy en cada namespace nuevo, o verificar firmas de imágenes antes de admitir un workload. La versión actual es Kyverno v1.18.2 (julio de 2026).

Kyverno vs OPA Gatekeeper: ¿qué motor de políticas elegir?

La versión corta: elige Kyverno si tus políticas son solo de Kubernetes y las quieres en YAML; elige OPA Gatekeeper si necesitas máxima expresividad o reutilizar el mismo lenguaje de políticas fuera de Kubernetes. Tras años de convergencia, la decisión rara vez es de capacidades.

KyvernoOPA Gatekeeper
LenguajeYAML (y CEL); nada nuevo que aprenderRego, vía ConstraintTemplates
Curva de aprendizajeBajaAlta — Rego es un lenguaje real
Validar✅✅ su punto más fuerte
Mutar✅ nativo✅ añadido después, fuera de Rego
Generar recursos✅ nativo❌
ÁmbitoSolo KubernetesKubernetes + APIs, microservicios, Terraform
Madurez CNCFGraduatedGraduated (parte de OPA)
Versión actualv1.18.2 (jul 2026)v3.23.0 (jul 2026)

Hay una tercera opción que no existía al inicio de este debate: ValidatingAdmissionPolicy con CEL, nativa de Kubernetes y sin componentes extra. Si la regla se puede expresar en CEL, es la primera a considerar; pero CEL no puede hacer llamadas externas ni mantener estado, así que la verificación de firmas, los lookups entre recursos, la mutación y la generación siguen siendo territorio de Kyverno o Gatekeeper. Kyverno es un proyecto CNCF Graduated creado por Nirmata, con soporte comercial disponible de varios proveedores; el proyecto open source es Apache-2.0 sin funcionalidad recortada.

¿Qué es la Admisión de Seguridad de Pods (PSA)?

Kubernetes introdujo Admisión de Seguridad de Pods (PSA) como un reemplazo para la ahora obsoleta Política de Seguridad de Pods (PSP). PSA se centra en hacer cumplir tres niveles de seguridad predefinidos: Privilegiado, Básico y Restringido. Estos niveles controlan qué pods pueden ejecutarse en un espacio de nombres según sus configuraciones de contexto de seguridad.

  • Privilegiado: Restricciones mínimas, permitiendo contenedores privilegiados y acceso al host.
  • Básico: Aplica restricciones estándar, no permitiendo contenedores privilegiados y limitando el acceso al host.
  • Restringido: El nivel más estricto, asegurando configuraciones seguras por defecto y aplicando las mejores prácticas para ejecutar contenedores.

Si bien PSA es efectivo para requisitos de seguridad básicos, carece de flexibilidad al aplicar políticas personalizadas o de grano fino. Tenemos un artículo completo que cubre este tema que puedes leer aquí.

Kyverno vs. PSA: Diferencias Clave

Kyverno va más allá de las capacidades de PSA al ofrecer un control más granular y flexibilidad. Así es como se compara:

  1. Tipos de Políticas: Mientras que PSA se centra únicamente en la seguridad, Kyverno permite la creación de políticas para validación, mutación y generación de recursos. Esto significa que puedes modificar o generar nuevos recursos, no solo aplicar reglas de seguridad.
  2. Personalización: Kyverno admite políticas personalizadas que pueden hacer cumplir los requisitos de cumplimiento de tu organización. Puedes escribir políticas que gobiernen tipos de recursos específicos, como asegurar que todos los despliegues tengan ciertas etiquetas o que las imágenes de los contenedores provengan de un registro de confianza.
  3. Política como Código: Las políticas de Kyverno están escritas en YAML, lo que permite una fácil integración con pipelines de CI/CD y flujos de trabajo de GitOps. Esto hace que la gestión de políticas sea declarativa y controlada por versiones, lo cual no es el caso con PSA.
  4. Auditoría e Informes: Con Kyverno, puedes generar registros de auditoría detallados e informes sobre violaciones de políticas, dando a los administradores una visión clara de cómo se aplican las políticas y dónde ocurren las violaciones. PSA carece de esta capacidad de informes integrada.
  5. Aplicación y Mutación: Mientras que PSA principalmente aplica restricciones en los pods, Kyverno permite no solo la validación de configuraciones sino también la modificación de recursos (mutación) cuando sea necesario. Esto añade una capa adicional de flexibilidad, como agregar automáticamente anotaciones o etiquetas.

Cuándo Usar Kyverno en Lugar de PSA

Si bien PSA podría ser suficiente para entornos más simples, Kyverno se convierte en una herramienta valiosa en escenarios que requieren:

  • Reglas de Cumplimiento Personalizadas: Por ejemplo, hacer cumplir que todos los contenedores usen una imagen base específica o restringir capacidades específicas de contenedores en diferentes entornos.
  • Integraciones CI/CD: Kyverno puede integrarse en tus pipelines de CI/CD, asegurando que los recursos cumplan con las políticas organizacionales antes de ser desplegados.
  • Gobernanza Compleja: Al gestionar grandes clústeres con múltiples equipos, la jerarquía de políticas y el alcance de Kyverno permiten un control más fino sobre quién puede desplegar qué y cómo se configuran los recursos.

Si tu organización necesita una solución de seguridad más robusta y flexible, Kyverno es una mejor opción en comparación con el enfoque más genérico de PSA.

Instalando Kyverno

Para comenzar a usar Kyverno, necesitarás instalarlo en tu clúster de Kubernetes. Este es un proceso sencillo usando Helm, lo que facilita su gestión y actualización.

Instalación Paso a Paso

Agrega el repositorio Helm de Kyverno:

helm repo add kyverno https://kyverno.github.io/kyverno/

Actualiza los repositorios de Helm:

helm repo update

Instala Kyverno en tu clúster de Kubernetes:

helm install kyverno kyverno/kyverno --namespace kyverno --create-namespace

Verifica la instalación:

kubectl get pods -n kyverno

Después de la instalación, Kyverno comenzará a aplicar políticas en todo tu clúster, pero necesitarás desplegar algunas políticas para comenzar.

Instalar la CLI de Kyverno

Además del controller en el clúster, Kyverno tiene una CLI para probar políticas antes de que lleguen a producción — es lo que convierte las políticas en algo revisable en una pull request:

# macOS / Linux (Homebrew)
brew install kyverno

# Como plugin de kubectl (Krew)
kubectl krew install kyverno

# Probar una política contra manifiestos, sin clúster
kyverno apply ./policies/ --resource ./manifests/

# Ejecutar la suite de tests declarativos
kyverno test ./policies/

Antes de escribir nada propio, revisa la biblioteca oficial de políticas: cientos de políticas listas por categoría (Pod Security Standards, buenas prácticas, multi-tenancy, verificación de imágenes). El punto de partida realista es adoptar el set de PSS en modo audit, ver qué incumple ya tu clúster, y solo entonces escribir reglas propias. La integración en CI está cubierta paso a paso en integrar Kyverno CLI en pipelines CI/CD con GitHub Actions.

Desplegando Políticas con Kyverno

Las políticas de Kyverno están escritas en YAML, al igual que los recursos de Kubernetes, lo que las hace fáciles de leer y gestionar. Puedes encontrar varias políticas listas para usar en la Biblioteca de Políticas de Kyverno, o crear las tuyas propias para que se ajusten a tus requisitos.

A continuación, un ejemplo de una política de validación simple que asegura que todos los pods usen imágenes de contenedores de confianza de un registro específico:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-trusted-registry
spec:
  validationFailureAction: enforce
  rules:
  - name: check-registry
    match:
      resources:
        kinds:
        - Pod
    validate:
      message: "Solo se permiten imágenes de 'myregistry.com'."
      pattern:
        spec:
          containers:
          - image: "myregistry.com/*"

Esta política bloqueará automáticamente el despliegue de cualquier pod que use una imagen de un registro diferente a myregistry.com.

Aplicando la Política

Para aplicar la política anterior, guárdala en un archivo YAML (por ejemplo, trusted-registry-policy.yaml) y ejecuta el siguiente comando:

kubectl apply -f trusted-registry-policy.yaml

Una vez aplicada, Kyverno hará cumplir esta política en todo tu clúster.

Visualizando Informes de Políticas de Kyverno

Kyverno genera informes detallados sobre violaciones de políticas, que son útiles para auditorías y seguimiento del cumplimiento de políticas. Para verificar los informes, puedes usar los siguientes comandos:

Lista todos los informes de políticas de Kyverno:

kubectl get clusterpolicyreport

Describe un informe de política específico para obtener más detalles:

kubectl describe clusterpolicyreport <report-name>

Estos informes pueden integrarse en tus herramientas de monitoreo para activar alertas cuando ocurran violaciones críticas.

Preguntas frecuentes

¿Para qué sirve Kyverno?

Kyverno es un motor de políticas de Kubernetes que valida, muta y genera recursos del clúster. Usos típicos: exigir límites de recursos en los pods, bloquear imágenes de registries no confiables, requerir etiquetas en namespaces, generar automáticamente NetworkPolicies o ConfigMaps en namespaces nuevos, y verificar firmas de imágenes antes de admitir un workload. Las políticas se escriben en YAML y se aplican como objetos de Kubernetes.

¿Kyverno u OPA Gatekeeper?

Usa Kyverno si tus políticas solo apuntan a Kubernetes y las quieres en YAML sin aprender un lenguaje nuevo — además muta y genera recursos de forma nativa. Usa OPA Gatekeeper si necesitas lógica muy expresiva o reutilizar las mismas políticas Rego fuera de Kubernetes. Ambos son CNCF Graduated y han convergido en capacidades para el caso de admisión.

¿Kyverno es gratis? ¿Qué empresa está detrás?

El proyecto es open source bajo Apache-2.0 y es CNCF Graduated, así que no lo controla un único vendor. Lo creó Nirmata, que sigue siendo el mayor contribuidor y ofrece soporte comercial y LTS; también dan soporte comercial Giant Swarm, InfraCloud, BlakYaks y Kodekloud.

¿Sigo necesitando Kyverno con ValidatingAdmissionPolicy?

Para reglas simples, a menudo no: ValidatingAdmissionPolicy con CEL viene integrada en Kubernetes y no necesita componentes extra. Pero CEL no puede hacer llamadas externas ni mantener estado, y solo valida. La verificación de firmas, los lookups entre recursos, la mutación y la generación siguen requiriendo Kyverno o Gatekeeper. Muchos clústeres usan ambas.

¿Qué diferencia hay entre Kyverno y Pod Security Admission?

PSA viene integrada en Kubernetes y aplica los tres perfiles fijos de Pod Security Standards a nivel de namespace; es simple pero no extensible. Kyverno es un motor general: puede reproducir los perfiles PSS y además añadir reglas propias, mutación y generación, sobre cualquier tipo de recurso, no solo pods.

Conclusión

Kyverno ofrece una forma flexible y poderosa de hacer cumplir políticas en Kubernetes, convirtiéndose en una herramienta esencial para organizaciones que necesitan más que las capacidades básicas proporcionadas por PSA. Ya sea que necesites asegurar el cumplimiento con estándares de seguridad internos, automatizar modificaciones de recursos o integrar políticas en pipelines de CI/CD, el extenso conjunto de características de Kyverno lo convierte en una opción preferida para la gobernanza de Kubernetes.

Por ahora, comienza con las políticas listas para usar disponibles en la biblioteca de Kyverno. En publicaciones futuras, profundizaremos en la creación de políticas personalizadas adaptadas a tus necesidades específicas.

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.

Admisión de Seguridad de Pods (PSA) en Kubernetes: qué es, cómo funciona y sus limitaciones

Admisión de Seguridad de Pods (PSA) en Kubernetes: qué es, cómo funciona y sus limitaciones

En Kubernetes, la seguridad es una preocupación clave, especialmente a medida que los contenedores y los microservicios crecen en complejidad. Una de las características esenciales de Kubernetes para la aplicación de políticas es Pod Security Admission (PSA), que reemplaza las obsoletas Pod Security Policies (PSP). PSA proporciona un enfoque más sencillo y flexible para aplicar políticas de seguridad, ayudando a los administradores a proteger los clústeres asegurándose de que solo se ejecuten pods compatibles.

Este artículo te guiará a través de PSA, los Estándares de Seguridad de Pods disponibles, cómo configurarlos y cómo aplicar políticas de seguridad a espacios de nombres específicos usando etiquetas.

¿Qué es Pod Security Admission (PSA)?

PSA es un controlador de admisión incorporado introducido en Kubernetes 1.23 para reemplazar las Políticas de Seguridad de Pods (PSP). Las PSP tenían una curva de aprendizaje pronunciada y podían volverse engorrosas al escalar políticas de seguridad en varios entornos. PSA simplifica este proceso aplicando los Estándares de Seguridad de Pods de Kubernetes basados en niveles de seguridad predefinidos sin necesidad de lógica personalizada para cada política.

Con PSA, los administradores de clústeres pueden restringir los permisos de los pods utilizando etiquetas que corresponden a Estándares de Seguridad de Pods específicos. PSA opera a nivel de espacio de nombres, permitiendo una mejor granularidad en el control de políticas de seguridad para diferentes cargas de trabajo.

Estándares de Seguridad de Pods

Kubernetes proporciona tres Estándares de Seguridad de Pods clave en el marco de PSA:

  • Privilegiado: Sin restricciones; permite todas las características y es el modo menos restrictivo. No se recomienda para cargas de trabajo de producción, pero puede usarse en entornos controlados o para cargas de trabajo que requieren permisos elevados.
  • Básico: Proporciona un buen equilibrio entre usabilidad y seguridad, restringiendo los aspectos más peligrosos de los privilegios de los pods mientras permite configuraciones comunes. Es adecuado para la mayoría de las aplicaciones que no necesitan permisos especiales.
  • Restringido: El nivel más estricto de seguridad. Este nivel está destinado a cargas de trabajo que requieren el más alto nivel de aislamiento y control, como clústeres multi-tenant o cargas de trabajo expuestas a internet.

Cada estándar incluye reglas específicas para limitar los privilegios de los pods, como prohibir contenedores privilegiados, restringir el acceso a la red del host y prevenir cambios en ciertos contextos de seguridad.

Configuración de Pod Security Admission (PSA)

Para habilitar PSA, necesitas etiquetar tus espacios de nombres según el nivel de seguridad que deseas aplicar. El formato de la etiqueta es el siguiente:

kubectl label --overwrite ns  pod-security.kubernetes.io/enforce=<value>

Por ejemplo, para aplicar una política de seguridad restringida en el espacio de nombres producción, ejecutarías:

kubectl label --overwrite ns production pod-security.kubernetes.io/enforce=restricted

En este ejemplo, Kubernetes aplicará automáticamente las reglas asociadas con la política restringida a todos los pods desplegados en el espacio de nombres producción.

Modos Adicionales de PSA

PSA también proporciona modos adicionales para un mayor control:

  • Auditar: Registra una violación de política pero permite que el pod se cree.
  • Advertir: Emite una advertencia pero permite la creación del pod.
  • Aplicar: Bloquea la creación del pod si viola la política.

Para configurar estos modos, utiliza las siguientes etiquetas:

kubectl label --overwrite ns      pod-security.kubernetes.io/enforce=baseline     pod-security.kubernetes.io/audit=restricted     pod-security.kubernetes.io/warn=baseline

Esta configuración aplica el estándar básico mientras emite advertencias y registra violaciones para las reglas de nivel restringido.

Ejemplo: Configuración de Seguridad de Pods en un Espacio de Nombres

Veamos un ejemplo de cómo configurar la seguridad básica para el espacio de nombres dev. Primero, necesitas aplicar las etiquetas de PSA:

kubectl create namespace dev
kubectl label --overwrite ns dev pod-security.kubernetes.io/enforce=baseline

Ahora, cualquier pod desplegado en el espacio de nombres dev será verificado contra el estándar de seguridad básico. Si un pod viola la política básica (por ejemplo, al intentar ejecutar un contenedor privilegiado), se bloqueará su inicio.

También puedes combinar los modos advertir y auditar para rastrear violaciones sin bloquear pods:

kubectl label --overwrite ns dev     pod-security.kubernetes.io/enforce=baseline     pod-security.kubernetes.io/warn=restricted     pod-security.kubernetes.io/audit=privileged

En este caso, PSA permitirá que los pods se ejecuten si cumplen con la política básica, pero emitirá advertencias por violaciones de nivel restringido y registrará cualquier violación de nivel privilegiado.

Aplicación de Políticas por Defecto

Una de las fortalezas de PSA es su simplicidad para aplicar políticas a nivel de espacio de nombres, pero los administradores podrían preguntarse si hay una forma de aplicar una política por defecto en nuevos espacios de nombres automáticamente. Hasta ahora, Kubernetes no proporciona de forma nativa una opción para aplicar políticas de PSA globalmente por defecto. Sin embargo, puedes usar webhooks de admisión o herramientas de automatización como OPA Gatekeeper o Kyverno para aplicar políticas por defecto para nuevos espacios de nombres.

Conclusión

Pod Security Admission (PSA) simplifica la aplicación de políticas en clústeres de Kubernetes, facilitando el cumplimiento de los estándares de seguridad en diferentes entornos. Al configurar los Estándares de Seguridad de Pods a nivel de espacio de nombres y usar etiquetas, los administradores pueden controlar el nivel de seguridad de las cargas de trabajo con facilidad. La flexibilidad de PSA permite una gestión eficiente de la seguridad sin la complejidad asociada con las antiguas Políticas de Seguridad de Pods (PSP).

Para más detalles sobre la configuración de PSA y los Estándares de Seguridad de Pods, consulta la documentación oficial de PSA de Kubernetes y la documentación de Estándares de Seguridad de Pods.

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.

Comprendiendo los Hooks de Helm: Una Guía para Usar Hooks en tus Charts de Helm

Comprendiendo los Hooks de Helm: Una Guía para Usar Hooks en tus Charts de Helm

Helm, el gestor de paquetes para Kubernetes, es una herramienta poderosa para gestionar aplicaciones complejas de Kubernetes. Una de sus características avanzadas son los hooks de Helm. Los hooks te permiten intervenir en diferentes puntos de una operación de Helm, como antes o después de una instalación, actualización o eliminación. En este artículo, profundizaremos en los hooks disponibles, exploraremos cómo definirlos en tus charts de Helm y proporcionaremos casos de uso para cada uno.

¿Qué son los Hooks de Helm?

Los hooks de Helm son anotaciones especiales que se pueden agregar a los recursos en un chart de Helm. Estos hooks desencadenan acciones específicas durante el ciclo de vida de la liberación de un chart de Helm. Permiten a los desarrolladores realizar tareas como configurar requisitos previos, limpiar después de una operación o validar un despliegue.

Hooks de Helm Disponibles y Casos de Uso

Helm proporciona varios hooks que se pueden usar en diferentes etapas de una operación de Helm. Aquí hay un desglose de los hooks disponibles:

1. pre-install

Momento de Ejecución: Después de que las plantillas se renderizan pero antes de que se creen recursos en Kubernetes.
Casos de Uso: Imagina que necesitas crear un ConfigMap o secreto del que depende tu aplicación pero que no forma parte del chart principal. El hook pre-install puede crear este recurso antes de que se despliegue el resto del chart.

apiVersion: v1
kind: Job
metadata:
  name: setup-config
  annotations:
"helm.sh/hook": pre-install
spec:
  template:
spec:
  containers:
    - name: config-creator
      image: busybox
      command: ['sh', '-c', 'echo "config data" > /config/config.txt']

2. post-install

Momento de Ejecución: Después de que todos los recursos se crean en Kubernetes.
Casos de Uso: Si tu aplicación requiere que se carguen algunos datos iniciales en una base de datos después de que esté en funcionamiento, un hook post-install podría usarse para ejecutar un trabajo que pueble estos datos.

apiVersion: batch/v1
kind: Job
metadata:
  name: init-database
  annotations:
"helm.sh/hook": post-install
spec:
  template:
spec:
  containers:
    - name: db-init
      image: busybox
      command: ['sh', '-c', 'init-db-command']

3. pre-delete

Momento de Ejecución: En una solicitud de eliminación, antes de que se eliminen recursos de Kubernetes.
Casos de Uso: Usa un hook pre-delete para apagar servicios de manera ordenada o para respaldar datos importantes antes de eliminar una liberación de Helm.

apiVersion: batch/v1
kind: Job
metadata:
  name: backup-before-delete
  annotations:
"helm.sh/hook": pre-delete
spec:
  template:
spec:
  containers:
    - name: backup
      image: busybox
      command: ['sh', '-c', 'backup-command']

4. post-delete

Momento de Ejecución: Después de que se han eliminado todos los recursos de la liberación.
Casos de Uso: Un hook post-delete podría usarse para limpiar recursos externos a Kubernetes que fueron creados por el chart de Helm, como recursos en la nube o entradas de bases de datos.

apiVersion: batch/v1
kind: Job
metadata:
  name: cleanup
  annotations:
"helm.sh/hook": post-delete
spec:
  template:
spec:
  containers:
    - name: cleanup
      image: busybox
      command: ['sh', '-c', 'cleanup-command']

5. pre-upgrade

Momento de Ejecución: En una solicitud de actualización, después de que las plantillas se renderizan, pero antes de que se actualicen los recursos.
Casos de Uso: Supón que necesitas validar algunas condiciones previas antes de aplicar una actualización. Un hook pre-upgrade puede ejecutar un trabajo para verificar el entorno o validar la nueva configuración.

apiVersion: batch/v1
kind: Job
metadata:
  name: pre-upgrade-check
  annotations:
"helm.sh/hook": pre-upgrade
spec:
  template:
spec:
  containers:
    - name: upgrade-check
      image: busybox
      command: ['sh', '-c', 'upgrade-check-command']

6. post-upgrade

Momento de Ejecución: Después de que todos los recursos han sido actualizados.
Casos de Uso: Después de una actualización exitosa, un hook post-upgrade podría usarse para desencadenar un trabajo que verifique la funcionalidad de la aplicación o migre datos a un nuevo esquema.

apiVersion: batch/v1
kind: Job
metadata:
  name: post-upgrade-verify
  annotations:
"helm.sh/hook": post-upgrade
spec:
  template:
spec:
  containers:
    - name: verification
      image: busybox
      command: ['sh', '-c', 'verify-upgrade']

7. pre-rollback

Momento de Ejecución: En una solicitud de reversión, después de que las plantillas se renderizan, pero antes de que se reviertan los recursos.
Casos de Uso: Este hook puede usarse para preparar el sistema para la reversión, como respaldar datos o notificar a otros sistemas sobre la reversión inminente.

apiVersion: batch/v1
kind: Job
metadata:
  name: pre-rollback-backup
  annotations:
"helm.sh/hook": pre-rollback
spec:
  template:
spec:
  containers:
    - name: backup
      image: busybox
      command: ['sh', '-c', 'rollback-backup']

8. post-rollback

Momento de Ejecución: Después de que todos los recursos han sido modificados por la reversión.
Casos de Uso: Usa un hook post-rollback para verificar el estado de la aplicación después de una reversión o para notificar a sistemas externos sobre la finalización de la reversión.

apiVersion: batch/v1
kind: Job
metadata:
  name: post-rollback-verify
  annotations:
"helm.sh/hook": post-rollback
spec:
  template:
spec:
  containers:
    - name: verify
      image: busybox
      command: ['sh', '-c', 'verify-rollback']

9. test

Momento de Ejecución: Se ejecuta cuando se invoca el subcomando helm test.
Casos de Uso: Este hook es ideal para ejecutar pruebas contra una liberación de Helm para verificar que funcione como se espera.

apiVersion: batch/v1
kind: Job
metadata:
  name: test-application
  annotations:
"helm.sh/hook": test
spec:
  template:
spec:
  containers:
    - name: test
      image: busybox
      command: ['sh', '-c', 'run-tests']

Anotaciones en Hooks de Helm

Además de definir hooks, Helm te permite controlar la ejecución de hooks usando anotaciones:

  • helm.sh/resource-policy: Previene que los recursos sean eliminados después de que el hook se ejecute. Valor posible:
  • keep: Mantiene el recurso después de que el hook se ejecute, útil para depuración o retención de registros.
  • helm.sh/hook-weight: Especifica el orden en el que los hooks deben ejecutarse. Los hooks con pesos más bajos se ejecutan antes que aquellos con pesos más altos.
  • helm.sh/hook-delete-policy: Controla cuándo deben eliminarse los recursos del hook. Los valores posibles incluyen:
  • hook-succeeded: Elimina el recurso si la ejecución del hook es exitosa.
  • hook-failed: Elimina el recurso si la ejecución del hook falla.
  • before-hook-creation: Elimina recursos de hooks anteriores antes de crear nuevos, asegurando que solo una instancia del hook esté activa.

Conclusión

Los hooks de Helm son herramientas poderosas que proporcionan un control detallado sobre el ciclo de vida de despliegue de tus aplicaciones en Kubernetes. Al entender y aprovechar estos hooks, puedes asegurar que tus despliegues de Helm sean tanto robustos como confiables. Asegúrate de usar las anotaciones apropiadas para afinar aún más el comportamiento de tus hooks, optimizándolos para tu caso de uso específico.

Consejos y trucos avanzados de Helm: Comandos y banderas poco comunes para una mejor gestión de Kubernetes

Consejos y trucos avanzados de Helm: Comandos y banderas poco comunes para una mejor gestión de Kubernetes

Gestionar los recursos de Kubernetes de manera efectiva puede a veces parecer abrumador, pero Helm, el gestor de paquetes de Kubernetes, ofrece varios comandos y banderas que hacen el proceso más fluido e intuitivo. En este artículo, profundizaremos en algunos comandos y banderas menos conocidos de Helm, explicando sus usos, beneficios y ejemplos prácticos.

1. helm get values: Recuperando Valores del Chart Desplegado

El comando helm get values es esencial cuando necesitas ver los valores de configuración de un chart de Helm desplegado. Esto es particularmente útil cuando tienes un chart desplegado pero no tienes acceso a su archivo de configuración original. Con este comando, puedes lograr un enfoque de «Infraestructura como Código» capturando el estado actual de tu despliegue.

Uso:

helm get values <release-name> [flags]
  • <release-name>: El nombre de tu release de Helm.

Ejemplo:

Para obtener los valores de un chart desplegado llamado my-release:

helm get values my-release --namespace my-namespace

Este comando muestra los valores actuales utilizados para el despliegue, lo cual es valioso para la documentación, replicar el entorno o modificar despliegues.

2. Entendiendo las Banderas de helm upgrade: --reset-values, --reuse-values, y --reset-then-reuse

El comando helm upgrade se utiliza típicamente para actualizar o modificar un release de Helm existente. Sin embargo, el comportamiento de este comando puede ajustarse finamente usando varias banderas: --reset-values, --reuse-values, y --reset-then-reuse.

  • --reset-values: Ignora los valores previos y utiliza solo los valores proporcionados en el comando actual. Usa esta bandera cuando quieras sobrescribir completamente la configuración existente.

Escenario de Ejemplo: Estás desplegando una nueva versión de tu aplicación y quieres asegurarte de que no se retengan valores antiguos.

  helm upgrade my-release my-chart --reset-values --set newKey=newValue
  • --reuse-values: Reutiliza los valores del release anterior y los fusiona con cualquier nuevo valor proporcionado. Esta bandera es útil cuando quieres mantener la mayor parte de la configuración antigua pero aplicar algunos ajustes.

Escenario de Ejemplo: Necesitas agregar una nueva variable de entorno a un despliegue existente sin afectar las otras configuraciones.

  helm upgrade my-release my-chart --reuse-values --set newEnv=production
  • --reset-then-reuse: Una combinación de los dos. Se restablece a los valores originales y luego se fusionan los valores antiguos, permitiéndote comenzar con una hoja limpia mientras retienes configuraciones específicas.

Escenario de Ejemplo: Útil en entornos complejos donde quieres asegurarte de que el chart esté usando la configuración predeterminada original pero retener algunos valores personalizados.

  helm upgrade my-release my-chart --reset-then-reuse --set version=2.0

3. helm lint: Asegurando la Calidad del Chart en Pipelines CI/CD

El comando helm lint verifica los charts de Helm en busca de errores de sintaxis, mejores prácticas y otros problemas potenciales. Esto es especialmente útil al integrar Helm en un pipeline CI/CD, ya que asegura que tus charts sean confiables y se adhieran a las mejores prácticas antes del despliegue.

Uso:

helm lint <chart-path> [flags]
  • <chart-path>: Ruta al chart de Helm que deseas validar.

Ejemplo:

helm lint ./my-chart/

Este comando escanea el directorio my-chart en busca de problemas como campos faltantes, estructura YAML incorrecta o uso obsoleto. Si estás automatizando despliegues, integrar helm lint en tu pipeline ayuda a detectar problemas temprano.

Integrando helm lint en un Pipeline CI/CD:

En un pipeline de Jenkins, por ejemplo, podrías agregar la siguiente etapa:

pipeline {
  agent any
  stages {
stage('Lint Helm Chart') {
  steps {
    script {
      sh 'helm lint ./my-chart/'
    }
  }
}
// Otras etapas como build, test, deploy
  }
}

Al agregar esta etapa, aseguras que cualquier problema de sintaxis o estructura se detecte antes de proceder a las etapas de construcción o despliegue.

4. helm rollback: Revertir a un Release Anterior

El comando helm rollback te permite revertir un release a una versión anterior. Esto puede ser increíblemente útil en caso de una actualización o despliegue fallido, ya que proporciona una forma de restaurar rápidamente un estado conocido como bueno.

Uso:

helm rollback <release-name> [revision] [flags]
  • <release-name>: El nombre de tu release de Helm.
  • [revision]: El número de revisión al que deseas revertir. Si se omite, Helm revertirá al release anterior por defecto.

Ejemplo:

Para revertir un release llamado my-release a su versión anterior:

helm rollback my-release

Para revertir a una revisión específica, digamos la revisión 3:

helm rollback my-release 3

Este comando puede ser un salvavidas cuando un cambio reciente rompe tu aplicación, permitiéndote restaurar rápidamente la continuidad del servicio mientras investigas el problema.

5. helm verify: Validando un Chart Antes de Usarlo

El comando helm verify verifica la integridad y validez de un chart antes de que sea desplegado. Este comando asegura que el archivo del paquete del chart no haya sido manipulado o corrompido. Es particularmente útil cuando estás obteniendo charts de repositorios externos o usando charts compartidos entre varios equipos.

Uso:

helm verify <chart-path>
  • <chart-path>: Ruta al archivo del chart de Helm (.tgz file).

Ejemplo:

Para verificar un chart descargado llamado my-chart:

helm verify ./my-chart.tgz

Si el chart pasa la verificación, Helm mostrará un mensaje de éxito. Si falla, verás detalles de los problemas, que podrían ir desde archivos faltantes hasta discrepancias en el checksum.

Conclusión

Aprovechar estos comandos y banderas avanzados de Helm puede mejorar significativamente tus capacidades de gestión de Kubernetes. Ya sea que estés recuperando configuraciones de despliegue existentes, ajustando tus actualizaciones de Helm o asegurando la calidad de tus charts en un pipeline CI/CD, estos trucos te ayudan a mantener un entorno de Kubernetes robusto y eficiente.

Exponiendo Puertos TCP Usando Istio Ingress Gateway

Exponiendo Puertos TCP Usando Istio Ingress Gateway

Istio se ha convertido en una herramienta esencial para gestionar el tráfico HTTP dentro de los clústeres de Kubernetes, ofreciendo características avanzadas como Implementaciones Canary, mTLS y visibilidad de extremo a extremo. Sin embargo, algunas tareas, como exponer un puerto TCP usando el Istio IngressGateway, pueden ser desafiantes si nunca lo has hecho antes. Este artículo te guiará a través del proceso de exponer puertos TCP con Istio Ingress Gateway, completo con ejemplos del mundo real y casos de uso prácticos.

Entendiendo el Contexto

Istio se utiliza a menudo para gestionar el tráfico HTTP en Kubernetes, proporcionando capacidades poderosas como gestión de tráfico, seguridad y observabilidad. El Istio IngressGateway sirve como punto de entrada para el tráfico externo en el clúster de Kubernetes, manejando típicamente tráfico HTTP y HTTPS. Sin embargo, Istio también soporta tráfico TCP, lo cual es necesario para casos de uso como exponer bases de datos u otros servicios no HTTP que se ejecutan en el clúster a consumidores externos.

Exponer un puerto TCP a través de Istio implica configurar el IngressGateway para manejar el tráfico TCP y enrutarlo al servicio apropiado. Esta configuración es particularmente útil en escenarios donde necesitas exponer servicios como TIBCO EMS o bases de datos basadas en Kubernetes a otras aplicaciones internas o externas.

Pasos para Exponer un Puerto TCP con Istio IngressGateway

1.- Modificar el Servicio Istio IngressGateway:

Antes de configurar el Gateway, debes asegurarte de que el servicio Istio IngressGateway esté configurado para escuchar en el nuevo puerto TCP. Este paso es crucial si estás utilizando un servicio NodePort, ya que este puerto necesita ser abierto en el Balanceador de Carga.

   apiVersion: v1
   kind: Service
   metadata:
 name: istio-ingressgateway
 namespace: istio-system
   spec:
 ports:
 - name: http2
   port: 80
   targetPort: 80
 - name: https
   port: 443
   targetPort: 443
 - name: tcp
   port: 31400
   targetPort: 31400
   protocol: TCP

2.- Actualiza el servicio Istio IngressGateway para incluir el nuevo puerto 31400 para tráfico TCP.

Configura el Istio IngressGateway: Después de modificar el servicio, configura el Istio IngressGateway para escuchar en el puerto TCP deseado.

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: tcp-ingress-gateway
  namespace: istio-system
spec:
  selector:
istio: ingressgateway
  servers:
  - port:
	  number: 31400
	  name: tcp
	  protocol: TCP
	hosts:
	- "*"

En este ejemplo, el IngressGateway está configurado para escuchar en el puerto 31400 para tráfico TCP.

3.- Crea un Servicio y VirtualService:

Después de configurar el gateway, necesitas crear un Servicio que represente la aplicación backend y un VirtualService para enrutar el tráfico TCP.

apiVersion: v1
kind: Service
metadata:
  name: tcp-service
  namespace: default
spec:
  ports:
  - port: 31400
	targetPort: 8080
	protocol: TCP
  selector:
app: tcp-app

El Servicio anterior mapea el puerto 31400 en el IngressGateway al puerto 8080 en la aplicación backend.

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: tcp-virtual-service
  namespace: default
spec:
  hosts:
  - "*"
  gateways:
  - tcp-ingress-gateway
  tcp:
  - match:
	- port: 31400
	route:
	- destination:
		host: tcp-service
		port:
		  number: 8080

El VirtualService enruta el tráfico TCP que llega al puerto 31400 en el gateway al tcp-service en el puerto 8080.

4.- Aplica la Configuración

Aplica las configuraciones anteriores usando kubectl para crear los recursos necesarios de Kubernetes.

kubectl apply -f istio-ingressgateway-service.yaml
kubectl apply -f tcp-ingress-gateway.yaml
kubectl apply -f tcp-service.yaml
kubectl apply -f tcp-virtual-service.yaml

Después de aplicar estas configuraciones, el Istio IngressGateway expondrá el puerto TCP al tráfico externo.

Casos de Uso Prácticos

  • Exponiendo el Servidor TIBCO EMS: Un escenario común es exponer un servidor TIBCO EMS (Enterprise Message Service) que se ejecuta dentro de un clúster de Kubernetes a otras aplicaciones internas o consumidores externos. Al configurar el Istio IngressGateway para manejar el tráfico TCP, puedes exponer de manera segura el puerto TCP de EMS, permitiendo que se comunique con servicios fuera del entorno de Kubernetes.
  • Exponiendo Bases de Datos: Otro caso de uso es exponer una base de datos que se ejecuta dentro de Kubernetes a servicios externos o diferentes clústeres. Al exponer el puerto TCP de la base de datos a través del Istio IngressGateway, permites que otras aplicaciones interactúen con ella, independientemente de su ubicación.
  • Exponiendo un Servicio Personalizado Basado en TCP: Supongamos que tienes una aplicación personalizada que se ejecuta dentro de Kubernetes y se comunica a través de TCP, como un servidor de juegos o un servicio API personalizado basado en TCP. Puedes usar el Istio IngressGateway para exponer este servicio a usuarios externos, haciéndolo accesible desde fuera del clúster.

Conclusión

Exponer puertos TCP usando el Istio IngressGateway puede ser una técnica poderosa para gestionar tráfico no HTTP en tu clúster de Kubernetes. Con los pasos descritos en este artículo, puedes exponer con confianza servicios como TIBCO EMS, bases de datos o aplicaciones personalizadas basadas en TCP a consumidores externos, mejorando la flexibilidad y conectividad de tus aplicaciones.

ConfigMap con Valores Opcionales en Kubernetes

ConfigMap con Valores Opcionales en Kubernetes

Los ConfigMaps de Kubernetes son una herramienta poderosa para gestionar datos de configuración por separado del código de la aplicación. Sin embargo, a veces pueden causar problemas durante el despliegue, particularmente cuando falta un ConfigMap referenciado en una especificación de Pod, lo que provoca que la aplicación no pueda iniciarse. Este es un escenario común que puede llevar a un CreateContainerConfigError y detener tu canal de despliegue.

Entendiendo el Problema

Cuando un ConfigMap es referenciado en la especificación de un Pod, Kubernetes espera que el ConfigMap esté presente. Si no lo está, Kubernetes no iniciará el Pod, lo que lleva a un despliegue fallido. Esto puede ser problemático en situaciones donde ciertos datos de configuración son opcionales o específicos del entorno, como configuraciones de proxy que solo son necesarias en ciertos entornos.

Haciendo Opcionales los Valores de ConfigMap

Kubernetes proporciona una forma de definir elementos de ConfigMap como opcionales, permitiendo que tu aplicación se inicie incluso si el ConfigMap no está presente. Esto puede ser particularmente útil para variables de entorno que solo necesitan establecerse bajo ciertas condiciones.

Aquí hay un ejemplo básico de cómo hacer un ConfigMap opcional:

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: nginx
    env:
    - name: OPTIONAL_ENV_VAR
      valueFrom:
        configMapKeyRef:
          name: example-configmap
          key: optional-key
          optional: true

En este ejemplo:

  • name: example-configmap se refiere al ConfigMap que podría o no estar presente.
  • optional: true asegura que el Pod se iniciará incluso si example-configmap o la optional-key dentro de él está ausente.

Caso de Uso Práctico: Configuración de Proxy

Un caso de uso común para valores opcionales de ConfigMap es establecer variables de entorno para la configuración de proxy. En muchos entornos empresariales, las configuraciones de proxy solo son necesarias en ciertos entornos de despliegue (por ejemplo, staging, producción) pero no en otros (por ejemplo, desarrollo local).

apiVersion: v1
kind: ConfigMap
metadata:
  name: proxy-config
data:
  HTTP_PROXY: "http://proxy.example.com"
  HTTPS_PROXY: "https://proxy.example.com"

En tu especificación de Pod, podrías referenciar estas configuraciones de proxy como opcionales:

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app-container
    image: my-app-image
    env:
    - name: HTTP_PROXY
      valueFrom:
        configMapKeyRef:
          name: proxy-config
          key: HTTP_PROXY
          optional: true
    - name: HTTPS_PROXY
      valueFrom:
        configMapKeyRef:
          name: proxy-config
          key: HTTPS_PROXY
          optional: true

En esta configuración, si el ConfigMap proxy-config falta, la aplicación aún se iniciará, simplemente sin las configuraciones de proxy.

Aplicación de Ejemplo

Vamos a recorrer un ejemplo simple para demostrar este concepto. Crearemos un despliegue para una aplicación que utiliza valores de configuración opcionales.

  1. Crear el ConfigMap (Opcional):
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  GREETING: "¡Hola, Mundo!"
  1. Desplegar la Aplicación:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: busybox
        command: ["sh", "-c", "echo $GREETING"]
        env:
        - name: GREETING
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: GREETING
              optional: true
  1. Desplegar y Probar:
  2. Despliega la aplicación usando kubectl apply -f <tu-archivo-de-despliegue>.yaml.
  3. Si el ConfigMap app-config está presente, el Pod mostrará «¡Hola, Mundo!».
  4. Si el ConfigMap falta, el Pod se iniciará, pero no se mostrará ningún saludo.

Conclusión

Los valores opcionales de ConfigMap son una forma simple pero efectiva de hacer que tus despliegues de Kubernetes sean más resilientes y adaptables a diferentes entornos. Al marcar las claves de ConfigMap como opcionales, puedes prevenir fallos en el despliegue y permitir que tus aplicaciones manejen la falta de configuración de manera elegante.

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.