¿Qué es Kubernetes?
Tags: kubernetes, beginners
Published: 2021-12-19 19:08:44



Kubernetes es una plataforma open-source, extensible y portable para el manejo de programas, aplicaciones y servicios contenerizados que hace más fácil tanto la configuración declarativa como la automatización.

___

**Retrocediendo al pasado**

Era del despliegue tradicional: hace tiempo, la mayoría de las organizaciones corrían sus aplicaciones en servidores físicos. No había manera de definir los límites de recursos para aplicaciones en un caso como éste, esto causaba diversos problemas. Por ejemplo, si muchas aplicaciones corrían en un mismo servidor físico, podría haber habido una instancia en donde una aplicación acaparara la mayoría de los recursos, y como resultado, las otras aplicaciones tendrían un rendimiento inferior.
Una solución a este problema hubiese sido correr cada aplicación en un servidor físico diferente. Pero esta solución no prosperó ya que la utilización de recursos sería muy ineficiente y muy costoso para las organizaciones de mantener múltiples servidores.

**Era del despliegue virtual**

Como solución, se introdujo la virtualización. Esto permite correr múltiples Máquinas Virtuales (MV) en la CPU de un solo servidor físico. También nos permite aislar aplicaciones entre MVs y provee cierta seguridad ya que la información de una aplicación no puede ser accedida libremente desde otra aplicación.

La virtualización permite una mejor utilización de los recursos y permite la escalabilidad. 

Cada MV es una máquina corriendo todos los componentes, incluyendo su propio sistema operativo, sobre el hardware virtualizado.

**Era del despliegue en contenedores**

Los contenedores son similares a las MVs, tienen su propio sistema de archivos, misma memoria, espacio de procesamiento, entre otros. Debido a que están desacoplados de la estructura subyacente, son totalmente portables.

Los contenedores se volvieron muy populares debido a ciertas ventajas extras, como las siguientes:
- **Ágil creación y despliegue de aplicaciones**: mayor facilidad y eficiencia de la creación de imágenes de contenedores en comparación con el uso de imágenes de MV.
- **Desarrollo, integración y despliegue continuo**: permiten una frecuente y confiable construcción de imágenes y despliegue con la posibilidad de realizar rápidos y eficientes rollbacks (restauración a una versión anterior), debido a la inmutabilidad de las imágenes.
- **Separación de tareas entre Dev y Ops**: podemos crear imágenes al momento de compilar y no al desplegar, desacoplando la aplicación de la infraestructura.
- **Observabilidad**: no solo muestra información y métricas a nivel del sistema operativo, sino la salud de la aplicación y otra información.
- **Consistencia entre los entornos de desarrollo, pruebas y producción**: la aplicación corre de la misma manera en nuestra laptop como en la nube.
- **Portabilidad entre nubes y distribuciones**: puede correr en Ubuntu, RHEL, CoreOS, un datacenter físico, Google Kubernetes Engine, entre otros.
- **Gestión centrada en la aplicación**: aumenta el nivel de abstracción de ejecutar un sistema operativo en hardware virtual a ejecutar una aplicación en un sistema operativo utilizando recursos lógicos.
- **Microservicios elásticos, distribuidos y bajamente acoplados**: las aplicaciones son divididas entre piezas más pequeñas e independientes y pueden ser deployadas y gestionadas dinámicamente, no teniendo un monolito corriendo en una única máquina de gran capacidad.
- **Aislación de recursos**: rendimiento de la aplicación más predecible.
- **Utilización de recursos**: alta eficiencia y densidad.

___

## ¿Por qué necesitas Kubernetes y qué puedes hacer?

Los contenedores son una buena forma de agrupar y correr nuestras aplicaciones. En un entorno de producción, debemos manejar los contenedores que corren las aplicaciones y asegurarnos de que no haya momentos en que nuestra aplicación esté caída. Por ejemplo, si se cae un contenedor, otro debe iniciarse inmediatamente. ¿No sería más fácil si este comportamiento fuese manejado por un sistema en vez de hacerlo manualmente?

¡Así es como Kubernetes viene al rescate! Kubernetes provee de un marco de trabajo para correr sistemas distribuidos de una manera más resistente y robusta. Se encarga de la escalabilidad y del manejo de fallos de nuestra aplicación, provee patrones de despliegue, y más. Por ejemplo, Kubernetes puede gestionar fácilmente _canary deployments_ para nuestro sistema.

_Nota: Canary deployment es un patrón para desplegar nuevos lanzamientos a un pequeño grupo de servidores, realizar testeos y luego aplicar estos cambios al resto de nuestros servidores._

Kubernetes nos provee de lo siguiente:
- **Balanceo de carga y exposición de servicios**: Kubernetes permite ubicar a un contenedor usando su nombre por DNS o su propia dirección IP. Si el tráfico hacia un contenedor es elevado, Kubernetes es capaz de balancear la carga y distribuirla hacia otro despliegue más estable.
- **Orquestación de almacenamiento**: nos permite montar automáticamente un sistema de almacenamiento a nuestra elección, como almacenamientos locales, proveedores cloud públicos, y más.
- **Implementaciones y restauraciones automatizadas**: podemos definir el estado deseado de nuestros contenedores desplegados usando Kubernetes, y podemos cambiar el estado actual a otro estado deseado a un ritmo controlado. Por ejemplo, podemos automatizar Kubernetes para que cree nuevos contenedores para nuestro despliegue, eliminando los contenedores existentes y tomando esos recursos para asignarlos a este nuevo despliegue.
- **Agrupación automática**: podemos indicar cuánta memoria RAM y CPU cada contenedor necesita para que Kubernetes se encargue de ubicarlos de una manera óptima y así aumentar la utilización y el ahorro de recursos.
- **Autoreparación**: Kubernetes puede reiniciar contenedores que fallan, reemplazarlos y detener a los que no respondan a la configuración establecida por el usuario, no exponiéndolos a clientes hasta que no estén listos para funcionar.
- **Gestión de configuraciones y secretos (credenciales de autenticación)**: podemos gestionar y guardar información sensible, como contraseñas, tokens de OAuth, y claves SSH. Podemos desplegar y actualizar nuestras credenciales y configuraciones sin tener que reconstruir las imágenes, y sin exponer dicha información.

___

## ¿Qué NO es Kubernetes?

Kubernetes no es el tradicional sistema todo incluido de Plataforma como Servicio (PaaS). Dado que opera a un nivel de contenedores en lugar de a un nivel de hardware, proporciona algunas características de aplicación general que son comunes a lo que ofrecen las PaaS, como despliegue, escalabilidad, balanceo de carga y permite a los usuarios integrar sus soluciones de registro, monitoreo y alerta. No obstante, Kubernetes no es un monolíto, y estas soluciones por defecto son opcionales y vinculables. Kubernetes proporciona los componentes básicos para la creación de plataformas para desarrolladores, pero conserva la elección y la flexibilidad del usuario donde realmente es importante.

Kubernetes:
- No limita los tipos de aplicaciones soportadas. Su objetivo es admitir una gran variedad de aplicaciones y programas, incluyendo los de tipo stateless, statefull y de procesamiento de datos.
- No despliega código fuente ni tampoco compila nuestra aplicación. Los flujos de trabajo de desarrollo, integración y despliegue continuo (CI/CD) están determinados por las preferencias y la cultura de la organización como así también los requerimientos técnicos.
- No provee servicios a nivel de la aplicación, como middleware, frameworks de procesamiento de datos, bases de datos, caches, o sistemas de almacenamiento como servicios integrados. Estos componentes pueden correr en Kubernetes y/o ser accedidos a través de aplicaciones que corren en Kubernetes por medio de mecanismos portables, como [Open Service Broker](https://www.openservicebrokerapi.org/).
- No impone soluciones de registro, monitoreo o alerta. Sí proporciona algunas integraciones como prueba de concepto, y mecanismos para recopilar y exportar métricas.
- No provee ni impone un lenguaje o sistema de configuración (como por ejemplo, Jsonnet), sino que proporciona una API declarativa que puede ser utilizada con cualquier tipo de especificacion declarativa. [más información(https://www.meshcloud.io/2021/08/02/should-i-provide-a-declarative-api-you-propably-should/)].
- No proporciona ni adopta ningún sistema exhaustivo de mantenimiento, gestión, autorepación o configuración.
- Adicionalmente, Kubernetes no es más que un simple sistema de orquestamiento. De hecho, elimina la necesidad de orquestamiento. La definición técnica de este concepto es la ejecución de un flujo de trabajo definido: primero hacer A, luego B, luego C. En contraste, Kubernetes comprende un conjunto de procesos componibles e independientes que continuamente buscan llegar a un estado deseado partiendo del estado actual. Sin importar como llegamos de ese estado A al estado C. El control centralizado tampoco es requerido. Esto resulta en un sistema que es fácil de usar y muy robusto, poderoso, sólido y totamente extensible.

___

_Fuente: https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/_