¿Qué es Kubernetes?

Una plataforma de DevOps que facilita la implementación y la gestión de sistemas distribuidos

Max Rehkopf Max Rehkopf

Kubernetes es una plataforma de código abierto que orquesta sistemas de tiempo de ejecución de contenedores en un clúster de recursos de hardware en red. Originalmente lo desarrolló Google, que necesitaba una nueva forma de ejecutar miles de millones de contenedores a la semana a escala. Para ello, con los años, desarrolló tres sistemas diferentes de gestión de contenedores, de los cuales el más reciente es el sistema de código abierto Kubernetes.

La palabra Kubernetes proviene del griego y significa “timonel” o “piloto”. Kubernetes, que ahora es líder del mercado, es la herramienta de orquestación estándar del sector para la implementación de contenedores y aplicaciones distribuidas. Además, supone la cúspide evolutiva de herramientas y sistemas anteriores que los desarrolladores han estado combinando para orquestar sistemas distribuidos.

La evolución de DevOps comenzó a gestionar máquinas físicas en salas de racks para servidores. Dichas máquinas todavía existen, pero son menos prácticas. Las máquinas virtuales y el hardware virtual fueron la siguiente capa de abstracción que ejecutar mediante hipervisores en las máquinas físicas. Los desarrolladores seguían haciendo un esfuerzo excesivo para gestionar la infraestructura y las máquinas virtuales en toda la infraestructura. Se desarrollaron los contenedores para que los desarrolladores pudieran centrarse más en el desarrollo de aplicaciones de alto nivel y menos en la infraestructura. Entonces, se introdujo Kubernetes para ayudar a automatizar y gestionar contenedores en la infraestructura de la nube.

Kubernetes ayuda a los desarrolladores a escribir aplicaciones que se ejecutan en un clúster, ya que se utiliza para la orquestación de sistemas de tiempo de ejecución de contenedores en un clúster de recursos de hardware en red. Como señala Google, “el principal objetivo de Kubernetes es facilitar la implementación y la gestión de sistemas distribuidos complejos, además de seguir beneficiándose del uso mejorado que permiten los contenedores”.

A veces, se conoce a Kubernetes como K8s o kube, y ahora lo mantiene la Cloud Native Computing Foundation.

¿Para qué sirve Kubernetes?

Kubernetes se utiliza fundamentalmente para implementar y gestionar un clúster de aplicaciones en contenedores y sirve también para establecer tu propia plataforma CaaS. Asimismo, ayuda a gestionar arquitecturas de aplicaciones de microservicios y ahora es una herramienta crítica para compilar sólidas y modernas canalizaciones de CI/CD de DevOps.

Para entender mejor la relación entre Kubernetes y los contenedores, es importante saber qué son los contenedores. Kubernetes agrupa un conjunto de contenedores. Un ejemplo podría ser un servidor de aplicación, una caché de Redis y una base de datos SQL. En el caso de los contenedores de Docker, se trata de un proceso por contenedor. Kubernetes coloca estos contenedores en un grupo que gestiona en la misma máquina para reducir la sobrecarga de red y aumentar la eficiencia del uso de recursos.

Kubernetes aprovisionará y gestionará los recursos de hardware subyacentes designados en tu configuración. A continuación, multiplicará y distribuirá contenedores de aplicaciones por los recursos de hardware. De esta forma, Kubernetes puede orquestar contenedores a través de máquinas o en la misma máquina.

Asimismo, Kubernetes ayuda a optimizar el desarrollo de aplicaciones para la nube. La mayoría de las modernas aplicaciones no triviales se componen de varias responsabilidades de planes de negocio diferentes, como gestión de cuentas, pagos y contenido. Estas responsabilidades son adecuadas para una arquitectura de microservicios. Al utilizar Kubernetes al comienzo del desarrollo de un nuevo proyecto, el diseño y la implementación de microservicios generarán, a menudo, un fuerte retorno de la inversión. A medida que avanza el proyecto, se beneficiará de las funciones de escalado automático, supervisión e implementación sencilla que ofrece Kubernetes.

Kubernetes se puede utilizar para programar trabajos informáticos que requieran una gran cantidad de recursos. Algunos proyectos pueden requerir grandes cargas de trabajo que consuman recursos de máquinas durante un periodo prolongado. Imagina un proyecto que ejecuta una simulación compleja, como el plegamiento de proteínas, el análisis genético o la representación gráfica en 3D. A menudo, los proyectos de este tipo suelen tener un clúster especializado de recursos informáticos para ejecutar la simulación de forma asíncrona. Kubernetes es una herramienta ideal para gestionar dichos clústeres.

El aprovisionamiento eficaz de recursos en un clúster puede ser una tarea compleja. La cantidad de CPU y memoria que requieren los contenedores puede variar según el uso. Kubernetes cuenta con mecanismos horizontales y verticales de escalado automático. Hay dos tipos de escalado horizontal. Kubernetes puede añadir y eliminar más pods en un nodo, o bien añadirá y eliminará nuevas máquinas al clúster. Sin embargo, el escalado vertical aumentará o disminuirá los recursos de la máquina local que utiliza un contenedor. Kubernetes cuenta con una función integrada de supervisión y un conjunto de reglas configurables que revisa para determinar si debe escalar hacia arriba o hacia abajo.

Kubernetes se puede utilizar junto con algunas herramientas modernas de canalización de DevOps para compilar una canalización de CI/CD, ya que controla y automatiza las implementaciones y actualizaciones de aplicaciones. Esta automatización de implementaciones, junto con un sólido conjunto de pruebas automatizadas, abarca una canalización de CI/CD completa.

¿Quién debe usar Kubernetes?

Kubernetes es ideal para proyectos de software modernos de alto rendimiento. Sin embargo, trasladar un proyecto existente a Kubernetes resulta lento y costoso. Teniendo eso en cuenta, suele ser más adecuado para proyectos en sus primeras fases. Sin embargo, puede que el retorno de la inversión para migrar un sistema antiguo y asentado a Kubernetes haga que el coste merezca la pena. Esta es una decisión sobre los costes empresariales de ingeniería que debe revisarse detenidamente.

Comparación entre Kubernetes y Docker

Docker es un tiempo de ejecución de contenedores, mientras que Kubernetes es una plataforma para ejecutar y gestionar contenedores a partir de numerosos tiempos de ejecución de contenedores. Docker es uno de los muchos tiempos de ejecución de contenedores que admite Kubernetes. Prácticamente puedes pensar en Kubernetes como un “sistema operativo” y en los contenedores de Docker como “aplicaciones” que instalas en ese “sistema operativo”.

Por sí solo, Docker es muy beneficioso para el desarrollo de aplicaciones modernas y resuelve el clásico problema de “funciona en mi máquina”, pero no en otras. Como software independiente, Docker es capaz de gestionar la implementación de algunos contenedores. Cuando un sistema crece y tiene que añadir muchos contenedores conectados en red entre sí, Docker puede, de forma independiente, hacer frente a algunos problemas crecientes que Kubernetes ayuda a resolver.

Conceptos básicos de Kubernetes

Kubernetes se compone de numerosos componentes y presenta algunos conceptos que hay que entender. Una instalación general de Kubernetes se conoce como clúster. Todos los clústeres de Kubernetes cuentan con una instancia maestra, que es la que se encarga de gestionar el clúster. Es un proceso daemon que coordina todas las actividades en el clúster, como las implementaciones, el escalado automático y la supervisión del estado.

Diagrama donde se muestra cómo funciona Kubernetes, con una instancia maestra, un nodo, un Kubelet y un pod.

El clúster está compuesto de nodos. Un nodo es una entidad de máquina, como una máquina virtual o un hardware físico, que hace las veces de instancia de trabajador en el clúster de Kubernetes. Todos los nodos incluyen un Kubelet, que es un proceso cliente que se comunica con el proceso maestro mediante la API de Kubernetes. Los nodos también incluyen un sistema de tiempo de ejecución de contenedores como Docker.

Cada nodo, a su vez, contiene un Kubelet. El Kubelet es el proceso principal responsable de gestionar el nodo y de comunicarse con el proceso maestro. El Kubelet también incluye un archivo PodSpec, el cual define el ciclo de vida y el mantenimiento de los contenedores en los pods a los que está asignado.

Los nodos contienen pods, que son la unidad más pequeña de Kubernetes. Un pod es una abstracción sobre un contenedor. Por lo general, un pod incluye muchos contenedores por aplicación. Asimismo, hay un contenedor oculto en cada pod conocido como contenedor de “pausa”, que contiene el espacio de nombre de la red que otros contenedores del pod usan para hablar con localhost.

Los servicios son punteros estáticos a los pods. Como los pods son efímeros, cuentan con IP dinámicas que se pueden reasignar si el pod se reinicia o se vuelve a crear. Esto puede suponer un inconveniente si te intentas conectar en red a un pod por la dirección IP. Los servicios son de ayuda al garantizar que un pod tiene una dirección IP estática.

ReplicationController es un mecanismo que garantiza que un número determinado de pods se ejecuta en un momento determinado. ReplicationController es una pieza clave de la función de escalado automático de Kubernetes. Si hay demasiados pods, el ReplicationController los eliminará y, si hay muy pocos, creará unos nuevos. Los ReplicaSets son los sucesores de ReplicationController: básicamente, hacen lo mismo, pero los ReplicaSets tienen funciones que facilitan el enfocarse en un conjunto de pods.

Kubectl es la interfaz de línea de comandos para ejecutar comandos en un clúster de Kubernetes. Kubectl cuenta con una extensa lista de comandos y opciones disponibles para gestionar Kubernetes.

Kubernetes se puede implementar tanto en hardware físico como en hardware virtual. MiniKube es una versión ligera de Kubernetes que se utiliza para el desarrollo y creará una máquina virtual en tu máquina local que implementará un simple clúster con solo un nodo.

¿Cómo funciona Kubernetes?

Kubernetes opera en un bucle trifásico de comprobaciones y balances. Las tres fases del bucle de Kubernetes son las siguientes:

Observar
Durante la fase de observación, Kubernetes agrega una instantánea del estado actual del clúster. Los Kubelets recopilan información de estado sobre sus respectivos nodos y lo envían al proceso maestro, de modo que la instancia maestra puede tener una visión global del estado actual de los clústeres.

Comprobar las diferencias
A continuación, se compara la instantánea de estado de la fase de observación con los parámetros esperados de clúster estático especificados en la configuración de Kubernetes. Se identifican las discrepancias entre el estado actual y el estado de clúster esperado, y se programan acciones.

Tomar medidas
Luego, el proceso maestro emite comandos para devolver el clúster al estado esperado. Esto significa que quizás haya que eliminar o crear pods, escalar horizontal o verticalmente en los nodos y mucho más.

Las tres fases anteriores eran descripciones generales del bucle de Kubernetes. Sin embargo, un clúster de Kubernetes puede tener muchos bucles diferentes, que los controladores ejecutan. El ReplicationController sigue las fases del bucle y, durante la fase de toma de acciones, es el único responsable de eliminar o crear nuevos pods gestionados por el conjunto de réplicas.

Resumen

Dado que Kubernetes es de código abierto, permite aprovechar libremente las infraestructuras locales, híbridas o de nube pública. Además, te permite mover cargas de trabajo a donde quieras sin esfuerzo. Kubernetes se puede combinar con modernas herramientas de canalización como JenkinsX para compilar sistemas de CI/CD extremadamente ágiles y ajustados, y lo debe utilizar cualquier equipo de DevOps moderno y de alto rendimiento.