Kubernetes (referido en inglés comúnmente como “K8s”) es una plataforma de sistema distribuido de código libre para la automatización del despliegue, ajuste de escala y manejo de aplicaciones en contenedores que fue originalmente diseñado por Google y donado a la Cloud Native Computing Foundation (parte de la Linux Foundation). Soporta diferentes entornos para la ejecución de contenedores, incluido Docker.
Este programa automatiza muchos de los procesos manuales involucrados en la implementación, la gestión y la escalabilidad de las aplicaciones en contenedores. Además, permite distribuir y gestionar las aplicaciones heredadas, creadas en la nube y en contenedores según sea necesario, así como aquellas que se rediseñan con una estructura de microservicios en todos los entornos, los cuales incluyen los proveedores principales de nube privada y pública.
ARQUITECTURA
Este programa sigue una arquitectura maestro-esclavo. Los componentes de Kubernetes pueden ser divididos en aquellos que administran un nodo individual y aquellos que son partes de un panel de control. Estos son:
- etcd: Almacén de datos persistente, liviano, distribuido de clave-valor desarrollado por CoreOS que almacena de manera confiable los datos de configuración del clúster, representando el estado general del mismo en un punto del tiempo dado. Otros componentes escuchan por cambios en este almacén para avanzar al estado deseado.
- Servidor de API: Componente central que sirve a la API de esta plataforma de sistema distribuido (interfaz que se utiliza para gestionar, crear y configurar los clústeres de la plataforma; es la forma que utilizan los usuarios, los elementos externos y las partes del clúster para comunicarse entre sí) utilizando JSON sobre HTTP, que provee la interfaz interna y externa de la misma. El servidor API procesa y valida las peticiones REST y actualiza el estado de los objetos API en etcd, permitiendo a los clientes configurar flujos de trabajos y contenedores a través de los nodos esclavos.
- Planificador: Componente enchufable que selecciona sobre qué nodo deberá correr una cápsula (ver más abajo) sin planificar (la unidad básica de manejo del planificador) basado en la disponibilidad de recursos. El planificador lleva la cuenta del uso de recursos en cada nodo para asegurar que un flujo de trabajo no es planificado en exceso de la disponibilidad de los recursos. Para este propósito, el planificador debe conocer los requerimientos de recursos, la disponibilidad de recursos y una variedad de restricciones y políticas directivas como calidad del servicio [“quality-of-service” (“QoS”), en inglés], requerimiento de afinidad, localización de datos entre otros. En esencia, el rol del planificador es el de emparejar la oferta de un recurso con la demanda de un flujo de trabajos.
- Administrador del controlador: Proceso sobre el cual el núcleo de los controladores Kubernetes como DaemonSet y Replication se ejecuta. Los controladores se comunican con el servidor API para crear, actualizar y eliminar recursos que ellos manejan (pods, servicios, etc.).
- Nodo Kubernetes: También conocido como esclavo (“worker”, en inglés), es la máquina física (o virtual) donde los contenedores (flujos de trabajos) son desplegados. Cada nodo en el clúster debe ejecutar la rutina de tiempo de ejecución (como Docker), así como también los componentes mencionados más abajo, para comunicarse con el maestro para la configuración en red de estos contenedores.
- Kubelet: Responsable por el estado de ejecución de cada nodo (es decir, se asegura que todos los contenedores en el nodo se encuentran saludables). Se encarga del inicio, la detención y el mantenimiento de los contenedores de aplicaciones (organizados como cápsulas) como es indicado por el panel de control.
- Kube-Proxy: Implementación de un proxi de red y balanceador de carga soportando la abstracción del servicio junto con otras operaciones de red. Es responsable del enrutamiento del tráfico hacia el contenedor correcto basado en la dirección IP y el número de puerto indicados en el pedido.
- cAdvisor: Agente que monitoriza y recoge métricas de utilización de recursos y rendimiento como UCP, memoria, uso de archivos y red de los contenedores en cada nodo.
DISEÑO
Kubernetes define un conjunto de bloques de construcción (primitivas) que conjuntamente proveen los mecanismos para el despliegue, mantenimiento y escalado de aplicaciones. Los componentes que forman este soporte lógico están diseñados para estar débilmente acoplados pero a la vez ser extensibles para que puedan soportar una gran variedad de flujos de trabajo. La extensibilidad es provista en gran parte por la API de este programa, que es utilizada por componentes internos así como extensiones y contenedores ejecutados sobre el mismo. Los más destacados son:
- Cápsulas ("Pods", en inglés): Unidad básica de planificación en Kubernetes. Agrega un nivel de abstracción más elevado a los componentes en contenedores. Una cápsula consta de uno o más contenedores en los que se garantiza su ubicación en el mismo equipo anfitrión y pueden compartir recursos. Cada cápsula en esta plataforma de sistema distribuido es asignada a una única dirección IP (dentro del clúster) que permite a las aplicaciones utilizar puertos sin riesgos de conflictos. Una cápsula puede definir un volumen, como puede ser un directorio de disco local o un disco de red, y exponerlo a los contenedores dentro de la misma. Las cápsulas pueden ser administradas manualmente a través de la API de Kubernetes, o su administración puede ser delegada a un controlador.
- Etiquetas y selectores: Kubernetes permite a los clientes (usuarios o componentes internos) vincular pares clave-valor llamados etiquetas ("labels", en inglés) a cualquier objeto API en el sistema, como pods o nodos. Correspondientemente, selectores de etiquetas son consultas contra las etiquetas que resuelven a los objetos que las satisfacen. Ambos son el mecanismo principal de agrupamiento en este soporte lógico, y son utilizados para determinar los componentes sobre los cuales se aplica una operación.
- Controladores: Un controlador es un bucle de reconciliación que lleva al estado real del clúster hacia el estado deseado. Hace esto mediante la administración de un conjunto de cápsulas. Un tipo de controlador es un "Replication Controller", que se encarga de la replicación y escala mediante la ejecución de un número especificado de copias de una cápsula a través de un clúster. También se encarga de crear cápsulas de reemplazo si un nodo subyacente falla. Otros controladores que forman parte del sistema central de Kubernetes incluyen al "DaemonSet Controller" para la ejecución de exactamente una cápsula en cada máquina (o algún subconjunto de máquinas), y un "Job Controller" para ejecutar cápsulas que ejecutan hasta su finalización, por ejemplo como parte de un trabajo por lotes. El conjunto de cápsulas que un controlador administra está determinado por los selectores de etiquetas que forman parte de la definición del controlador.
- Servicios: Un servicio Kubernetes es un conjunto de pods que trabajan en conjunto, como una capa de una aplicación multicapa. El conjunto de cápsulas que constituyen un servicio está definido por el selector de etiquetas. Este soporte lógico provee de un servicio de descubrimiento y enrutamiento de pedidos mediante la asignación de una dirección IP estable y un nombre DNS al servicio, y balancea la carga de tráfico en un estilo round-robin (método para seleccionar todos los abstractos en un grupo de manera equitativa y en un orden racional, normalmente comenzando por el primer elemento de la lista hasta llegar al último y empezando de nuevo desde el primer elemento) hacia las conexiones de red de las direcciones IP entre las cápsulas que verifican el selector (incluso cuando existan fallos que causen que los pods se muevan de máquina en máquina). Por defecto, un servicio es expuesto dentro de un clúster [por ejemplo, cápsulas de un back end (parte o rama del desarrollo web encargada de que toda la lógica de una página funcione) pueden ser agrupados en un servicio, con las peticiones de las cápsulas de front end (parte de una página de red en la que ve el usuario y en la que se incluyen la línea de diseño y los elementos gráficos de la misma) siendo balanceadas entre ellos], pero un servicio también puede ser expuesto hacia afuera del clúster.
FUNCIONAMIENTO BÁSICO
Kubernetes coordina un grupo de ordenadores de alta disponibilidad que están conectados para funcionar como una sola unidad. Las abstracciones en este soporte lógico le permiten implementar aplicaciones en contenedores en un clúster sin vincularlas específicamente a máquinas individuales. Para hacer uso de este nuevo modelo de implementación, las aplicaciones se deben empaquetar de una manera que las separe de los anfitriones individuales: deben estar en contenedores.
Se puede crear y administrar una implementación utilizando la interfaz de línea de comandos de Kubernetes, Kubectl (utiliza la API de Kubernetes para interactuar con el clúster). Cuando se crea una implementación, se deberá especificar la imagen del contenedor para su aplicación y el número de réplicas que se desean ejecutar. Se puede cambiar esa información más adelante actualizando su implementación.
Al crear una implementación, este soporte lógico crea una cápsula para alojar su instancia de aplicación. Una cápsula es una abstracción de Kubernetes que representa un grupo de uno o más contenedores de aplicaciones (como Docker o rkt), y algunos recursos compartidos para esos contenedores.
Las cápsulas Kubernetes son mortales; de hecho, tienen un ciclo de vida. Cuando un nodo trabajador "muere", las cápsulas que se ejecutan en el nodo también se pierden. Luego, un controlador de replicación puede hacer que el clúster regrese dinámicamente al estado deseado mediante la creación de nuevas cápsulas para mantener su aplicación en ejecución.
Al crear un despliegue se expone públicamente a través de un servicio. La implementación creó sólo una cápsula para ejecutar una aplicación. Cuando el tráfico aumenta, se debe escalar (aumentar en recursos y número) la aplicación para satisfacer la demanda de los usuarios. El escalado se realiza cambiando el número de réplicas en una implementación.
Los usuarios esperan que las aplicaciones estén disponibles todo el tiempo y se espera que los desarrolladores implementen nuevas versiones de ellas varias veces al día. En este programa esto se hace con actualizaciones sucesivas. Las actualizaciones continuas permiten que la actualización de Implementaciones tenga lugar sin tiempo de inactividad al actualizar incrementalmente las instancias de cápsulas con otras nuevas. Las nuevas cápsulas serán programadas en nodos con recursos disponibles.
En resumen, Kubernetes es una herramienta sólida y viable, con la que los desarrolladores pueden crear nuevas aplicaciones en contenedores, alojarlas e implementarlas en la nube con la escalabilidad, la organización y el control necesarios para convertir una idea brillante en un nuevo proyecto, en poco tiempo y sin complicaciones.
Espero que la presente entrada haya sido interesante para el lector. Si es así, aguardo que éste la comente y/o la comparta, por favor.
No hay comentarios:
Publicar un comentario
Deje aquí su comentario, si no puede comentar, pruebe a hacerlo desde otro navegador de red u otro equipo.