Kubernetes, también conocido como "k8s" o "kube", es una plataforma de orquestación de contenedores para planificar y automatizar la implementación, gestión y escalamiento de aplicaciones en múltiples contenedores.
Kubernetes fue desarrollado por primera vez por ingenieros en Google antes de pasarse a código abierto en 2014. Es un descendiente de "Borg", una plataforma de orquestación de contenedores utilizada internamente en Google. Kubernetes proviene de la palabra griega para timonel o piloto, de ahí el timón en el logotipo de Kubernetes (enlace externo a ibm.com).
Hoy, Kubernetes y el ecosistema de contenedores más amplio están evolucionando hacia una plataforma de computación de uso general y un ecosistema que compite, si es que no supera, con las máquinas virtuales (VM) como los componentes básicos de la infraestructura y las aplicaciones en la nube modernas. Este ecosistema permite a las organizaciones ofrecer una plataforma como servicio (PaaS) de alta productividad que aborde múltiples tareas y problemas relacionados con la infraestructura y las operaciones relacionados con el desarrollo nativo de la nube para que los equipos de desarrollo puedan centrarse únicamente en la codificación y la innovación.
El siguiente video proporciona una excelente introducción a los conceptos básicos de Kubernetes:
Los contenedores son componentes de aplicaciones ejecutables y ligeros que combinan el código fuente de la aplicación con todas las bibliotecas y dependencias del sistema operativo (SO) necesarias para ejecutar el código en cualquier entorno.
Los contenedores aprovechan una forma de virtualización de sistema operativo (SO) que permite que varias aplicaciones compartan una única instancia de un sistema operativo al aislar procesos y controlar la cantidad de CPU, memoria y disco a los que pueden acceder dichos procesos. Debido a que son más pequeños, más eficientes en términos de recursos y más portátiles que las máquinas virtuales (VM), los contenedores se han convertido en las unidades informáticas de facto de las aplicaciones modernas nativas de la nube.
En un estudio reciente de IBM (PDF, 1.4 MB), los usuarios informaron varios beneficios técnicos y comerciales específicos que resultan de la adopción de contenedores y tecnologías relacionadas.
Puede ser más fácil o útil considerar a los contenedores como el último punto en la escala continua de automatización y abstracción de la infraestructura de TI.
En la infraestructura tradicional, las aplicaciones se ejecutan en un servidor físico y consumen todos los recursos que pueden obtener. Esto le da la opción de ejecutar varias aplicaciones en un solo servidor y esperar que uno no consuma recursos a expensas de los demás o la opción de dedicar un servidor por aplicación, lo que desperdicia recursos y no permite escalar.
Las máquinas virtuales (VM) son servidores separados del hardware del sistema real, lo que le permite ejecutar varias máquinas virtuales en un solo servidor físico o una única máquina virtual en más de un servidor físico. Cada VM ejecuta su propia instancia del sistema operativo, y usted puede aislar cada aplicación en su propia VM, reduciendo la posibilidad de que las aplicaciones que se ejecuten en el mismo hardware físico subyacente afecten unas a otras. Las máquinas virtuales hacen un mejor uso de los recursos y son mucho más fáciles y rentables de escalar que la infraestructura tradicional. Además, son desechables. Cuando ya no necesite ejecutar la aplicación, puede retirar la máquina virtual.
Para obtener más información acerca de las máquinas virtuales, vea "¿Qué son las máquinas virtuales?".
Los contenedores llevan esta abstracción a un nivel superior: específicamente, además de compartir el hardware virtualizado subyacente, también comparten un kernel de SO virtualizado subyacente. Los contenedores ofrecen el mismo aislamiento, escalabilidad y capacidad de disposición que las máquinas virtuales, pero debido a que no llevan la carga útil de su propia instancia del sistema operativo, son más ligeros (es decir, ocupan menos espacio) que las máquinas virtuales. Son más eficientes en términos de recursos, ya que permiten ejecutar más aplicaciones en menos máquinas (virtuales y físicas) con menos instancias de SO. Los contenedores son más fáciles de transportar en entornos de desktop, centro de datos y nube. Y son una excelente opción para las prácticas de desarrollo de Agile y DevOps.
"¿Qué son los contenedores?" explica detalladamente los contenedores y contenerización. Y la publicación del blog "Contenedores vs. máquinas virtuales: ¿cuál es la diferencia?" ofrece un resumen completo de las diferencias.
Docker es la herramienta más popular para crear y ejecutar contenedores Linux®. Mientras que las primeras formas de contenedores se introdujeron hace décadas (con tecnologías como FreeBSD Jails y AIX Workload Partitions), los contenedores se democratizaron en 2013 cuando Docker los puso a disposición del público con una nueva implementación apta para desarrolladores y la nube.
Docker comenzó como un proyecto de código abierto, pero hoy también se refiere a Docker Inc., la empresa que produce Docker, un kit de herramientas de contenedores comerciales que se basa en el proyecto de código abierto (y aporta esas mejoras a la comunidad de código abierto).
Docker se basa en la tecnología tradicional de contenedor Linux (LXC), pero permite una virtualización más granular de los procesos de kernel de Linux y añade recursos para facilitar a los desarrolladores la creación, la implementación, la gestión y la seguridad.
Si bien actualmente existen otras plataformas de contenedores alternativas (como Open Container Initiative [OCI], CoreOS y Canonical [Ubuntu] LXD), el uso de Docker es tan predominante que es prácticamente sinónimo de contenedores y a veces se considera erróneamente como competidor de tecnologías gratuitas como Kubernetes (vea el video "Kubernetes vs. Docker: no es una pregunta de uno u otro" más abajo).
A medida que proliferaban los contenedores (hoy en día, una organización puede tener cientos o miles de ellos), los equipos de operaciones necesitaban planificar y automatizar la implementación, las redes, la escalabilidad y la disponibilidad de los contenedores. Y así nació el mercado de orquestación de contenedores.
Mientras que otras opciones de orquestación de contenedores, sobre todo Docker Swarm y Apache Mesos, ya habían comenzado a afianzarse, Kubernetes rápidamente se convirtió en el más ampliamente adoptado (de hecho, en un momento fue el proyecto de más rápido crecimiento en la historia del software de código abierto).
Los desarrolladores eligieron y continúan eligiendo Kubernetes por su amplitud de funcionalidad, su vasto y creciente ecosistema de herramientas de apoyo de código abierto, y su soporte y portabilidad en varios servicios de almacenamiento en la nube. Todos los principales proveedores de nube pública, incluidos Amazon Web Services (AWS), Google Cloud, IBM Cloud y Microsoft Azure, ofrecen servicios de Kubernetes completamente gestionados.
Kubernetes planifica y automatiza tareas relacionadas con contenedores en todo el ciclo de vida de la aplicación, lo que incluye:
Si ha leído hasta aquí, ya comprende que, si bien Kubernetes es una alternativa a Docker Swarm, no es (contrariamente a la idea errónea popular persistente) una alternativa o un competidor del propio Docker.
De hecho, si ha adoptado Docker con entusiasmo y está creando implementaciones de contenedores basados en Docker a gran escala, la orquestación de Kubernetes es un paso lógico para gestionar estas cargas de trabajo.
Para obtener más información, vea "Kubernetes vs. Docker: no es una pregunta de uno u otro":
Los componentes principales de la arquitectura de Kubernetes incluyen:
Los clústeres son los componentes básicos de la arquitectura de Kubernetes. Los clústeres se componen de nodos, cada uno de los cuales representa un único host informático (máquina virtual o física).
Cada clúster consta de un nodo maestro que sirve como plan de control para el clúster y varios nodos de trabajador que implementan, ejecutan y gestionan aplicaciones en múltiples contenedores. El nodo maestro ejecuta un servicio de planificador que automatiza cuándo y dónde se implementan los contenedores basándose en los requisitos de implementación del conjunto de desarrolladores y en la capacidad de computación disponible. Cada nodo de trabajador incluye la herramienta que se está utilizando para gestionar los contenedores, como Docker, y un agente de software llamado Kubelet que recibe y ejecuta órdenes del nodo maestro.
Los desarrolladores gestionan las operaciones del clúster mediante kubectl, una interfaz de línea de comandos (cli) que se comunica directamente con la API de Kubernetes.
Para obtener información más detallada acerca de los clústeres de Kubernetes, lea: "Clústeres de Kubernetes: arquitectura para una entrega rápida y controlada de aplicaciones en la nube".
Los pods son grupos de contenedores que comparten los mismos recursos informáticos y la misma red. También son la unidad de escalabilidad en Kubernetes: si un contenedor en un pod recibe más tráfico del que puede manejar, Kubernetes replicará el pod en otros nodos del clúster. Por esta razón, es una buena práctica mantener los pods compactos para que contengan solo contenedores que deben compartir recursos.
La implementación controla la creación y el estado de la aplicación en múltiples contenedores y la mantiene en ejecución. Especifica cuántas réplicas de un pod deben ejecutarse en el clúster. Si falla un pod, la implementación creará uno nuevo.
Para obtener más información acerca de las implementaciones de Kubernetes, vea "Implementaciones de Kubernetes: comience a usar rápidamente":
Kubernetes puede implementar y escalar pods, pero no puede gestionar ni automatizar el enrutamiento entre ellos y no proporciona ninguna herramienta para supervisar, proteger o depurar estas conexiones. A medida que crece el número de contenedores en un clúster, el número de posibles vías de acceso de conexión entre ellos aumenta exponencialmente (por ejemplo, 2 contenedores tienen 2 conexiones potenciales, pero 10 pods tienen 90), lo cual podría dificultar la configuración y la gestión.
Aquí aparece Istio, una capa de malla de servicio de código abierto para clústeres de Kubernetes. Istio añade un contenedor sidecar en cada clúster de Kubernetes, básicamente invisible para el programador y el administrador, que configura, supervisa y gestiona las interacciones entre los otros contenedores.
Con Istio, usted establece una única política que configura las conexiones entre contenedores para que no tenga que configurar cada conexión individualmente. Esto hace que las conexiones entre contenedores sean más fáciles de depurar.
Istio también proporciona un panel de control que los equipos y administradores de DevOps pueden utilizar para supervisar la latencia, los errores de tiempo en servicio y otras características de las conexiones entre contenedores. Además, integra funciones de seguridad (específicamente, la gestión de identidades que impide que usuarios no autorizados suplanten una llamada de servicio entre contenedores) y de autenticación, autorización y auditoría (AAA) que los profesionales de seguridad pueden utilizar para supervisar el clúster.
Knative es una plataforma de código abierto que reside sobre Kubernetes y proporciona dos tipos de ventajas importantes para el desarrollo nativo de la nube:
La computación sin servidor es una forma relativamente nueva de implementar código que hace que las aplicaciones nativas de la nube sean más eficientes y rentables. En lugar de implementar una instancia de código en curso que se encuentra inactivo mientras espera solicitudes, la computación sin servidor ocupa el código "cuando se necesita", escalándolo a medida que la demanda fluctúa, y luego remueve el código cuando no está en uso. La computación sin servidor evita la pérdida de capacidad de computación y potencia y reduce los costos, porque usted solo paga para ejecutar el código cuando se ejecuta realmente.
Knative permite a los desarrolladores crear un contenedor una vez y ejecutarlo como un servicio de software o como una función sin servidor. Todo es transparente para el desarrollador: Knative maneja los detalles en segundo plano y el desarrollador puede concentrarse en el código.
Para los desarrolladores, el código contenerizado requiere demasiados pasos repetitivos, y la orquestación de contenedores requiere mucha configuración y scripts (como generar archivos de configuración, instalar dependencias, gestionar el registro y el rastreo, y escribir scripts de integración continua/implementación continua [CI/CD]).
Knative facilita estas tareas automatizándolas por medio de tres componentes:
Build: el componente Build de Knative transforma automáticamente el código fuente en un contenedor o función nativo de la nube. Específicamente, extrae el código del repositorio, instala las dependencias necesarias, crea la imagen del contenedor y la coloca en un registro de contenedor para que lo utilicen otros desarrolladores. Los desarrolladores necesitan especificar la ubicación de estos componentes para que Knative pueda encontrarlos, pero una vez hecho esto, Knative automatiza la creación.
Serve: el componente Serve ejecuta contenedores como servicios escalables, puede aumentar hasta miles de instancias de contenedor o reducir a ninguna (lo que se denomina reducir a cero). Además, Serve tiene dos funciones muy útiles: configuración, que guarda versiones de un contenedor (llamadas instantáneas) cada vez que lleva el contenedor a producción y le permite ejecutar esas versiones simultáneamente, y enrutamiento de servicios, que le permite dirigir diferentes cantidades de tráfico a estas versiones. Puede usar estas características juntas para implementar gradualmente un contenedor o realizar una prueba canaria de una aplicación en múltiples contenedores antes de ponerla en producción global.
Event: Event habilita los eventos especificados para desencadenar funciones o servicios basados en contenedor. Esto es especialmente integral para las capacidades sin servidor de Knative. Algo necesita decirle al sistema que ponga en marcha una función cuando sea necesario. Event permite que los equipos expresen interés en los tipos de eventos y luego se conecta automáticamente al productor de eventos y envía los eventos al contenedor, eliminando la necesidad de programar estas conexiones.
Kubernetes es uno de los proyectos de código abierto de mayor crecimiento en la historia, y su crecimiento se está acelerando. Los desarrolladores y las empresas que los contratan siguen adoptándolo. Algunos puntos de datos que vale la pena señalar:
Si está preparado para empezar a trabajar con Kubernetes o quiere desarrollar sus habilidades de Kubernetes y las herramientas de su ecosistema, vea uno de estos tutoriales:
Con Red Hat OpenShift on IBM Cloud, los desarrolladores de OpenShift tienen una forma rápida y segura de contener e implementar cargas de trabajo empresariales en clústeres de Kubernetes.
Implemente y ejecute aplicaciones de manera consistente en entornos locales, de edge computing y de nube pública de cualquier proveedor de nube usando un conjunto común de servicios en la nube que incluye cadenas de herramientas, bases de datos e IA.
IBM Cloud Code Engine es una plataforma sin servidor completamente gestionada que le permite ejecutar su contenedor, código de aplicación o trabajo por lotes en un tiempo de ejecución de contenedor completamente gestionado.