Hace casi diez años, Google sorprendió al mundo con una nueva creación. En 2014, la compañía anunció el lanzamiento de Kubernetes, un proyecto en el cual trabajaron varios ingenieros de la empresa y que revolucionó la industria de la programación y el desarrollo.
Como la empresa decidió que fuese de código abierto, cualquier persona lo puede utilizar de forma gratuita. Claro que los mayores beneficiarios son aquellos que trabajan desarrollando softwares o aplicaciones. Pero eso no quiere decir que sea de uso exclusivo para estos profesionales.
Sin embargo, para quienes no trabajan en ese sector tecnológico, el concepto de Kubernetes puede ser confuso. Y por ese motivo, contar con una guía que explique sus principales características resulta de gran utilidad.
¿Cómo nace y qué es Kubernetes?
Kubernetes fue anunciada oficialmente por Google en 2014. Su desarrollo fue llevado a cabo por varios ingenieros de la compañía entre los que se encontraban Joe Beda, Brendan Burns y Craig McLuckie. A ellos también se sumaron Brian Grant y Tim Hockin, quienes hicieron sus aportes al proyecto.
La palabra Kubernetes proviene del griego y significa “timonel” o “piloto”. También es común ver la abreviación K8S para referirse a esta plataforma. Su principal característica es ser de código abierto y “permitir la organización en contenedores que automatizan muchos de los procesos manuales involucrados en la implementación, la gestión y el ajuste de las aplicaciones que se alojan en ellos”.
De esa manera la definen en Red Hat, una de las primeras empresas en trabajar en este sistema de organización, incluso antes de su lanzamiento. “Los clústeres de Kubernetes pueden contener hosts locales y en nubes públicas, privadas o híbridas. Por eso, es la plataforma ideal para alojar aplicaciones desarrolladas directamente en la nube que deben ajustarse rápidamente”, explican desde la empresa.
En 2015, Google formó una alianza con Linux Fundation. En conjunto, crearon la Cloud Native Computing Foundation, un organismo que tiene como finalidad promover la tecnología de contenedores y alinear la industria tecnológica en torno a su evolución.
Desde el organismo, dicen que durante los últimos siete años la cantidad de personas que respaldan a Kubernetes es cada vez más grande. “La comunidad, grande y diversa, que apoya el proyecto ha hecho que su poder de permanencia sea más sólido que otras tecnologías más antiguas del mismo tipo. En enero de 2020, el informe anual de CNCF mostró un crecimiento significativo en el interés, la capacitación, la asistencia a eventos y la inversión relacionada con Kubernetes”, afirman.
¿Qué pasaba antes de Kubernetes?
Antes de Kubernetes, cuando un programador o desarrollador quería desplegar una aplicación, debía instalarla en un servidor. Para eso, se veía obligado a usar un administrador de paquetes del sistema operativo y eso traía una desventaja: todos los componentes estaban entrelazados.
Esto incluía desde los ejecutables hasta las configuraciones pasando por las librerías y los ciclos de vida. El resultado era un funcionamiento más lento y, además, no era portable, lo que limitaba mucho el trabajo de los creadores de la aplicación o el software.
Actualmente, el procedimiento que se lleva a cabo es desplegar contenedores dentro del sistema operativo. Estos contenedores, también llamados containers, no están asociados entre sí y el servidor funciona como una especie de “anfitrión”. Es decir, cada contenedor tiene su propio sistema de archivo, lo que es un beneficio porque son más sencillos de construir. Además, como no están acoplados a la infraestructura y sistema de archivos del anfitrión, pueden llevarse entre nubes y distribuciones de sistema operativo.
En ese contexto, Kubernetes ofrece un entorno de administración centrado en contenedores. La plataforma “orquesta” la infraestructura de cómputo, redes y almacenamiento para que las cargas de trabajo de los usuarios no tengan que hacerlo.
Los beneficios de Kubernetes
Como ya se mencionó, la principal ventaja de Kubernetes es implementar una infraestructura basada en contenedores en los entornos de producción. De esta forma, se puede depender completamente de ella.
Pero como Kubernetes automatiza las tareas operativas, también se pueden realizar muchas tareas que, de otra forma, se deberían realizar con diversas plataformas de aplicaciones o sistemas de gestión.
De esta forma, un desarrollador puede crear una aplicación en cualquier nube con Kubernetes. Esta funcionará como una plataforma de tiempo de ejecución utilizando los patrones, que son que son las herramientas necesarias para diseñar aplicaciones y servicios basados en los contenedores.
Según especialistas, estás son algunas de las principales acciones que se pueden llevar a cabo con Kubernetes:
- Organizar los contenedores en varios hosts
- Hacer un mejor uso del hardware para aprovechar al máximo los recursos necesarios en la ejecución de las aplicaciones empresariales
- Controlar y automatizar las implementaciones y actualizaciones de las aplicaciones
- Agregar almacenamiento para ejecutar aplicaciones con estado
- Ampliar las aplicaciones en contenedores y sus recursos según sea necesario
- Gestionar los servicios de forma declarativa para garantizar que las aplicaciones implementadas siempre se ejecuten correctamente
- Realizar comprobaciones de estado y autorregeneraciones de sus aplicaciones con ubicación, reinicio, replicación y adaptación automáticos
Los patrones de Kubernetes
Todos los expertos que trabajan con Kubernetes señalan que su implementación requiere un proceso de aprendizaje. Varios de ellos incluso afirman que se puede tardar años y cientos de intentos entender cómo funciona y descubrir la mejor forma de utilizar esta tecnología según el proyecto que se esté realizando.
Sin embargo, la mayoría de las empresas o personas que desarrollan una aplicación no tienen tanto tiempo para lanzar un producto. Por lo general, hay fechas que se establecen y deben cumplirse. Por ese motivo, y aprovechando que Kubernetes es de código abierto, surgió una “ayuda” para los usuarios.
Los patrones de Kubernetes aparecieron luego de los éxitos y los fracasos que los usuarios fueron experimentando. Estos brindan diseños que las compañías o los desarrolladores individuales pueden copiar para acelerar los procesos, lo que resulta un beneficio sobre todo cuando no se tiene tanta experiencia con la plataforma.
Una gran ayuda para quienes inician su recorrido dentro de Kubernetes es un libro escrito por Bilgin Ibryam y Roland Huß y publicado por la editorial O’Reilly. El mismo se llama Patrones de Kubernetes: Elementos reutilizables para diseñar aplicaciones nativas en la nube. En el texto se detalla con precisión qué son los elementos, los patrones, los principios y las prácticas reutilizables y comunes para diseñar e implementar aplicaciones nativas de la nube en Kubernetes.
A este texto se suma otro que fue publicado por la misma editorial. Bajo el nombre Operadores Kubernetes: Automatizando la plataforma de orquestación de contenedores, se centra en los mecanismos de empaquetado para distribuir aplicaciones en Kubernetes, así como monitorear, mantener, recuperar y actualizar el software que se implementa.
Ambos libros hacen foco en explicar el uso de la plataforma y se pueden descargar de forma gratuita en Internet. Algunas compañías como Red Hat incluso los destacan y recomiendan dentro de sus propias guías. Leerlos antes de ingresar en Kubernetes resulta ser una ventaja ya que permiten entender conceptos necesarios para su utilización. Esta tecnología tiene muchas ventajas pero también es compleja por lo que todo conocimiento previo generará un mejor trabajo durante su implementación.
Más beneficios de Kubernetes
Que Kubernetes haya sido diseñada como plataforma tiene una finalidad. El objetivo es poder construir un ecosistema de herramientas y componentes que simplifiquen la administración y la escalabilidad de las aplicaciones. Además, habilitan la posibilidad de crear otros sistemas sobre Kubernetes.
Dentro de las herramientas que se pueden utilizar se encuentran las “labels” o “etiquetas”. Estas son un beneficio porque maximizan la organización de los usuarios generando que su trabajo sea más fácil de llevar a cabo.
Por otro lado, también existen las “annotations” o las “anotaciones” que permiten darle información arbitraria a un recurso. Esto es un beneficio porque simplifica los flujos de trabajo. Además, las herramientas administrativas para inspeccionar el estado del desarrollo pueden implementarse de forma más sencilla.
Finalmente, dentro de Kubernetes también existe una función llamada Plano de Control. Este usa las mismas APIs que usan los desarrolladores y usuarios finales. De esta forma, quienes utilizan la plataforma pueden escribir sus propios controladores. También resulta beneficioso porque se puede implementar un planificador, por ejemplo, usando las propias APIs desde una herramienta de línea de comandos.
Qué es Docker
Por lo general, una duda que suele surgir cuando se habla de Kubernetes es si conviene utilizarla en relación a Docker. Sin embargo, realizar una comparación entre ambas es un error porque son tecnologías diferentes. Si bien tienen cierto grado de relación, su aplicación no es la misma.
Al igual que Kubernetes, Docker es de código abierto. Su creador es Solomon Hykes, quien contó con el apoyo de los ingenieros Andrea Luzzardi, Francois-Xavier Bourlet y Jeff Lindsay. El lanzamiento oficial de la plataforma se realizó en 2013 y su utilidad radica en automatizar la implementación de aplicaciones como contenedores portátiles autosuficientes. Los mismos, pueden ejecutarse en la nube o en entornos locales.
Durante los últimos años, Docker se impuso como el formato de contenedor predeterminado más utilizado. Como permite compilar y ejecutar contenedores en cualquier equipo de desarrollo y almacenar o compartir imágenes de contenedor mediante un registro, suele ser elegido por programadores y desarrolladores.
“A medida que las aplicaciones crecen para abarcar varios contenedores implementados en varios servidores, administrarlas se hace también cada vez más complejo”, explican desde Microsoft. La empresa ofrece su propia nube y fomenta la utilización de Docker.
“Aunque Docker ofrece un estándar abierto para empaquetar y distribuir aplicaciones en contenedores, las complicaciones pueden multiplicarse rápidamente. ¿Cómo se coordinan y programan varios contenedores? ¿Cómo se comunican entre sí los distintos contenedores de su aplicación? ¿Cómo se escalan distintas instancias de contenedor? Aquí es donde Kubernetes puede resultar útil”, resalta Microsoft.
Kubernetes vs Docker
Como ya se indicó, la comparación entre Kubernetes y Docker es injusta porque son tecnologías distintas. La diferencia entre ambos radica en que el primero sirve para orquestar el código abierto que ofrece una API para controlar la forma y el lugar en que se ejecutarán los contenedores.
En esa línea, la plataforma permite ejecutar contenedores y cargas de trabajo de Docker. Eso da soluciones a algunas de las complejidades de funcionamiento al escalar varios contenedores implementados en varios servidores.
“La diferencia entre Kubernetes y Docker se comprende con mayor facilidad cuando se enmarca como una pregunta en la que ambos pueden ser válidos”, comentan desde Microsoft”. Y agregan al respecto: “El hecho es que no es necesario elegir: Kubernetes y Docker son básicamente tecnologías distintas que funcionan bien de forma conjunta para compilar, entregar y escalar aplicaciones en contenedores”.
De todas formas, dentro de Docker existe una herramienta llamada Docker Swarm que sí puede ser comparable con Kubernetes porque sirve para orquestar contenedores. Quienes han utilizado ambos destacan que Docker Swarm es de más fácil descarga que Kubernetes. Aunque esta última ofrece más flexibilidad y funciones.
“Además, los principales proveedores de servicios en la nube ofrecen servicios de Kubernetes gestionados que hacen que sea mucho más fácil empezar a usar funciones nativas en la nube, como el escalado automático”, reflexiona Josh Campbell, gestor de Productos en Atlassian, empresa desarrolladora de softwares. “Si ejecutas muchas cargas de trabajo y necesitas interoperabilidad nativa en la nube, y además tienes muchos equipos en tu organización (lo que requiere aislar mejor los servicios), Kubernetes es la plataforma que más te conviene”, afirma el experto.
Qué son los pods
Ya se estableció que Kubernetes permite definir un conjunto de bloques de construcción que al trabajar en conjunto ofrecen los mecanismos necesarios para desplegar, mantener y ejecutar una aplicación.
Dentro de ese sistema, la unidad básica en Kubernetes para planificar se denomina “pod” o “cápsula”. La finalidad de los “pods” es sumar un nivel extra de abstracción a los componentes en los contenedores. Uno de ellos está conformado por uno o más contenedores en los que se garantiza su ubicación en el mismo equipo anfitrión y pueden compartir recursos.
En esa línea, cada “pod” tiene una dirección IP específica dentro del clúster. Esto es un beneficio para los usuarios porque genera la posibilidad a las aplicaciones de utilizar puertos sin riesgos de conflictos. Además, los “pods” pueden ser administrados de dos maneras distintas. Por un lado, de forma manual a través de la API de Kubernetes y, por el otro, delegando esa acción a un controlador.
“La organización en pods es la base de una de las funciones más conocidas de Kubernetes: la replicación. De esta manera, Kubernetes utiliza los controladores de replicación para ampliar las aplicaciones agregando nodos según se necesite”, señalan desde Red Hat. “Esto significa que si se sobrecarga un pod, Kubernetes puede replicarlo e implementarlo en el clúster de manera automática. Además de garantizar el buen funcionamiento en los momentos de mayor carga, los replica constantemente para que el sistema resista los fallos”, continúan.
Los nodos master
Otro elemento dentro de Kubernetes que permite coordinar un cluster es el “nodo master”. Estos no ejecutan contenedores, de hecho no es recomendable que lo hagan, sino que “deciden en qué nodo minion (ver apartado) se ejecuta cada contenedor”. De esta forma, cada cluster de Kubernetes debe tener al menos un nodo master.
Por otro lado, este elemento mantiene el estado del cluster y asegura que el número deseado de contenedores en ejecución sea el deseado en todo momento. Además, cuando se despliegan nuevas versiones de las aplicaciones y deben ser actualizadas, los nodos masters permiten hacerlo de forma coordinada.
La institución CampusMVP, compuesta por expertos en comunicación, destacan los principales procesos que se pueden ejecutar con un nodo master:
- etcd: Etcd es una base de datos de tipo (clave, valor) que se utiliza para mantener la configuración global del clúster. La información contenida en etcd es crítica y debe tenerse siempre un plan de copias de seguridad.
- kube-apiserver: los nodos master exponen una API que es usada para los nodos minion y los clientes del clúster para comunicarse.
- kube-scheduler: es el componente de Kubernetes encargado de decidir en qué nodo se ejecuta un determinado contenedor.
- kube-controller-manager: es el encargado de ejecutar los distintos controladores. Un “controlador” es el encargado de asegurar que en todo momento se cumple el estado deseado de la aplicación y del clúster (p. ej. que en todo momento haya 5 instancias de un contenedor determinado).
Desde el organismo también remarcan que “un nodo master no ejecuta contenedores”. “Así que no necesita tener instalado Docker y ninguno del resto de elementos necesarios para un nodo minion”, aseguran.
Finalmente, otro concepto a tener en cuenta es que cada cluster debe tener al menos un nodo master. Sin embargo, los expertos recomiendan que haya tres en cada uno de ellos. “Esto es debido a etcd. Recuerda que etcd se usa para guardar el estado global del clúster y su información es crítica. Si tienes tres nodos de etcd y pierdes uno, el sistema puede seguir funcionando, ya que los dos nodos restantes pueden seguir verificándose el uno al otro”, afirman en CampusMVP. Y concluyen sobre este tema: “En definitiva, gestionar un clúster de Kubernetes con alta disponibilidad no es nada sencillo”.
Los nodos minion
Un nodo minion es aquel que ejecuta los contenedores desplegados en el clúster. Se compone de tres elementos básicos:
Motor de contenedores:
Obviamente el motor de contenedores debe estar instalado en el clúster. Mucha gente presupone que Kubernetes solo puede ejecutar contenedores Docker pero eso no es estríctamente cierto. De serie, Kubernetes puede ejecutar Docker y rkt siendo posible integrarlo con otros motores existentes a través de CRI.
kube-proxy:
Encargado de gestionar la red virtual y las IPs virtuales asignadas a cada contenedor.
kubelet:
El componente más importante de un nodo minion, cuya función principal es asegurarse de que todos los contenedores que deben ejecutarse en este nodo se están ejecutando. Es decir, cuando a kubelet se le ordena poner en marcha un contenedor, lo pone en marcha y luego monitoriza que siga en marcha (reiniciándolo si el contenedor termina debido a una excepción no controlada) hasta que le llega la orden de parar el contenedor.
Consejos para usar Kubernetes
Kubernetes es una tecnología revolucionaria que genera muchas posibilidades para los usuarios. Sin embargo, no es fácil de utilizar, incluso para desarrolladores o programadores de gran experiencia. Por ese motivo, existen ciertos consejos que deberían tenerse en cuenta para no frustrarse a la hora de incursionar en esta plataforma.
El primero de ellos es agregar límites predeterminados de memoria y de CPU para evitar la mala administración de recursos. De no realizar este procedimiento, cada vez que se abre una conexión a una base de datos y no se cierra correctamente hay una pérdida de memoria dentro del clúster. De no tener un límite, esto podría bloquear un nodo.
Para que esto no ocurra, Kubernetes tiene una funcionalidad para establecer límites predeterminados por espacio de nombres. Esto es muy simple de llevar a cabo ya que solo implica establecer el rango y aplicarlo al espacio en cuestión.
Otro consejo, relacionado al anterior, es mantener un órden metódico durante todo el proceso de diseño. Suele ocurrir que los programadores o desarrolladores dejan ciertos elementos, que luego no utilizarán, por estar enfocados en la siguiente tarea. En ese sentido, es preferible avanzar a un ritmo más lento pero seguro ya que luego puede ser difícil encontrar dónde quedó un elemento no utilizado.
También se recomienda realizar todas las comprobaciones indicadas a medida que se va desarrollando el proyecto. De esta manera, se encontrarán errores en el momento y no al finalizar de un proceso, lo que podría implicar una gran pérdida de tiempo al retroceder para buscar los errores.
Finalmente, una herramienta ya mencionada y que resulta fundamental es la etiqueta. Un consejo de los expertos es “etiquetar todo”.
“Las etiquetas son una de las bases principales de Kubernetes. Permite que los objetos se ajusten libremente a otros objetos y también le permite consultar en función de las etiquetas”, señalan en Tecnoin, empresa que brinda servicios IT. Y destacan: “Pueden hacer casi cualquier cosa con el uso de una etiqueta”.