Contenedores Big Data con Kubernetes

El landscape de las herramientas de Big Data cada día es más diversificado e interesante. Uno de los principales desafíos que conlleva la aparición de nuevas soluciones y plataformas tecnológicas, es la administración e integración de los diferentes componentes que forman parte de la infraestructura implementada por la organización.

Si estás leyendo este artículo, pero no tienes muchas nociones acerca del Big Data, te invito a leer Qué es Big Data.

Antes de empezar a hablar sobre Contenedores Big Data con Kubernetes, considero importante introduciros brevemente al origen del tema. Si alguna vez has desarrollado aplicaciones de software estarás familiarizado con la necesidad de hacerles cambios periódicos que inicialmente pruebas en tu entorno local, que posteriormente debes pasarlo al entorno de producción donde serán usados por los usuarios finales. Hacer cambios en producción puede ser delicado si algo falla y ocasiona que nuestra aplicación no pueda ser utilizada.

Una forma de simplificar el desarrollo de aplicaciones es a través de microservicios, que consisten en pequeñas piezas separadas de nuestra aplicación que ejecutan un servicio (actividad) específico, y se comunican con la aplicación mediante una interfaz API REST a la que le enviamos una petición con ciertos parámetros predefinidos para obtener una respuesta (información). Un microservicio funciona con cierta independencia al resto de la aplicación, ya que tiene sus propias dependencias y entorno donde alojarse, ejemplo máquinas virtuales o contenedores. Hacer un cambio en un microservicio, genera un menor impacto en nuestra aplicación en producción porque de cierto modo se encuentra desacoplado.

Ahora bien, la arquitectura de las plataformas de Big Data requiere procesar y atender lotes de cientos de millones de transacciones simultáneamente, con lo cual una aplicación alojada en un entorno con recursos limitados puede colapsar y quedar inactiva. Dar soporte a la creciente generación de datos, ha sido un tema prioritario en las grandes empresas como Google, la cual ha dedicado años de investigación para desarrollar soluciones eficientes como los contenedores con Kubernetes.

Antes de continuar, veamos algunos aspectos básicos acerca de los contenedores.

Aprende las técnicas más avanzadas en análisis de datos
Comienza 15 días gratis en OpenWebinars y accede a cursos, talleres y laboratorios prácticos de Hadoop, Spark, Power BI, Pandas, R y más.
Registrarme ahora

¿Qué es un contenedor?

Google define un contenedor como un “mecanismo de empaquetado lógico en el que las aplicaciones pueden extraerse del entorno en que realmente se ejecutan”. El objetivo es lograr que las aplicaciones, ejecutadas en un contenedor, tengan independencia de la infraestructura donde se encuentren, y sean portátiles, escalables y con alto rendimiento (tiempos de ejecución óptimos).

Si conoces cómo trabajan los ambientes virtuales, podrás identificar ciertas similitudes con los contenedores, dado que sobre el sistema operativo de un host anfitrión (servidor o estación de trabajo) se instala la máquina virtual con un segundo sistema operativo (más ligero) con librerías propias, configuradas para administrar y ejecutar las aplicaciones-microservicios con recursos independientes.

Vale la pena mencionar que, la construcción de un contenedor es más flexible a la de una máquina virtual, debido a que no se encuentran acoplados al sistema operativo ni restringidos por la infraestructura del host anfitrión, por lo que es posible la portabilidad entre diversas distribuciones de sistemas operativos y/o el cloud.

Para la administración de contenedores, se crean clústeres con su ambiente de automatización y escalabilidad. La gestión de múltiples hosts se hace a través de una unidad de administración central donde se conectan varios hosts en clústeres. Esta unidad de administración recibe el nombre de Orquestador de Contenedores.

Ahora que hemos visto de qué se tratan los contenedores, pasemos a ver el concepto de Kubernetes y su funcionamiento.

¿Qué es Kubernetes?

El término “Kubernetes” proviene de un antiguo vocablo griego que se traduce como “timonel” y eso es así porque Google lo desarrolló como una plataforma para “manejar” o, como popularmente se conoce, “orquestar” la carga de trabajo de los servicios de clústeres y contenedores de forma automática. Otro nombre con que se llama a Kubernetes es por la abreviación “K8s” donde se usa el número 8 para sustituir las ocho letras “ubernete”.

El concepto “orquestación” se encuentra definido en el sitio de web de Kubernetes como: “la ejecución de un flujo de trabajo definido: haz A, luego B y entonces C”. Si bien Kubernetes es un sistema de orquestación, fue diseñado para suprimir la necesidad de orquestar, debido a que no necesita centralizar el control gracias a que está compuesto por un conjunto de procesos de control independientes que se integran entre sí para transferir la carga de trabajo desde un estado original hacia el estado esperado.

Kubernetes es una plataforma nativa de ecosistemas en la nube y de código abierto que se descarga de forma gratuita y permite ser modificada según sea el caso. Nace a partir de un proyecto para la CNCF (Cloud Native Computing Foundation) por los ingenieros Joe Beda, Brendan Burns y Craig McLuckie de Google. Fue lanzado en la DockerCon por el VP Infrastructure & Google Fellow, Eric Brewer en el 2014.

Kubernetes proporciona un modelo estable y portátil para construir flujos de trabajo personalizados, conservando la flexibilidad y la elección de los usuarios en los aspectos más importantes. La flexibilidad que ofrece Kubernetes ayuda a las empresas a equilibrar sus costos y la seguridad de sus infraestructuras.

¿Por qué Kubernetes?

Tradicionalmente, los desarrolladores realizaban los despliegues (actualizaciones) de sus aplicaciones ejecutando archivos de configuración con los componentes y librerías necesarios, considerando que estos tenían que ser compatibles con el sistema operativo del servidor donde estaban instaladas. Posteriormente, al implementar microservicios en máquinas virtuales se obtuvieron ciertas ventajas, pero no del todo suficientes porque las máquinas virtuales pueden ser pesadas y tienen limitación para escalar, razones importantes por las que hoy muchas empresas trabajan con contenedores.

Como vimos anteriormente, los contenedores son más ligeros y rápidos que una máquina virtual, y dado que un contenedor solo empaqueta a una aplicación, es posible administrar el despliegue de la aplicación con tan solo administrar el contenedor.

A pesar de que la orquestación manual de contenedores es posible mediante el desarrollo de scripts y funciona correctamente al inicio de nuestra implementación, utilizar orquestadores como Kubernetes es una alternativa obvia cuando hablamos de facilitar la orquestación de cientos de contenedores (o incluso miles), y el escalado de los componentes que conforman nuestro ecosistema.

En este contexto, el concepto de escalabilidad o “escalar la aplicación” se refiere a ajustar verticalmente el número de copias de contenedores en un archivo de configuración, es decir, incrementarlo cuando el volumen de peticiones sobre la aplicación es alto o reducirlo cuando sea menor.

Con Kubernetes es posible realizar el escalado de forma automática lo cual puede ser muy conveniente para las empresas, a fin de reducir la complejidad de monitorear en tiempo real, el nivel de la carga del CPU y el consumo de memoria del sistema. Kubernetes genera métricas del estado de los clústeres para balancear y distribuir el flujo de trabajo de forma equilibrada entre las réplicas de los contenedores garantizando la estabilidad y disponibilidad de la infraestructura.

Google ofrece los siguientes productos de Kubernetes según el entorno de trabajo:

  • Para el cloud: Google Kubernetes Engine (GKE), servicio empleado para ejecutar aplicaciones en contenedores e implementar una gestión óptima de la carga de trabajo en la nube.

  • Para cualquier otro lugar: GKE On-Prem, que permite ejecutar clústeres de Kubernetes para aplicaciones on-premise, en la nube u otro lugar.

Entre las soluciones de orquestación de contenedores que actualmente podemos encontrar en el mercado, además de Kubernetes, podemos listar algunas como:

  • Amazon Elastic Container Service (ECS): Ofrecido por Amazon Web Services (AWS) para ejecutar contenedores a escala. Además, ofrece Amazon Elastic Kubernetes Service (EKS) como un servicio gestionado por Kubernetes.

  • Azure Container Instance (ACI): Ofrecido por Microsoft Azure para la de orquestación de contenedores. Además, ofrece Azure Kubernetes Service (AKS) como un servicio administrado por Kubernetes.

  • Docker Swarm: Ofrecido por Docker, Inc. como parte de Docker Engine para orquestar los contenedores.

  • Istio: Ofrecido por IBM para supervisar y conectar contenedores en un clúster de Kubernetes. Además, ofrece IBM Cloud Kubernetes Service para crear, desplegar y administrar contenedores en el IBM Cloud.

  • Marathon: Ofrecido por Mesosphere y Apache Mesos para la orquestación de contenedores a escala de OS.

  • Nomad: Ofrecido por HashiCorp para la orquestación de cargas de trabajo y administrar contenedores.

  • OpenShift Container Platform: Ofrecido por Red Hat para construir y escalar las aplicaciones en contenedores en la nube. Además, ofrece OpenShift Kubernetes Engine para implementar clústeres de Kubernetes.

Arquitectura y componentes de Kubernetes

A la implementación de Kubernetes en funcionamiento se le denomina clúster. Un clúster en ejecución tiene uno o más de los siguientes componentes:

  • Plano de control: Encargado de los elementos que administrar el clúster, su estado y configuración para garantizar que el clúster se ejecute acorde a la configuración dada.

  • Nodo: Encargado de la ejecución del tiempo de contenedor con el agente kubelet que garantiza que los contenedores se ejecuten en un Pod y se comunica con el plano de control.

En este punto, en importante introducir algunos conceptos claves para comprender mejor como funciona Kubernetes:

  • Un clúster es un conjunto de nodos que ejecutan una o varias instancias de las aplicaciones en contenedores. Los clústeres contienen un plano de control (nodo master o principal) y varios nodos trabajadores (workers). Para que un clúster esté operativo deben existir al menos un nodo principal y un nodo trabajador.

  • Un nodo es una máquina de trabajo física o virtual donde se encuentran las aplicaciones en los contenedores y otras cargas de trabajo. Anteriormente, se le denominaba como minion.

  • Una imagen del contenedor es una representación estática de la aplicación con sus dependencias y configuración.

  • Un registro de imágenes es una biblioteca de las imágenes del contenedor que el plano de control utiliza para transferirlas a los nodos donde se ejecutan en los Pods.

  • Un Pod es una instancia única de una aplicación y representa la unidad de implementación más pequeña de la plataforma de objetos de un clúster de Kubernetes. Cada Pod puede incluir uno o muchos contenedores con conexión directa, y también pueden conectarse a un almacenamiento permanente. Cada Pod genera una dirección IP propia e incluye sus opciones de configuración.

  • Un espacio de nombres es un método para organizar diferentes clústeres virtuales dentro de un solo clúster físico y dividir sus recursos entre diferentes equipos mediante las cuotas de recursos.

(Imagen propiedad de Red Hat)

En las siguientes líneas, describiré brevemente los diferentes componentes de la arquitectura:

Arquitectura del plano de control - Formada por estos servicios:

  1. kube-apiserver: Proporciona la interfaz del API de Kubernetes, por donde pasan todas las comunicaciones del panel de control y el nodo, además de las comunicaciones externas mediante interfaces de usuario (UI) o línea de comandos.
  2. kube-controller-manager: Compila todas las varias funciones de los controladores del clúster.
  3. kube-scheduler: Asigna al nodo, un Pod para su ejecución considerando aspectos como la carga de trabajo, las políticas, los recursos, entre otros.
  4. etcd: Guarda los datos y el estado persistente del clúster en un sistema de almacenamiento distribuido para ofrecer una alta disponibilidad.

Arquitectura del nodo - Formada por estos controladores:

  1. kubelet: Garantiza que los contenedores se ejecuten y funcionen correctamente en un Pod.
  2. kube-proxy: Implementa la comunicación de los Pods a través de la gestión de la conectividad de la red, y mantiene las reglas de la red en todos los nodos.
  3. container runtime interface: Ejecuta las aplicaciones en los contenedores.

Arquitectura de otros controladores

  1. Clúster DNS: Suministra los registros DNS para acceder a los servicios de Kubernetes.
  2. Container Resource Monitoring: Almacena métricas de los contenedores en una base de datos central.
  3. Deployments: Implementa los cambios de estado para los Pods y los ReplicaSets de forma ordenada.
  4. ReplicaSet: Mantiene la ejecución de una cantidad específica de Pods idénticos (réplicas) en un momento específico.

Big Data y Kubernetes

En entornos de Big Data, las aplicaciones deben ser rápidas, seguras, fáciles de administrar y escalar. El balance y distribución de la carga de trabajo, en una infraestructura de Big Data, es un factor primordial con el que se enfrentan las empresas porque necesitan conservar la estabilidad y disponibilidad de sus sistemas en producción. Por este motivo, la implementación de aplicaciones de Big Data con contenedores Docker y Kubernetes ha tenido mucha popularidad en los últimos años.

Kubernetes es una plataforma versátil y según la industria, permite construir infraestructuras para el manejo de aplicaciones con alto volumen de datos y carga de trabajo a gran escala, como por ejemplo en aplicaciones para el análisis de datos geográficos, aplicaciones de e-commerce, aplicaciones con servicios de streaming y en aplicaciones con modelos de inteligencia artificial.

Las empresas con que implementan plataformas de Big Data con y Kubernetes obtienen beneficios como:

  1. La agilidad para automatizar despliegues/reversiones frecuentes y sin interrupciones de las aplicaciones.
  2. La simplificación de las tareas de los usuarios de IT para integrar nuevas aplicaciones y hacer los mantenimientos de la infraestructura.
  3. La tolerancia a fallos mediante la ejecución de comprobaciones del estado de los contenedores, y su restauración automática cuando fallan (rollbacks).
  4. La escalabilidad según la demanda lo que garantiza que solo se ejecuta lo que se necesita y cuando se necesita.
  5. La eficiencia en la gestión de los recursos de los clústeres y la facilidad para administrar y/o replicar las versiones de la configuración.
  6. La portabilidad entre los entornos físicos, virtualizados y los diferentes proveedores de la nube para asegurar la consistencia entre los entornos de desarrollo, pruebas y producción.
  7. La implementación de políticas de seguridad para restringir el acceso a las aplicaciones dentro de los contenedores.
  8. La independencia (aislamiento de control) de los contenedores de un clúster y del host donde está implementado.
  9. La apertura de su código para permitir que otros sistemas sean diseñados a partir de este.
  10. La flexibilidad para diseñar flujos de trabajo a medida, administrar los recursos de almacenamiento y vincular contenedores.

Trabajar con Kubernetes

Kubernetes ha permitido que muchas empresas cuenten con infraestructuras capaces de ejecutar muchos contenedores con los mismos hosts, con lo que obtienen una reducción de costos y el máximo aprovechamiento de todos sus recursos disponibles. Esto ocurre para grandes implementaciones debido a que para implementaciones muy simples podría resultar ser costoso.

Algunos casos de uso de aplicaciones de Big Data donde Kubernetes puede ser la solución adecuada son las aplicaciones de análisis de datos y de aprendizaje automático porque aportar muchos beneficios en la escalabilidad de clústeres y la distribución en tiempo real de las cargas de trabajo.

Adicional, a continuación, puedes seguir unos sencillos pasos para experimentar y ver cómo funciona:

  1. Configura un entorno de trabajo con Kubernetes y algún contenedor
  2. Crea un microservicio sencillo de prueba
  3. Crea la imagen del contenedor del microservicio
  4. Implementa el microservicio en un clúster de Kubernetes local
  5. Escala el microservicio en el clúster
Analiza los datos para tomar mejores decisiones en tu empresa
Cursos y talleres para formar a tus científicos de datos e ingenieros en las herramientas más utilizadas: Hadoop, Spark, Power BI, Pandas, R y más.
Solicitar más información

¿Qué podemos concluir?

A medida que las tecnologías de Big Data evolucionan, el mantenimiento y actualización de los elementos dentro de las infraestructuras organizacionales, demandan más recursos. Para poder contar con una infraestructura robusta, estable (tolerante a fallos), portable y escalable, las empresas necesitan incrementar el poder de procesamiento de sus equipos empleando un mayor número de hosts ejecutados en contenedores para mejorar la administración de los servicios, la distribución de la carga de trabajo de los procesos, y realizar actualizaciones en producción de manera constante.

Empaquetar y separar la ejecución de aplicaciones en contenedores ayuda a que los equipos de desarrollo se enfoquen en trabajar en la lógica de sus soluciones y las dependencias con el resto de las aplicaciones, y al mismo tiempo, facilita la administración y actualización del ecosistema de trabajo a los equipos de soporte técnico, al no tener que preocuparse por el versionamiento y configuraciones de las aplicaciones.

Kubernetes ofrece amplia flexibilidad para orquestar los contenedores en cualquier plataforma y permite el escalado de las aplicaciones casi de manera instantánea por la independencia del control entre los contenedores y el entorno donde se ejecutan. Aprovechando estos beneficios, las empresas pueden satisfacer la demanda de cambios necesarios como escalar o migrar a entornos híbridos soportados por los múltiples proveedores de cloud.

Kubernetes se mantiene en constante desarrollo y tiene una gran comunidad de desarrolladores que aumenta rápidamente. Al presente, tiene el respaldo de grandes empresas como Google, Red Hat, Oracle, entre otras; y sigue ganando reconocimiento por tener la capacidad de trabajar con cualquier tipo de aplicación y entorno.

Las aplicaciones de big data son buenas candidatas para utilizar la arquitectura de Kubernetes debido a la escalabilidad y extensibilidad de los clústeres de Kubernetes.

Si te ha gustado este artículo y deseas aprender a utilizar Kubernetes, te recomiendo hacer el Taller de Kubernetes para principiantes, o si lo deseas puedes primero iniciar con el Curso de Big Data. Ambos disponibles aquí en OpenWebinars.

Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Más Información