¿Cómo habilitar la sesión persistente en tus cargas de trabajo de Kubernetes usando Istio?

¿Cómo habilitar la sesión persistente en tus cargas de trabajo de Kubernetes usando Istio?

Istio te permite configurar Sticky Session, entre otras características de red, para tus cargas de trabajo de Kubernetes. Como hemos comentado en varios artículos sobre Istio, istio despliega una malla de servicios que proporciona un plano de control central para tener toda la configuración relacionada con los aspectos de red de tus cargas de trabajo de Kubernetes. Esto cubre muchos aspectos diferentes de la comunicación dentro de la plataforma de contenedores, como la seguridad que cubre el transporte seguro, la autenticación o la autorización, y, al mismo tiempo, características de red, como el enrutamiento y la distribución de tráfico, que es el tema principal del artículo de hoy.

Estas capacidades de enrutamiento son similares a lo que un Balanceador de Carga tradicional de Nivel 7 puede proporcionar. Cuando hablamos de Nivel 7, nos referimos a los niveles convencionales que componen la pila OSI, donde el nivel 7 está relacionado con el Nivel de Aplicación.

Una configuración de Sticky Session o Afinidad de Sesión es una de las características más comunes que puedes necesitar implementar en este escenario. El caso de uso es el siguiente:

¿Cómo habilitar Sticky Session en tus cargas de trabajo de Kubernetes usando Istio?

Tienes varias instancias de tus cargas de trabajo, por lo que diferentes réplicas de pods en una situación de Kubernetes. Todos estos pods detrás del mismo servicio. Por defecto, redirigirá las solicitudes de manera round-robin entre las réplicas de pods en un estado Ready, por lo que Kubernetes entiende que están listas para recibir la solicitud a menos que lo definas de manera diferente.

Pero en algunos casos, principalmente cuando estás tratando con una aplicación web o cualquier aplicación con estado que maneja el concepto de una sesión, podrías querer que la réplica que procesa la primera solicitud también maneje el resto de las solicitudes durante la vida útil de la sesión.

Por supuesto, podrías hacer eso fácilmente simplemente enrutando todo el tráfico a una solicitud, pero en ese caso, perderíamos otras características como el balanceo de carga de tráfico y HA. Entonces, esto generalmente se implementa usando políticas de Afinidad de Sesión o Sticky Session que proporcionan lo mejor de ambos mundos: la misma réplica manejando todas las solicitudes de un usuario, pero distribución de tráfico entre diferentes usuarios.

¿Cómo funciona Sticky Session?

El comportamiento detrás de esto es relativamente fácil. Veamos cómo funciona.

Primero, lo importante es que necesitas «algo» como parte de tus solicitudes de red que identifique todas las solicitudes que pertenecen a la misma sesión, para que el componente de enrutamiento (en este caso, este rol lo desempeña istio) pueda determinar qué parte necesita manejar estas solicitudes.

Este «algo» que usamos para hacer eso, puede ser diferente dependiendo de tu configuración, pero generalmente, esto es una Cookie o un Encabezado HTTP que enviamos en cada solicitud. Por lo tanto, sabemos que la réplica maneja todas las solicitudes de ese tipo específico.

¿Cómo implementa Istio el soporte para Sticky Session?

En el caso de usar Istio para desempeñar este rol, podemos implementar eso usando una Regla de Destino específica que nos permite, entre otras capacidades, definir la política de tráfico para definir cómo queremos que se divida el tráfico y para implementar el Sticky Session necesitamos usar la característica “consistentHash”, que permite que todas las solicitudes que se computan al mismo hash sean enviadas a la réplica.

Cuando definimos las características de consistentHash, podemos decir cómo se creará este hash y, en otras palabras, qué componentes se usarán para generar este hash, y esto puede ser una de las siguientes opciones:

  • httpHeaderName: Usa un Encabezado HTTP para hacer la distribución de tráfico
  • httpCookie: Usa una Cookie HTTP para hacer la distribución de tráfico
  • httpQueryParameterName: Usa una Cadena de Consulta para hacer la Distribución de Tráfico.
  • maglev: Usa el Balanceador de Carga Maglev de Google para hacer la determinación. Puedes leer más sobre Maglev en el artículo de Google.
  • ringHash: Usa un enfoque de hash basado en anillo para el balanceo de carga entre los pods disponibles.

Entonces, como puedes ver, tendrás muchas opciones diferentes. Aún así, solo las tres primeras serían las más utilizadas para implementar una sesión persistente, y generalmente, la opción de Cookie HTTP (httpCookie) será la preferida, ya que se basaría en el enfoque HTTP para gestionar la sesión entre clientes y servidores.

Ejemplo de Implementación de Sticky Session usando TIBCO BW

Definiremos una carga de trabajo TIBCO BW muy simple para implementar un servicio REST, sirviendo una respuesta GET con un valor codificado. Para simplificar el proceso de validación, la aplicación registrará el nombre de host del pod para que rápidamente podamos ver quién está manejando cada una de las solicitudes:

¿Cómo habilitar Sticky Session en tus cargas de trabajo de Kubernetes usando Istio?

Desplegamos esto en nuestro clúster de Kubernetes y lo exponemos usando un servicio de Kubernetes; en nuestro caso, el nombre de este servicio será test2-bwce-srv

Además de eso, aplicamos la configuración de istio, que requerirá tres (3) objetos de istio: gateway, servicio virtual y la regla de destino. Como nuestro enfoque está en la regla de destino, intentaremos mantenerlo lo más simple posible en los otros dos objetos:

 apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: default-gw
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - '*'
    port:
      name: http
      number: 80
      protocol: HTTP

Servicio Virtual:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: test-vs
spec:
  gateways:
  - default-gw
  hosts:
  - test.com
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: test2-bwce-srv
        port:
          number: 8080

Y finalmente, la DestinationRule usará una httpCookie que llamaremos ISTIOD, como puedes ver en el fragmento a continuación:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
    name: default-sticky-dr
    namespace: default
spec:
    host: test2-bwce-srv.default.svc.cluster.local
    trafficPolicy:
      loadBalancer:
        consistentHash:
          httpCookie: 
            name: ISTIOID
            ttl: 60s

Ahora, que ya hemos comenzado nuestra prueba, y después de lanzar la primera solicitud, obtenemos una nueva Cookie que es generada por istio mismo que se muestra en la ventana de respuesta de Postman:

¿Cómo habilitar la sesión persistente en tus cargas de trabajo de Kubernetes usando Istio?

Esta solicitud ha sido manejada por una de las réplicas disponibles del servicio, como puedes ver aquí:

¿Cómo habilitar la sesión persistente en tus cargas de trabajo de Kubernetes usando Istio?

Todas las solicitudes subsiguientes de Postman ya incluyen la cookie, y todas ellas son manejadas desde el mismo pod:

¿Cómo habilitar la sesión persistente en tus cargas de trabajo de Kubernetes usando Istio?

Mientras que el registro de la otra réplica está vacío, ya que todas las solicitudes han sido enrutadas a ese pod específico.

¿Cómo habilitar la sesión persistente en tus cargas de trabajo de Kubernetes usando Istio?

Resumen

Cubrimos en este artículo la razón detrás de la necesidad de una sesión persistente en la carga de trabajo de Kubernetes y cómo podemos lograr eso usando las capacidades de la Malla de Servicios de Istio. Así que, espero que esto pueda ayudar a implementar esta configuración en tus cargas de trabajo que puedas necesitar hoy o en el futuro.

📚 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.

Kubernetes Autoscaling 1.26: ¿Un cambio de juego para los usuarios de KEDA?

Kubernetes Autoscaling 1.26: ¿Un cambio de juego para los usuarios de KEDA?

Introducción

El autoescalado de Kubernetes ha sufrido un cambio dramático. Desde el lanzamiento de Kubernetes 1.26, todos los componentes deben migrar sus objetos HorizontalPodAutoscaler de la versión v1 a la nueva versión v2 que ha estado disponible desde Kubernetes 1.23.

HorizontalPodAutoscaler es un componente crucial en cualquier carga de trabajo desplegada en un clúster de Kubernetes, ya que la escalabilidad de esta solución es uno de los grandes beneficios y características clave de este tipo de entorno.

Un poco de Historia

Kubernetes ha introducido una solución para la capacidad de autoescalado desde la versión Kubernetes 1.3 hace mucho tiempo, en 2016. Y la solución se basaba en un bucle de control que se ejecuta en un intervalo específico que puedes configurar con los parámetros de la propiedad --horizontal-pod-autoscaler-sync-period que pertenecen al kube-controller-manager.

Entonces, una vez durante este período, obtendrá las métricas y evaluará a través de la condición definida en el componente HorizontalPodAutoscaler. Inicialmente, se basaba en los recursos de cómputo utilizados por el pod, memoria principal y CPU.

Kubernetes Autoscaling 1.26: ¿Un cambio de juego para los usuarios de KEDA?

Esto proporcionó una excelente característica, pero con el paso del tiempo y la adopción del entorno de Kubernetes, se ha mostrado un poco limitado para manejar todos los escenarios que deberíamos tener, y aquí es donde otros proyectos impresionantes que hemos discutido aquí, como KEDA entran en escena para proporcionar un conjunto de características mucho más flexible.

Capacidades de Autoescalado de Kubernetes Introducidas v2

Con el lanzamiento de la v2 de los objetos de la API de Autoescalado, hemos incluido una gama de capacidades para mejorar la flexibilidad y las opciones disponibles ahora. Las más relevantes son las siguientes:

  • Escalado en métricas personalizadas: Con el nuevo lanzamiento, puedes configurar un objeto HorizontalPodAutoscaler para escalar usando métricas personalizadas. Cuando hablamos de métricas personalizadas, hablamos de cualquier métrica generada desde Kubernetes. Puedes ver una guía detallada sobre el uso de métricas personalizadas en la documentación oficial
  • Escalado en múltiples métricas: Con el nuevo lanzamiento, también tienes la opción de escalar basado en más de una métrica. Así que ahora el HorizontalPodAutoscaler evaluará cada condición de regla de escalado, propondrá un nuevo valor de escala para cada una de ellas, y tomará el valor máximo como el final.
  • Soporte para la API de Métricas: Con el nuevo lanzamiento, el controlador de los componentes de HoriztalPodAutoscaler recupera métricas de una serie de APIs registradas, como metrics.k8s.io, custom.metrics.k8s.io, external.metrics.k8s.io. Para más información sobre las diferentes métricas disponibles, puedes echar un vistazo a la propuesta de diseño
  • Comportamiento de Escalado Configurable: Con el nuevo lanzamiento, tienes un nuevo campo, behavior, que permite configurar cómo se comportará el componente en términos de actividad de escalado hacia arriba o hacia abajo. Así, puedes definir diferentes políticas para el escalado hacia arriba y otras para el escalado hacia abajo, limitar el número máximo de réplicas que se pueden agregar o eliminar en un período específico, para manejar los problemas con los picos de algunos componentes como las cargas de trabajo de Java, entre otros. También, puedes definir una ventana de estabilización para evitar el estrés cuando la métrica aún está fluctuando.

Kubernetes Autoscaling v2 vs KEDA

Hemos visto todos los nuevos beneficios que proporciona Autoscaling v2, así que estoy seguro de que la mayoría de ustedes se están haciendo la misma pregunta: ¿Está Kubernetes Autoscaling v2 matando a KEDA?

Desde las últimas versiones de KEDA, KEDA ya incluye los nuevos objetos bajo el grupo autoscaling/v2 como parte de su desarrollo, ya que KEDA se basa en los objetos nativos de Kubernetes, y simplifica parte del proceso que necesitas hacer cuando quieres usar métricas personalizadas o externas, ya que tienen escaladores disponibles para prácticamente todo lo que podrías necesitar ahora o incluso en el futuro.

Pero, incluso con eso, todavía hay características que KEDA proporciona que no están cubiertas aquí, como las capacidades de escalado “desde cero” y “a cero” que son muy relevantes para tipos específicos de cargas de trabajo y para obtener un uso muy optimizado de los recursos. Aún así, es seguro decir que con las nuevas características incluidas en el lanzamiento de autoscaling/v2, la brecha ahora es más pequeña. Dependiendo de tus necesidades, puedes optar por las capacidades listas para usar sin incluir un nuevo componente en tu arquitectura.

📚 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.

Grafana Alerting vs AlertManager: Una Comparación de Dos Herramientas de Monitoreo Líderes

Grafana Alerting vs AlertManager: Una Comparación de Dos Herramientas de Monitoreo Líderes

Introducción

Las capacidades de Grafana Alerting continúan mejorando en cada nueva versión que el equipo de GrafanaLabs realiza. Especialmente con los cambios realizados en Grafana 8 y Grafana 9, se han planteado muchas preguntas sobre su uso, las capacidades soportadas y la comparación con otras alternativas.

Queremos comenzar estableciendo el contexto sobre Grafana Alerting basado en el stack habitual que desplegamos para mejorar la observabilidad de nuestras cargas de trabajo. Grafana se puede usar para cualquier carga de trabajo; hay una preferencia por algunas específicas siendo la solución más utilizada cuando hablamos de cargas de trabajo en Kubernetes.

En este tipo de despliegue, el stack que usualmente desplegamos es Grafana como la herramienta de visualización y Prometheus como el núcleo para recopilar todas las métricas, de modo que todas las responsabilidades están diferenciadas. Grafana dibuja toda la información utilizando sus excelentes capacidades de paneles, recopilando la información de Prometheus.

Grafana Alerting vs AlertManager: Una Comparación de Dos Herramientas de Monitoreo Líderes

Cuando planeamos comenzar a incluir alertas, ya que no podemos aceptar que necesitamos tener un equipo específico solo observando paneles para detectar dónde algo está fallando, necesitamos implementar una forma de enviar alertas.

Las capacidades de alerta en Grafana han estado presentes desde el principio, pero sus capacidades en las primeras etapas se han limitado a generar alertas gráficas centradas en los paneles. En lugar de eso, Prometheus actuando como el cerebro, incluye un componente llamado AlertManager que puede manejar la creación y notificación de cualquier alerta generada a partir de toda la información almacenada en Prometheus.

Las principales capacidades que Alert Manager proporciona son la definición de las alertas, agrupación de las alertas, reglas de desestimación para silenciar algunas notificaciones, y finalmente, la forma de enviar esa alerta a cualquier sistema basado en un sistema de plugins y un webhook para poder extenderlo a cualquier componente disponible.

Grafana Alerting vs AlertManager: Una Comparación de Dos Herramientas de Monitoreo Líderes

Entonces, esta es la etapa inicial, pero esto ha cambiado con las últimas versiones de Grafana en los últimos meses, como se comentó, y ahora la barrera entre ambos componentes es mucho más difusa, como vamos a ver.

¿Cuáles son las principales capacidades que Grafana Alerting ofrece hoy en día?

Grafana Alerting te permite definir reglas de alerta definiendo los criterios bajo los cuales esta alerta debería activarse. Puede tener diferentes consultas, condiciones, frecuencia de evaluación y la duración durante la cual se cumple la condición.

Esta alerta puede generarse desde cualquiera de las fuentes soportadas en Grafana, y ese es un tema muy relevante ya que no se limita a los datos de Prometheus. Con la eclosión del stack de GrafanaLabs con muchos nuevos productos como Grafana Loki y Grafana Mimir, entre otros, esto es especialmente relevante.

Una vez que cada una de las alertas se activa, puedes definir una política de notificación para decidir dónde, cuándo y cómo se enruta cada una de estas alertas. Una política de notificación también tiene un punto de contacto asociado con uno o más notificadores.

Además, puedes silenciar alertas para dejar de recibir notificaciones de una instancia de alerta específica y silenciar alertas cuando puedes definir un período en el que no se generarán o notificarán nuevas alertas.

Todo eso con poderosas capacidades de paneles utilizando todo el poder de las características de paneles de Grafana.

Grafana Alerting vs AlertManager: Una Comparación de Dos Herramientas de Monitoreo Líderes

Grafana Alerting vs Prometheus Alert Manager

Después de leer la sección anterior probablemente estés confundido porque la mayoría de las nuevas características añadidas son muy similares a las que tenemos disponibles en Prometheus AlertManager.

Entonces, en ese caso, ¿qué herramienta deberíamos usar? ¿Deberíamos reemplazar Prometheus AlertManager y comenzar a usar Grafana Alerting? ¿Deberíamos usar ambos? Como puedes imaginar, esta es una de esas preguntas que no tiene respuestas claras ya que dependerá mucho del contexto y tu escenario específico, pero permíteme darte algunas indicaciones al respecto.

  • Grafana Alerting puede ser muy poderoso si ya estás dentro del stack de Grafana. Si ya estás usando Grafana Loki (y necesitas generar alertas desde él), Grafana Mimir, o directamente Grafana cloud, probablemente Grafana Alert proporcionará un mejor ajuste para tu ecosistema.
  • Si necesitas alertas complejas definidas con consultas y cálculos complejos, Prometheus AlertManager proporcionará un ecosistema mucho más complejo y rico para generar tus alertas.
  • Si estás buscando un enfoque SaaS, Grafana Alerting también se proporciona como parte de Grafana Cloud, por lo que se puede usar sin la necesidad de ser instalado en tu ecosistema.
  • Si estás usando Grafana Alerting, necesitas considerar que el mismo componente que sirve los paneles está computando y generando las alertas, lo que requeriría capacidades adicionales de HA. Habrá una relación inevitable entre ambas características (paneles y alertas). Supongamos que eso no resuena bien contigo porque la criticidad de tu panel no es la misma que la de las alertas, o piensas que el uso de tu panel puede afectar el rendimiento de las alertas. En ese caso, Prometheus Alert Manager proporcionará un mejor enfoque ya que se ejecuta en un pod específico en aislamiento.
  • En este momento, Grafana Alerting utiliza una base de datos SQL para gestionar la duplicación entre otras características, por lo que dependiendo del número de alertas con las que necesites trabajar, podría no ser suficiente en términos de rendimiento, y el uso de la base de datos de series temporales de Prometheus puede ser una mejor opción.

Resumen

Grafana Alerting es un progreso increíble en el camino del equipo de Grafana Labs para proporcionar un stack de observabilidad de extremo a extremo con un gran ajuste en el resto del ecosistema con la opción de ejecutarlo en modo SaaS y centrarse en la facilidad de uso. Pero hay mejores opciones dependiendo de tus necesidades.

📚 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.

Optimiza Tu Service Mesh con Istio y Extremos Externos

Optimiza Tu Service Mesh con Istio y Extremos Externos

¿Qué es un Istio ServiceEntry?

Istio ServiceEntry es la forma de definir un punto final que no pertenece al Registro de Servicios de Istio. Una vez que el ServiceEntry es parte del registro, puede definir reglas e imponer políticas como si pertenecieran al mesh.

Istio Service Entry responde a la pregunta que probablemente te has hecho varias veces al usar una Service Mesh. ¿Cómo puedo hacer la misma magia con puntos finales externos que puedo hacer cuando todo está bajo el alcance de mi malla de servicios? Y los objetos Istio Service Entry proporcionan precisamente eso:

Una forma de tener una malla extendida gestionando otro tipo de carga de trabajo o, aún mejor, en palabras del propio Istio:

ServiceEntry permite agregar entradas adicionales en el registro de servicios interno de Istio para que los servicios auto-descubiertos en la malla puedan acceder/rutear a estos servicios especificados manualmente.

Estos servicios podrían ser externos a la malla (por ejemplo, APIs web) o servicios internos de la malla que no son parte del registro de servicios de la plataforma (por ejemplo, un conjunto de VMs comunicándose con servicios en Kubernetes).

¿Cuáles son las principales capacidades de Istio ServiceEntry?

Aquí puedes ver un ejemplo de la definición YAML de un Service Entry:

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: external-svc-redirect
spec:
  hosts:
  - wikipedia.org
  - "*.wikipedia.org"
  location: MESH_EXTERNAL
  ports:
  - number: 443
    name: https
    protocol: TLS
  resolution: NONE

En este caso, tenemos un objeto external-svc-redirectServiceEntry que está manejando todas las llamadas que van a wikipedia.org, y definimos el puerto y el protocolo a utilizar (TLS – 443) y clasificamos este servicio como externo a la malla (MESH_EXTERNAL) ya que es una página web externa.

También puedes especificar más detalles dentro de la configuración de ServiceEntry, para que puedas, por ejemplo, definir un nombre de host o IP y traducirlo a un nombre de host y puerto diferentes porque también puedes especificar el modo de resolución que deseas usar para este Service Entry específico. Si ves el fragmento anterior, encontrarás un campo resolution con el valor NONE que indica que no hará ninguna resolución particular. Pero otros valores válidos son los siguientes:

  • NONE: Asume que las conexiones entrantes ya han sido resueltas (a una dirección IP de destino específica).
  • STATIC: Usa las direcciones IP estáticas especificadas en los puntos finales como las instancias de respaldo asociadas con el servicio.
  • DNS: Intenta resolver la dirección IP consultando el DNS ambiental de manera asincrónica.
  • DNSROUNDROBIN: Intenta resolver la dirección IP consultando el DNS ambiental de manera asincrónica. A diferencia de DNS, DNSROUNDROBIN solo usa la primera dirección IP devuelta cuando se necesita iniciar una nueva conexión sin depender de los resultados completos de la resolución DNS, y las referencias hechas a los hosts se mantendrán incluso si los registros DNS cambian con frecuencia, eliminando el drenaje de grupos de conexiones y el ciclo de conexiones.

Para definir el objetivo del ServiceEntry, necesitas especificar sus puntos finales utilizando un objeto WorkloadEntry. Para hacerlo, necesitas proporcionar los siguientes datos:

  • address: Dirección asociada con el punto final de la red sin el puerto.
  • ports: Conjunto de puertos asociados con el punto final
  • weight: El peso de balanceo de carga asociado con el punto final.
  • locality: La localidad asociada con el punto final. Una localidad corresponde a un dominio de falla (por ejemplo, país/región/zona).
  • network: La red permite a Istio agrupar puntos finales residentes en el mismo dominio/red L3.

¿Qué puedes hacer con Istio ServiceEntry?

El número de casos de uso es enorme. Una vez que un ServiceEntry es similar a lo que tienes definido un Servicio Virtual, puedes aplicar cualquier regla de destino a ellos para hacer un balanceador de carga, un cambio de protocolo, o cualquier lógica que se pueda hacer con el objeto DestinationRule. Lo mismo se aplica al resto de los CRD de Istio, como RequestAuthentication y PeerAuthorization, entre otros.

También puedes tener una representación gráfica del ServiceEntry dentro de Kiali, una representación visual para la Malla de Servicios de Istio, como puedes ver en la imagen a continuación:

Entendiendo Istio ServiceEntry: Cómo Extender Tu Malla de Servicios a Puntos Finales Externos

Como puedes definir, una malla extendida con puntos finales fuera del clúster de Kubernetes es algo que se está volviendo más común con la explosión de clústeres disponibles y los entornos híbridos cuando necesitas gestionar clústeres de diferentes topologías y no perder la gestión centralizada basada en políticas de red que la Malla de Servicios de Istio proporciona a tu plataforma.

Asegure sus servicios con Istio: Guía paso a paso para configurar conexiones TLS de Istio

Asegure sus servicios con Istio: Guía paso a paso para configurar conexiones TLS de Istio

Introducción

La configuración de TLS en Istio es una de las características esenciales cuando habilitamos un Service Mesh. Istio Service Mesh proporciona muchas características para definir de manera centralizada y con políticas cómo se maneja la seguridad de transporte, entre otras características, en las diferentes cargas de trabajo que has desplegado en tu clúster de Kubernetes.

Una de las principales ventajas de este enfoque es que puedes hacer que tu aplicación se concentre en la lógica de negocio que necesita implementar. Estos aspectos de seguridad pueden externalizarse y centralizarse sin necesariamente incluir un esfuerzo adicional en cada aplicación que hayas desplegado. Esto es especialmente relevante si estás siguiendo un enfoque poliglota (como deberías) en las cargas de trabajo de tu clúster de Kubernetes.

Así que, esta vez vamos a hacer que nuestras aplicaciones manejen solo tráfico HTTP tanto interno como externo, y dependiendo de a dónde estemos llegando, forzaremos que esa conexión sea TLS sin que la carga de trabajo necesite ser consciente de ello. Así que, veamos cómo podemos habilitar esta configuración de TLS en Istio.

Vista del Escenario

Usaremos esta imagen que puedes ver a continuación para tener en mente los conceptos y componentes que interactuarán como parte de las diferentes configuraciones que aplicaremos a esto.

  • Usaremos la puerta de enlace de entrada para manejar todo el tráfico entrante al clúster de Kubernetes y la puerta de enlace de salida para manejar todo el tráfico saliente del clúster.
  • Tendremos un contenedor sidecar desplegado en cada aplicación para manejar la comunicación desde las puertas de enlace o la comunicación de pod a pod.

Para simplificar las aplicaciones de prueba, usaremos las aplicaciones de muestra predeterminadas que Istio proporciona, las cuales puedes encontrar aquí.

¿Cómo Exponer TLS en Istio?

Esta es la parte más fácil, ya que toda la comunicación entrante que recibirás desde el exterior entrará al clúster a través de la Puerta de Enlace de Ingreso de Istio, por lo que es este componente el que necesita manejar la conexión TLS y luego usar el enfoque de seguridad habitual para hablar con el pod que expone la lógica.

Por defecto, la Puerta de Enlace de Ingreso de Istio ya expone un puerto TLS, como puedes ver en la imagen a continuación:

Asegura tus servicios con Istio: Una guía paso a paso para configurar conexiones TLS en Istio

Así que necesitaremos definir una Puerta de Enlace que reciba todo este tráfico a través de HTTPS y lo redirija a los pods, y lo haremos como puedes ver aquí:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway-https
  namespace: default
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
        - '*'
      port:
        name: https
        number: 443
        protocol: HTTPS
      tls:
        mode: SIMPLE # habilita HTTPS en este puerto
        credentialName: httpbin-credential 

Como podemos ver, es una configuración sencilla, solo agregando el puerto HTTPS en el 443 y proporcionando la configuración TLS:

Y con eso, ya podemos acceder usando SSL a las mismas páginas:

Asegura tus servicios con Istio: Una guía paso a paso para configurar conexiones TLS en Istio

¿Cómo Consumir SSL desde Istio?

Ahora que hemos generado una solicitud TLS entrante sin que la aplicación sepa nada, vamos un paso más allá y hacemos la configuración más desafiante. Configuraremos la conexión TLS/SSL para cualquier comunicación saliente fuera del clúster de Kubernetes sin que la aplicación sepa nada al respecto.

Para hacerlo, usaremos uno de los conceptos de Istio que ya hemos cubierto en un artículo específico. Ese concepto es la Entrada de Servicio de Istio que nos permite definir un punto final para gestionarlo dentro del MESH.

Aquí podemos ver el punto final de Wikipedia agregado al registro de Service Mesh:

 apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: se-app
  namespace: default
spec:
  hosts:
  - wikipedia.org
  ports:
  - name: https
    number: 443
    protocol: HTTPS
  resolution: DNS

Una vez que hemos configurado la Entrada de Servicio, podemos definir una Regla de Destino para forzar que todas las conexiones a wikipedia.org usen la configuración TLS:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: tls-app
  namespace: default
spec:
  host: wikipedia.org
  trafficPolicy:
    tls:
      mode: SIMPLE

📚 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.

Kiali: Guía Esencial para Gestionar Istio Service Mesh

Kiali: Guía Esencial para Gestionar Istio Service Mesh

¿Qué es Kiali?

Kiali es un proyecto de código abierto que proporciona observabilidad para tu malla de servicios Istio. Desarrollado por Red Hat, Kiali ayuda a los usuarios a entender la estructura y el comportamiento de su malla y cualquier problema que pueda surgir.

Kiali proporciona una representación gráfica de tu malla, mostrando las relaciones entre los diversos componentes de la malla de servicios, como servicios, servicios virtuales, reglas de destino y más. También muestra métricas vitales, como tasas de solicitudes y errores, para ayudarte a monitorear la salud de tu malla e identificar posibles problemas.

 ¿Cuáles son las principales capacidades de Kiali?

Una de las características clave de Kiali es su capacidad para visualizar la comunicación de servicio a servicio dentro de una malla. Esto permite a los usuarios ver rápidamente cómo están conectados los servicios y cómo se enrutan las solicitudes a través de la malla. Esto es particularmente útil para la resolución de problemas, ya que puede ayudarte a identificar rápidamente problemas con la comunicación de servicios, como reglas de enrutamiento mal configuradas o tiempos de respuesta lentos.

Kiali 101: Comprendiendo y Utilizando esta Herramienta Esencial de Gestión de Malla de Servicios

Kiali también proporciona varias herramientas para monitorear la salud de tu malla. Por ejemplo, puede alertarte sobre problemas potenciales, como una alta tasa de errores o un servicio que no responde a las solicitudes. También proporciona información de seguimiento detallada, permitiéndote ver el camino exacto que tomó una solicitud a través de la malla y dónde pudieron haber ocurrido problemas.

Además de sus características de observabilidad, Kiali proporciona varias otras herramientas para gestionar tu malla de servicios. Por ejemplo, incluye un módulo de gestión de tráfico, que te permite controlar fácilmente el flujo de tráfico a través de tu malla, y un módulo de gestión de configuración, que te ayuda a gestionar y mantener los diversos componentes de tu malla.

En general, Kiali es una herramienta esencial para cualquiera que use una malla de servicios Istio. Proporciona valiosos conocimientos sobre la estructura y el comportamiento de tu malla, así como potentes herramientas de monitoreo y gestión. Ya sea que estés comenzando con Istio o seas un usuario experimentado, Kiali puede ayudar a garantizar que tu malla de servicios funcione de manera fluida y eficiente.

¿Cuáles son los principales beneficios de usar Kiali?

Los principales beneficios de usar Kiali son:

  • Mejorada observabilidad de tu malla de servicios Istio. Kiali proporciona una representación gráfica de tu malla, mostrando las relaciones entre diferentes componentes de la malla de servicios y mostrando métricas clave. Esto te permite entender rápidamente la estructura y el comportamiento de tu malla e identificar posibles problemas.
  • Facilita la resolución de problemas. La visualización de Kiali de la comunicación de servicio a servicio y la información de seguimiento detallada facilitan la identificación de problemas con la comunicación de servicios y localizar la fuente de cualquier problema.
  • Mejorada gestión del tráfico. Kiali incluye un módulo de gestión de tráfico que te permite controlar fácilmente el flujo de tráfico a través de tu malla.
  • Mejorada gestión de configuración. El módulo de gestión de configuración de Kiali te ayuda a gestionar y mantener los diversos componentes de tu malla.

¿Cómo instalar Kiali?

Hay varias formas de instalar Kiali como parte de tu implementación de Malla de Servicios, siendo la opción preferida usar el modelo de Operador disponible aquí.

Puedes instalar este operador usando Helm o OperatorHub. Para instalarlo usando Helm Charts, necesitas agregar el siguiente repositorio usando este comando:

 helm repo add kiali https://kiali.org/helm-charts

** Recuerda que una vez que agregues un nuevo repositorio, necesitas ejecutar el siguiente comando para actualizar los charts disponibles

helm repo update

Ahora, puedes instalarlo usando el comando helm install tal como en el siguiente ejemplo:

helm install 
    --set cr.create=true 
    --set cr.namespace=istio-system 
    --namespace kiali-operator 
    --create-namespace 
    kiali-operator 
    kiali/kiali-operator

Si prefieres seguir la ruta de OperatorHub, puedes usar la siguiente URL . Ahora, al hacer clic en el botón de Instalar, verás los pasos para tener el componente instalado en tu entorno de Kubernetes.

Kiali 101: Comprendiendo y Utilizando esta Herramienta Esencial de Gestión de Malla de Servicios

En caso de que desees una instalación simple de Kiali, también puedes usar el YAML de muestra disponible dentro de la carpeta de instalación de Istio usando el siguiente comando:

kubectl apply -f $ISTIO_HOME/samples/addons/kiali.yaml

¿Cómo funciona Kiali?

Kiali es solo la representación gráfica de la información disponible sobre cómo funciona la malla de servicios. Por lo tanto, no es responsabilidad de Kiali almacenar esas métricas, sino recuperarlas y dibujarlas de manera relevante para el usuario de la herramienta.

Prometheus realiza el almacenamiento de estos datos, por lo que Kiali utiliza la API REST de Prometheus para recuperar la información y dibujarla gráficamente, como puedes ver aquí:

  • Va a mostrar varias partes relevantes del gráfico. Mostrará el espacio de nombres seleccionado y dentro de ellos las diferentes aplicaciones (detectará una aplicación en caso de que tengas una etiqueta agregada a la carga de trabajo con el nombre app ). Dentro de cada aplicación se agregarán diferentes servicios y pods con otros íconos (triángulos para los servicios y cuadrados para los pods).
  • También mostrará cómo el tráfico llega al clúster a través de las diferentes puertas de enlace de entrada y cómo sale en caso de que tengamos alguna puerta de enlace de salida configurada.
  • Mostrará el tipo de tráfico que estamos manejando y las diferentes tasas de error basadas en el tipo de protocolo, como TCP, HTTP, y así sucesivamente, como puedes ver en la imagen a continuación. El protocolo se decide en base a una convención de nombres en el nombre del puerto del servicio con el formato esperado: nombre-del-protocolo
Kiali 101: Comprendiendo y Utilizando esta Herramienta Esencial de Gestión de Malla de Servicios

¿Puede Kiali usarse con cualquier malla de servicios?

No, Kiali está diseñado específicamente para su uso con mallas de servicios Istio.

Proporciona herramientas de observabilidad, monitoreo y gestión para mallas de servicios Istio, pero no es compatible con otras tecnologías de malla de servicios.

Si usas una malla de servicios diferente, necesitarás encontrar una herramienta adicional para gestionarla y monitorearla.

¿Existen otras alternativas a Kiali?

Aunque no puedas ver alternativas naturales a Kiali para visualizar tus cargas de trabajo y tráfico a través de la Malla de Servicios Istio, puedes usar otras herramientas para obtener las métricas que alimentan a Kiali y tener una visualización personalizada usando herramientas más genéricas como Grafana, entre otras.

Hablemos de herramientas similares a Kiali para otras Mallas de Servicios, como Linkerd, Consul Connect, o incluso Kuma. La mayoría sigue un enfoque diferente donde la parte de visualización no es un «proyecto» separado, sino que se basa en una herramienta de visualización estándar. Eso te da mucha más flexibilidad, pero al mismo tiempo, carece de la excelente visualización del tráfico que proporciona Kiali, como vistas de gráficos o la capacidad de modificar el tráfico directamente desde la vista de gráficos.

📚 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.

Plantillas de Helm en Archivos: Cómo Personalizar el Contenido de ConfigMaps Simplificado en 10 Minutos

Plantillas de Helm en Archivos: Cómo Personalizar el Contenido de ConfigMaps Simplificado en 10 Minutos

Las plantillas de Helm en archivos, como el contenido de ConfigMaps o el contenido de Secrets, son uno de los requisitos más comunes cuando estás en el proceso de crear un nuevo helm chart. Como ya sabes, el Helm Charts es cómo usamos Kubernetes para empaquetar nuestros recursos de aplicación y YAML en un solo componente que podemos gestionar de una vez para facilitar el proceso de mantenimiento y operación.

Visión General de las Plantillas de Helm

Por defecto, el proceso de plantillas funciona con archivos YAML, permitiéndonos usar algunas variables y algunas funciones lógicas para personalizar y templar nuestros recursos YAML de Kubernetes según nuestras necesidades.

Entonces, en resumen, solo podemos tener archivos yaml dentro de la carpeta de plantillas de un YAML. Pero a veces nos gustaría hacer el mismo proceso en ConfigMaps o Secrets o ser más concretos con el contenido de esos ConfigMaps, por ejemplo, archivos de propiedades y así sucesivamente.

Plantillas de Helm en Archivos: Cómo Personalizar el Contenido de ConfigMaps Simplificado
Plantillas de Helm en Archivos: Visión General de las Plantillas de Helm mostrando los Archivos fuera de las plantillas que usualmente se requieren

Como puedes ver, es bastante normal tener diferentes archivos como archivos de configuración json, archivos de propiedades, scripts de shell como parte de tu helm chart, y la mayoría de las veces te gustaría dar un enfoque dinámico a su contenido, y es por eso que usar Plantillas de Helm en Archivos es tan importante para ser el enfoque principal de este artículo

Funciones de Ayuda de Helm para Gestionar Archivos

Por defecto, Helm nos proporciona un conjunto de funciones para gestionar archivos como parte del helm chart para simplificar el proceso de incluirlos como parte del gráfico, como el contenido de ConfigMap o Secret. Algunas de estas funciones son las siguientes:

  • .Files.Glob: Esta función permite encontrar cualquier patrón de archivos internos que coincida con el patrón, como el siguiente ejemplo:
    { range $path, $ := .Files.Glob ".yaml" }
  • .Files.Get: Esta es la opción más simple para reunir el contenido de un archivo específico que conoces la ruta completa dentro de tu helm chart, como el siguiente ejemplo: {{ .Files.Get "config1.toml" | b64enc }}

Incluso puedes combinar ambas funciones para usarlas juntas como en el siguiente ejemplo:

 {{ range $path, $_ :=  .Files.Glob  "**.yaml" }}
      {{ $.Files.Get $path }}
{{ end }}

Luego puedes combinar eso una vez que tengas el archivo que deseas usar con algunas funciones de ayuda para introducir fácilmente en un ConfigMap y un Secret como se explica a continuación:

  • .AsConfig : Usa el contenido del archivo para ser introducido como ConfigMap manejando el patrón: nombre-del-archivo: contenido-del-archivo
  • .AsSecrets: Similar al anterior, pero haciendo la codificación base64 para los datos.

Aquí puedes ver un ejemplo real de usar este enfoque en una situación real de helm chart

apiVersion: v1
kind: Secret
metadata:
  name: zones-property
  namespace: {{ $.Release.Namespace }}
data: 
{{ ( $.Files.Glob "tml_zones_properties.json").AsSecrets | indent 2 }} 

Puedes encontrar más información sobre eso aquí. Pero esto solo nos permite tomar el archivo tal cual e incluirlo en un ConfigMap. No nos permite hacer ninguna lógica o sustitución al contenido como parte de ese proceso. Entonces, si queremos modificar esto, este no es un ejemplo válido.

¿Cómo Usar Plantillas de Helm en Archivos como ConfigMaps o Secrets?

En caso de que podamos hacer algunas modificaciones al contenido, necesitamos usar la siguiente fórmula:

apiVersion: v1
kind: Secret
metadata:
  name: papi-property
  namespace: {{ $.Release.Namespace }}
data:
{{- range $path, $bytes := .Files.Glob "tml_papi_properties.json" }}
{{ base $path | indent 2 }}: {{ tpl ($.Files.Get $path) $ | b64enc }}
{{ end }}

Entonces, lo que estamos haciendo aquí es primero iterar por los archivos que coinciden con el patrón usando la función .Files.Glob que explicamos antes, iterando en caso de que tengamos más de uno. Luego creamos manualmente la estructura siguiendo el patrón: nombre-del-archivo: contenido-del-archivo.

Para hacer eso, usamos la función base para proporcionar solo el nombre del archivo desde una ruta completa (y agregar la indentación adecuada) y luego usamos .Files.Get para obtener el contenido del archivo y hacer la codificación base64 usando la función b64enc porque, en este caso, estamos manejando un secreto.

El truco aquí es agregar la función tpl que permite que el contenido de este archivo pase por el proceso de plantillas; así es como todas las modificaciones que necesitamos hacer y las variables referenciadas desde el objeto .Values serán reemplazadas adecuadamente, dándote todo el poder y flexibilidad del helm chart en archivos de texto como propiedades, archivos JSON y mucho más.

¡Espero que esto sea tan útil para ti como lo ha sido para mí al crear nuevos gráficos de helm! Y mira aquí para otros trucos usando bucles en helm o dependencias de helm.

Nomad vs Kubernetes: 1 contendiente emergente desafiando al rey probado

Nomad vs Kubernetes: 1 contendiente emergente desafiando al rey probado

Nomad es la alternativa de Hashicorp al patrón típico de usar una plataforma basada en Kubernetes como la única forma de orquestar tus cargas de trabajo de manera eficiente. Nomad es un proyecto iniciado en 2019, pero está ganando mucha más relevancia hoy en día después de 95 lanzamientos, y la versión actual de este artículo es 1.4.1, como puedes ver en su perfil de GitHub.

Nomad aborda los desafíos tradicionales de aislar el ciclo de vida de la aplicación para el ciclo de vida de operación de la infraestructura donde reside esa aplicación. Sin embargo, en lugar de ir completamente a una aplicación basada en contenedores, intenta proporcionar una solución de manera diferente.

¿Cuáles son las principales características de Nomad?

Basado en su propia definición, como puedes leer en su perfil de GitHub, ya destacan algunos de los puntos de diferencia con respecto al estándar de facto de la industria:

Nomad es un orquestador de cargas de trabajo fácil de usar, flexible y de alto rendimiento que puede desplegar una mezcla de aplicaciones de microservicios, por lotes, contenedorizadas y no contenedorizadas

Fácil de usar: Esta es la primera afirmación que incluyen en su definición porque el enfoque de Nomad es mucho más simple que alternativas como Kubernetes porque funciona con un enfoque de binario único donde tiene todas las capacidades necesarias ejecutándose como un agente de nodo basado en su propio «vocabulario» que puedes leer más en su documentación oficial.

Flexibilidad: Esta es la otra cosa crítica que proporcionan, un hipervisor, una capa intermedia entre la aplicación y la infraestructura subyacente. No se limita solo a aplicaciones de contenedores, sino que también admite este tipo de despliegue. También permite desplegarlo como parte de un enfoque tradicional de máquina virtual. Los casos de uso principales destacados son ejecutar aplicaciones estándar de Windows, lo cual es complicado cuando se habla de despliegues de Kubernetes; aunque los contenedores de Windows han sido una cosa durante mucho tiempo, su adopción no está al mismo nivel, como puedes ver en el mundo de los contenedores de Linux.

Integración con Hashicorp: Como parte del portafolio de Hashicorp, también incluye una integración perfecta con otros proyectos de Hashicorp como Hashicorp Vault, que hemos cubierto en varios artículos, o Hashicorp Consul, que ayuda a proporcionar capacidades adicionales en términos de seguridad, gestión de configuración y comunicación entre las diferentes cargas de trabajo.

Nomad vs Kubernetes: ¿Cómo funciona Nomad?

Como se comentó anteriormente, Nomad cubre todo con un enfoque de componente único. Un binario de Nomad es un agente que puede trabajar en modo servidor o modo cliente, dependiendo del rol de la máquina que lo ejecuta.

Así que Nomad se basa en un clúster de Nomad, un conjunto de máquinas que ejecutan un agente de Nomad en modo servidor. Esos servidores se dividen dependiendo del rol de líder o seguidores. El líder realiza la mayor parte de la gestión del clúster, y los seguidores pueden crear planes de programación y enviarlos al líder para su aprobación y ejecución. Esto se representa en la imagen a continuación de la página oficial de Hashicorp Nomad:

Nomad vs Kubernetes: 1 Contendiente Contra el Rey de la Orquestación
Arquitectura simple de Nomad de nomadproject.io

Una vez que tenemos el clúster listo, necesitamos crear nuestros trabajos, y un trabajo es una definición de la tarea que nos gustaría ejecutar en el clúster de Nomad que hemos configurado previamente. Una tarea es la unidad de trabajo más pequeña en Nomad. Aquí es donde la flexibilidad llega a Nomad porque el controlador de tareas ejecuta cada tarea, permitiendo que diferentes controladores ejecuten varias cargas de trabajo. Así es como siguiendo el mismo enfoque, tendremos un controlador de Docker para ejecutar nuestro despliegue de contenedores o un controlador de ejecución para ejecutarlo sobre una infraestructura virtual. Aún así, puedes crear tus controladores de tareas siguiendo un mecanismo de complementos que puedes leer más sobre aquí.

Los trabajos y las tareas se definen utilizando un enfoque basado en texto, pero no siguiendo el tipo habitual de archivos YAML o JSON, sino un formato diferente, como puedes ver en la imagen a continuación (haz clic aquí para descargar el archivo completo del repositorio de muestras de GitHub Nomad):

 ¿Es Nomad un reemplazo para Kubernetes?

Es una pregunta compleja de responder, e incluso Hashicorp ha documentado diferentes estrategias. Sin duda, puedes usar Nomad para ejecutar despliegues basados en contenedores en lugar de ejecutarlos en Kubernetes. Pero al mismo tiempo, también posicionan la solución junto a Kubernetes para ejecutar algunas cargas de trabajo en una solución y otras en la otra.

Al final, ambos intentan resolver y abordar los mismos desafíos en términos de escalabilidad, compartición y optimización de infraestructura, agilidad, flexibilidad y seguridad de los despliegues tradicionales.

Kubernetes se centra en diferentes tipos de cargas de trabajo, pero todo sigue el mismo modo de despliegue (basado en contenedores) y adopta paradigmas recientes (basados en servicios, patrones de microservicios, liderados por API, etc.) con una arquitectura robusta que permite una excelente escalabilidad, rendimiento, flexibilidad y con niveles de adopción en la industria que se ha convertido en la única alternativa de facto actual para plataformas modernas de orquestación de cargas de trabajo.

Pero, al mismo tiempo, también requiere esfuerzo en la gestión y transformación de aplicaciones existentes a nuevos paradigmas.

Por otro lado, Nomad intenta abordarlo de manera diferente, minimizando el cambio de la aplicación existente para aprovechar los beneficios de la plataforma y reduciendo la sobrecarga de gestión y complejidad que una plataforma de Kubernetes habitual proporciona, dependiendo de la situació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.

DevSecOps vs DevOps: Fundamentos y Diferencias Respondiendo a 3 Preguntas

DevSecOps vs DevOps: Fundamentos y Diferencias Respondiendo a 3 Preguntas

DevSecOps vs. DevOps: Diferencias y Similitudes Respondiendo 3 Preguntas

DevSecOps es un concepto que probablemente has escuchado extensamente en los últimos meses. Lo verás en alineación con la idea tradicional de DevOps. Esto probablemente, en algún momento, te hace preguntarte sobre una comparación entre DevSecOps y DevOps, incluso tratando de entender cuáles son las principales diferencias entre ellos o si son el mismo concepto. Y también, con otras ideas comenzando a aparecer, como Ingeniería de Plataformas o Confiabilidad del Sitio, está comenzando a crear algo de confusión en el campo que me gustaría aclarar hoy en este artículo.

¿Qué es DevSecOps?

DevSecOps es una extensión del concepto y metodología DevOps. Ahora, no es un esfuerzo conjunto entre las prácticas de Desarrollo y Operación, sino un esfuerzo conjunto entre Desarrollo, Operación y Seguridad.

DevSecOps vs DevOps: Fundamentos y Diferencias Respondiendo a 3 Preguntas
Diagrama por GeekFlare: Una Introducción a DevSecOps (https://geekflare.com/devsecops-introduction/)

Implica introducir políticas, prácticas y herramientas de seguridad para asegurar que los ciclos de DevOps proporcionen seguridad a lo largo de este proceso. Ya comentamos sobre incluir componentes de seguridad para proporcionar un proceso de despliegue más seguro. Incluso tenemos artículos específicos sobre estas herramientas, como escáneres, registros de docker, etc.

¿Por qué es importante DevSecOps?

DevSecOps, o para ser más explícitos, incluir prácticas de seguridad como parte del proceso DevOps, es crítico porque nos estamos moviendo hacia arquitecturas híbridas y en la nube donde incorporamos nuevos patrones de diseño, despliegue y desarrollo como contenedores, microservicios, y así sucesivamente.

Esta situación hace que nos movamos de un lado a tener cientos de aplicaciones en los casos más complejos a miles de aplicaciones, y de tener docenas de servidores a miles de contenedores, cada uno de ellos con diferentes imágenes base y bibliotecas de terceros que pueden estar obsoletas, tener un agujero de seguridad o simplemente surgir nuevas vulnerabilidades como hemos visto en el pasado con el Spring Framework o la biblioteca Log4J para mencionar algunos de los problemas de seguridad globales sustanciales más recientes que las empresas enfrentaron.

Así que, incluso el equipo de seguridad más extenso no puede estar al ritmo revisando manualmente o con un conjunto de scripts todos los diferentes nuevos desafíos a la seguridad si no los incluimos como parte del proceso general de desarrollo y despliegue de los componentes. Aquí es donde el concepto de seguridad de cambio a la izquierda suele considerarse, y ya cubrimos eso en este artículo que puedes leer aquí.

DevSecOps vs DevOps: ¿Es DevSecOps solo DevOps actualizado?

Así que, basado en la definición anterior, puedes pensar: «Ok, entonces cuando alguien habla de DevOps no está pensando en seguridad». Esto no es cierto.

En el mismo aspecto, cuando hablamos de DevOps, no es explícitamente todos los pasos detallados, como aseguramiento de calidad del software, pruebas unitarias, etc. Así que, como sucede con muchas extensiones en esta industria, el concepto original, global o genérico incluye también los contenidos de las alas.

Así que, al final, DevOps y DevSecOps son lo mismo, especialmente hoy cuando todas las empresas y organizaciones se están moviendo a la nube o entornos híbridos donde la seguridad es crítica y no negociable. Por lo tanto, cada tarea que hacemos, desde desarrollar software hasta acceder a cualquier servicio, necesita hacerse con la Seguridad en mente. Pero usé ambos conceptos en diferentes escenarios. Usaré DevSecOps cuando me gustaría resaltar explícitamente el aspecto de seguridad debido a la audiencia, el contexto o el tema que estamos discutiendo para hacer diferenciación.

Aún así, en cualquier contexto genérico, DevOps incluirá las verificaciones de seguridad que se mantendrán con seguridad porque si no es así, simplemente es inútil. Yo.

 Resumen

Así que, al final, cuando alguien habla hoy sobre DevOps, implícitamente incluye el aspecto de seguridad, por lo que no hay diferencia entre ambos conceptos. Pero verás y también encontrarás útil usar el término específico DevSecOps cuando quieras resaltar o diferenciar esta parte del proceso.

Trivy: Logra escanear imágenes locales de Docker con éxito

Trivy: Logra escanear imágenes locales de Docker con éxito

Escanear imágenes de Docker o, para ser más honestos, escanear tus imágenes de contenedores se está convirtiendo en una de las tareas cotidianas a realizar como parte del desarrollo de tu aplicación. El cambio de ritmo de cuán fácilmente surgen las nuevas vulnerabilidades, la explosión de dependencias que tiene cada una de las imágenes de contenedores y la cantidad de implementaciones por empresa hacen que sea bastante complejo mantener el ritmo para asegurar que puedan mitigar los problemas de seguridad.

Ya cubrimos este tema hace algún tiempo cuando la herramienta Docker Desktop introdujo la opción de escaneo basada en una integración con Synk y, más recientemente, con el último lanzamiento de Lens. Esta es una de las opciones para verificar las imágenes de contenedores de la versión “corporativa” de la herramienta. Y desde hace algún tiempo también, los registros centrales de la Nube han proporcionado tal como un ECR, incluyendo la opción de Escaneo como una de las capacidades para cualquier imagen implementada allí.

Pero, ¿qué pasa si ya te estás moviendo de Docker Desktop a otra opción, como podman o Rancher Desktop? ¿Cómo puedes escanear tus imágenes de docker?

Varios escáneres pueden usarse para escanear tus imágenes de contenedores localmente, y algunos de ellos son más fáciles de configurar que otros. Uno de los más conocidos es Clair, que también se está utilizando como parte del registro RedHat Quay y tiene mucha tracción. Funciona en un modo cliente-servidor que es excelente para ser utilizado por diferentes equipos que requieren una implementación más “empresarial”, generalmente estrechamente relacionada con un Registro. Sin embargo, no se adapta bien para ejecutarse localmente ya que requiere varios componentes y relaciones.

Como una opción fácil para probar localmente, tienes Trivy. Trivy es una herramienta interesante desarrollada por AquaSecurity. Puede que recuerdes la empresa ya que es la que está detrás de otros desarrollos relacionados con la seguridad en Kubernetes, como KubeBench, que ya cubrimos en el pasado.

En sus propias palabras, “Trivy es un escáner de seguridad integral. Es confiable, rápido y sencillo de usar y funciona donde lo necesites.”

¿Cómo instalar Trivy?

El proceso de instalación es relativamente fácil y está documentado para cada plataforma importante aquí. Sin embargo, al final, se basa en paquetes binarios disponibles como RPM, DEB, Brew, MacPorts, o incluso una imagen de Docker.

¿Cómo escanear imágenes de Docker con Trivy?

Una vez instalado, puedes simplemente ejecutar los comandos como este:

 trivy image python:3.4-alpine

Esto realizará las siguientes tareas:

  • Actualizar la base de datos del repositorio con todas las vulnerabilidades
  • Descargar la imagen en caso de que no esté disponible localmente
  • Detectar los lenguajes y componentes presentes en esa imagen
  • Validar las imágenes y generar un resultado

¿Qué salida proporciona Trivy?

Como ejemplo, esta es la salida para el python:3.4-alpine a partir de hoy:

Escanear imágenes de Docker con Trivy

Obtendrás una tabla con una fila por cada biblioteca o componente que haya detectado una vulnerabilidad mostrando el nombre de la Biblioteca y la exposición relacionada con ella con el código CVE. El código CVE es generalmente cómo se refieren a las vulnerabilidades ya que están presentes en un repositorio común con todas sus descripciones y detalles. Además de eso, muestra la severidad de la vulnerabilidad basada en el informe existente. También proporciona la versión actual detectada en la imagen y en caso de que haya una versión diferente que haya solucionado esa vulnerabilidad, la versión inicial que ha resuelto esa vulnerabilidad, y finalmente, un título para proporcionar un poco más de contexto sobre la vulnerabilidad:

Trivy: Logra escanear imágenes locales de Docker con éxito

Si una Biblioteca está relacionada con más de una vulnerabilidad, dividirá las celdas en esa fila para acceder a los diferentes datos para cada vulnerabilidad.

📚 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.