Kubernetes, también conocida como "k8s" o "kube", es una plataforma de orquestación de contenedores diseñada para programar y automatizar la implementación, la gestión y el escalado de aplicaciones en contenedores.
Kubernetes fue desarrollado por primera vez por ingenieros de Google antes de ser de código abierto en 2014. Es descendiente de Borg, una plataforma de orquestación de contenedores utilizada internamente en Google. Kubernetes significa timonel o piloto en griego, de ahí el timón en el logotipo de Kubernetes (enlace externo a ibm.com).
En la actualidad, Kubernetes y el ecosistema de contenedores más amplio están madurando hasta convertirse en una plataforma y un ecosistema informáticos de uso general que rivalizan con (e incluso superan a) las máquinas virtuales (VM) como componentes básicos de la infraestructura y las aplicaciones modernas en la nube. Este ecosistema permite a las organizaciones ofrecer una plataforma como servicio (PaaS) de alta productividad que aborde múltiples tareas relacionadas con la infraestructura y las operaciones y problemas 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 vídeo ofrece una excelente introducción a los conceptos básicos de Kubernetes:
Para ingenieros de plataformas y DevOps que buscan operacionalizar la velocidad de comercialización y al mismo tiempo garantizar el rendimiento de las aplicaciones
Los contenedores son componentes de aplicación ejecutables ligeros que combinan el código fuente de la aplicación con todas las bibliotecas del sistema operativo (SO) y dependencias necesarias para ejecutar el código en cualquier entorno.
Los contenedores aprovechan una forma de virtualización del sistema operativo (SO) que permite a varias aplicaciones compartir una única instancia de un SO aislando procesos y controlando la cantidad de CPU, memoria y disco a la que pueden acceder esos procesos. Al ser más pequeños, consumir menos recursos y ser más portátiles que las máquinas virtuales (VM), los contenedores se han convertido en las unidades de computación de facto de las aplicaciones modernas nativas de la nube.
En un estudio reciente de IBM, los usuarios informaron de varios beneficios técnicos y empresariales específicos resultantes de la adopción de contenedores y tecnologías relacionadas.
Puede ser más fácil o más útil entender los contenedores como el último punto en el continuo de la automatización y abstracción de la infraestructura de TI.
En la infraestructura tradicional, las aplicaciones se ejecutan en un servidor físico y acaparan todos los recursos que pueden conseguir. Esto te deja la opción de ejecutar varias aplicaciones en un solo servidor y esperar que una no acapare recursos a expensas de las demás o dedicar un servidor por aplicación, lo que desperdicia recursos y no es escalable.
Las máquinas virtuales (VM) son servidores abstraídos del hardware informático real, lo que permite ejecutar varias VM en un servidor físico o una única VM que abarque más de un servidor físico. Cada máquina virtual ejecuta su propia instancia del sistema operativo y puede aislar cada aplicación en su propia máquina virtual, lo que reduce la posibilidad de que las aplicaciones que se ejecutan en el mismo hardware físico subyacente se afecten entre sí. 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 se necesita ejecutar la aplicación, la máquina virtual se elimina.
Para obtener más información sobre máquinas virtuales, consulte "¿Qué son las máquinas virtuales?"
Los contenedores llevan esta abstracción a un nivel superior: además de compartir el hardware virtualizado subyacente, también comparten un núcleo de sistema operativo virtualizado subyacente. Los contenedores ofrecen el mismo aislamiento, escalabilidad y desechabilidad que las máquinas virtuales, pero como 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 el uso de los recursos: permiten ejecutar más aplicaciones en menos máquinas (virtuales y físicas), con menos instancias del sistema operativo. Los contenedores son más fáciles de transportar entre entornos de escritorio, centros de datos y nubes. Además, son una excelente opción para las prácticas de desarrollo de Agile y DevOps.
"¿Qué son los contenedores?" Proporciona una explicación completa de los contenedores y la contenedorización. Por su parte, la entrada del blog "Contenedores frente a máquinas virtuales: ¿cuál es la diferencia?" ofrece un resumen completo de las diferencias entre ambos.
Docker es la herramienta más popular para crear y ejecutar contenedores de Linux®. Aunque 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 llevó a las masas con una nueva implementación fácil de usar para desarrolladores y en 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 conjunto de herramientas comerciales para contenedores que se basa en el proyecto de código abierto (y aporta esas mejoras a la comunidad de código abierto).
Docker se basó en la tecnología tradicional de contenedores Linux (LXC), pero permite una virtualización más granular de los procesos del núcleo Linux y añade características para facilitar a los desarrolladores la creación, implantación, gestión y seguridad de los contenedores.
Aunque hoy en día existen plataformas de contenedores alternativas (como Open Container Initiative (OCI), CoreOS y Canonical (Ubuntu) LXD), Docker es tan popular que es prácticamente sinónimo de contenedores y a veces se confunde con un competidor de tecnologías complementarias como Kubernetes (véase el vídeo "Kubernetes vs, Docker: No es 'o uno o el otro'" que aparece 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 programar y automatizar el despliegue, la conexión en red, la escalabilidad y la disponibilidad de los contenedores. Así nació el mercado de la orquestación de contenedores.
Si bien otras opciones de orquestación de contenedores, sobre todo Docker Swarm y Apache Mesos, ganaron algo de tracción desde el principio, Kubernetes se convirtió rápidamente en la más ampliamente adoptada (de hecho, en un momento dado, fue el proyecto de más rápido crecimiento en la historia del software de código abierto).
Los desarrolladores escogieron y siguen escogiendo Kubernetes por su amplitud de funciones, su amplio y creciente ecosistema de herramientas de soporte de código abierto y su soporte y portabilidad entre los proveedores de servicios 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 totalmente gestionados.
Kubernetes programa y automatiza las tareas relacionadas con los contenedores a lo largo del ciclo de vida de la aplicación, que incluyen:
Si ha leído hasta aquí, ya entiende que, aunque Kubernetes es una alternativa a Docker Swarm, no es (contrariamente a la persistente idea errónea popular) una alternativa a o competidor de Docker en sí.
De hecho, si ha adoptado Docker con entusiasmo y está creando implementaciones de contenedores a gran escala basadas en Docker, la orquestación de Kubernetes es el siguiente paso lógico para gestionar estas cargas de trabajo.
Para obtener más información, vea “Kubernetes vs. Docker: no es 'o uno o el otro'”:
Los componentes principales de la arquitectura de Kubernetes son los siguientes:
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 múltiples nodos trabajadores que implementan, ejecutan y gestionan aplicaciones en contenedores. El nodo maestro ejecuta un servicio de programación que automatiza cuándo y dónde se implementan los contenedores en función de los requisitos de implementación establecidos por el desarrollador y de la capacidad informática disponible. Cada nodo de trabajo incluye la herramienta que se utiliza para administrar los contenedores, como Docker, y un agente de software llamado Kubelet que recibe y ejecuta órdenes del nodo maestro.
Los desarrolladores gestionan las operaciones de clúster mediante kubectl, una interfaz de línea de comandos (cli) que se comunica directamente con la API de Kubernetes.
Para obtener más información sobre 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 de 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 únicamente contenedores que deban compartir recursos.
La implementación controla la creación y el estado de la aplicación en contenedores y la mantiene en ejecución. Especifica cuántas réplicas de un pod deben ejecutarse en el clúster. Si un pod falla, la implementación creará uno nuevo.
Para obtener más información sobre las implementaciones de Kubernetes, consulte “Implementaciones de Kubernetes: comience rápidamente”:
Kubernetes puede implementar y escalar pods, pero no puede administrar ni automatizar el enrutamiento entre ellos y no proporciona ninguna herramienta para monitorizar, proteger o depurar estas conexiones. A medida que crece el número de contenedores de un clúster, el número de rutas de conexión posibles entre ellos aumenta exponencialmente (por ejemplo, dos contenedores tienen dos conexiones potenciales, pero 10 pods tienen 90), lo que da lugar a una posible pesadilla de configuración y gestión.
Introduzca Istio, una capa de malla de servicio de código abierto para clústeres de Kubernetes. A cada clúster de Kubernetes, Istio agrega un contenedor de archivo adicional , esencialmente invisible para el programador y el administrador, que configura, monitoriza y gestiona las interacciones entre los otros contenedores.
Con Istio, se establece una única política que configura las conexiones entre contenedores para que no tenga que configurar cada conexión individualmente. Esto facilita la depuración de las conexiones entre contenedores.
Istio también proporciona un panel de control que los equipos y administradores de DevOps pueden utilizar para monitorizar la latencia, los errores de tiempo en el servicio y otras características de las conexiones entre contenedores. Además, incorpora funciones de seguridad (concretamente, una 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 la seguridad pueden utilizar para supervisar el clúster.
Knative (pronunciado "kay-native") es una plataforma de código abierto que se asienta sobre Kubernetes y proporciona dos clases importantes de ventajas para el desarrollo nativo en la nube:
La informática 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 desplegar una instancia continua de código que permanece inactiva a la espera de solicitudes, el código sin servidor se despliega cuando es necesario (aumentando o reduciendo su escala según fluctúe la demanda) y luego se retira cuando no se utiliza. La tecnología sin servidor evita el desperdicio de capacidad y potencia de cálculo y reduce los costes, ya que sólo se paga por ejecutar el código cuando realmente se está ejecutando.
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 gestiona los detalles en segundo plano y el desarrollador puede centrarse en el código.
Para los desarrolladores, la contenedorización del código requiere muchos pasos repetitivos, y la orquestación de contenedores requiere mucha configuración y secuencias de comandos (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 a través 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. En concreto, extrae el código del repositorio, instala las dependencias necesarias, crea la imagen del contenedor y la coloca en un registro de contenedores para que otros desarrolladores puedan utilizarla. Los desarrolladores deben especificar la ubicación de estos componentes para que Knative pueda encontrarlos, pero una vez hecho esto, Knative automatiza la compilación.
Serve: el componente Serve ejecuta contenedores como servicios escalables; puede escalar hasta miles de instancias de contenedores o escalar a ninguna escala (llamada escalar a cero). Además, Serve tiene dos funciones muy útiles: la de configuración, que guarda versiones de un contenedor (llamadas instantáneas) cada vez que empuja el contenedor a producción y le permite ejecutar esas versiones de forma simultánea; y la de enrutamiento de servicios, que le permite dirigir diferentes cantidades de tráfico a estas versiones. Puede utilizar estas funciones conjuntamente para escalonar gradualmente el despliegue de un contenedor o para realizar una prueba canaria de una aplicación en contenedores antes de ponerla en producción global.
Event: Event permite que eventos específicos activen funciones o servicios basados en contenedores. Esto es especialmente importante para las capacidades sin servidor de Knative; algo tiene que decirle al sistema que active una función cuando sea necesario. Event permite a los equipos expresar su interés en los tipos de eventos y, a continuación, se conecta automáticamente con el productor del evento y dirige los eventos al contenedor, eliminando la necesidad de programar estas conexiones.
Kubernetes es uno de los proyectos de código abierto de más rápido crecimiento en la historia, y dicho crecimiento se está acelerando. La adopción sigue disparándose entre los desarrolladores y las empresas que los emplean. Algunos datos que vale la pena destacar:
Si está listo para empezar a trabajar con Kubernetes o desea desarrollar sus habilidades con las herramientas del ecosistema de Kubernetes y Kubernetes, pruebe uno de estos tutoriales:
Con Red Hat OpenShift on IBM® Cloud, los desarrolladores OpenShift tienen una forma rápida y segura contenerizar e implementar cargas de trabajo empresariales en clústeres Kubernetes.
Implemente y ejecute aplicaciones de forma coherente en entornos locales, de computación perimetral y de nube pública desde cualquier proveedor de nube, utilizando un conjunto común de servicios en la nube que incluyen cadenas de herramientas, bases de datos e IA.
IBM Cloud Code Engine, una plataforma serverless totalmente gestionada, le permite ejecutar su contenedor, código de aplicación o trabajo por lotes en un tiempo de ejecución de contenedor totalmente gestionado.
Una nueva investigación de IBM documenta el creciente impulso de la adopción de contenedores y Kubernetes.
Los contenedores forman parte de una estrategia de nube híbrida que permite crear y gestionar cargas de trabajo desde cualquier lugar.
Serverless es un modelo de desarrollo y ejecución de aplicaciones en la nube que permite a los desarrolladores crear y ejecutar código sin gestionar servidores o pagar por una infraestructura en la nube inactiva.
Explore un ejemplo de cómo se utiliza un archivo YAML en Kubernetes.