Mostrando entradas con la etiqueta Microservices. Mostrar todas las entradas
Mostrando entradas con la etiqueta Microservices. Mostrar todas las entradas

domingo, 24 de marzo de 2024

Los Contenedores: Preguntas y Respuestas

 ¿Para qué nacieron las Computadoras? Para resolver problemas. Sí. Ya son legendarias las aventuras de Alan Turing, su equipo de trabajo y todos los esfuerzos por parte del gobierno británico para descifrar o más bien decriptar los mensajes generados con la máquina "Enigma" de los nacionales socialistas alemanes (nazis).

También las computadoras se han aplicado para analizar datos, ordenarlos (por eso en España se les dice "ordenadores") clasificarlos, realizar operaciones matemática e iterando algoritmos (que deriva del nombre del matemático árabe Abu Abdallah Muḥammad Ibn Mūsā Al-Jwarizmī).

Son precisamente esos algoritmos lo que hace que un grupo de personas, los Programadores, puedan "ecribir" Programas de Cómputo y que estos al ejecutarse en el Hardware, realmente le den sentido a las Computadoras.

Durante mucho tiempo, sin importar el lenguaje de cómputo, se seguían los lineamientos y cánones de la Programación en Cascada.

La Programación en Cascada

Más comúnmente conocida como el modelo de desarrollo de software en cascada, es una metodología secuencial que se ha utilizado tradicionalmente en la ingeniería de software. Este modelo se caracteriza por una serie de fases claramente definidas y ordenadas, donde cada fase debe completarse antes de pasar a la siguiente. Aquí te detallo sus características principales y cómo se desarrolla:

Secuencialidad: El proceso sigue una secuencia lineal desde el inicio del proyecto hasta su conclusión, sin retroceder a fases anteriores.

Estructura Fija: Las fases del proyecto son fijas y se completan una tras otra en orden específico: Requisitos, Diseño, Implementación, Verificación, y Mantenimiento.

Documentación Completa: Cada fase produce documentos que sirven como entrada para la siguiente fase. Esto significa que antes de escribir código, se realiza una extensa documentación de los requisitos y el diseño.

Revisiones y Aprobaciones: Al final de cada fase, el trabajo realizado se revisa y debe ser aprobado antes de pasar a la siguiente etapa.

Las Fases del Modelo en Cascada incluyen:

  • Análisis de Requisitos: Se identifican las necesidades del sistema y se documentan de manera detallada. Es la base para el diseño del sistema.
  • Diseño del Sistema y del Software: Basándose en los requisitos, se elabora una arquitectura de cómo el software funcionará internamente y en interacción con otros sistemas o con el usuario.
  • Implementación y Codificación: Los diseñadores comienzan a escribir el código del software según las especificaciones del diseño.
  • Pruebas: El software se prueba para identificar y corregir errores. Se verifica que cumpla con los requisitos especificados.
  • Despliegue: Una vez que el software ha sido probado y se considera listo, se instala o se libera para su uso.
  • Mantenimiento: Después del lanzamiento, el software entra en una fase de mantenimiento para corregir errores no identificados previamente o para realizar actualizaciones.

¿Cuáles son las Ventajas y Desventajas de este modelo de programación?:

Ventajas:
  • Predecible: Las etapas y resultados están claramente definidos, lo que facilita la planificación y el presupuesto.
  • Estructura: La metodología en cascada es fácil de entender y seguir, especialmente para proyectos simples y pequeños.
Desventajas:
  • Rigidez: La dificultad para volver a fases anteriores puede resultar en problemas si los requisitos cambian durante el desarrollo.
  • Retrasos en la Prueba: Las pruebas se realizan al final del ciclo de vida, lo que puede resultar en la detección tardía de errores fundamentales.
  • Dificultad con Requisitos Complejos o Cambiantes: No es ideal para proyectos donde los requisitos no están bien definidos desde el principio o son propensos a cambiar.
Aunque el modelo en cascada ha sido criticado por su rigidez y por no adaptarse bien a los proyectos donde los requisitos son inciertos o cambiantes, sigue siendo una metodología valiosa para ciertos tipos de proyectos con requisitos bien definidos y donde los cambios son mínimos o nulos.

Precisamente por su rigidez y como resultado de un cada vez más cambiante ambiente de operación para cualquier programa de cómputo, así como también la necesidad de incluir más dinámicos, flexibles y versátiles ambientes de ejecución, es por lo que se buscó un enfoque diferente y obviamente un modelo de programación que pudiese cumplir con todos estos nuevos requisitos. Es entonces que nace el Modelo de Programación basado en Microservicios.

La Programación Basado en Microservicios

El modelo de programación basado en microservicios representa un enfoque arquitectónico para el desarrollo de aplicaciones. En lugar de construir una aplicación monolítica grande (o inmensa en ocasiones), el enfoque de microservicios descompone o más bien parte la aplicación en componentes más pequeños y manejables, conocidos como microservicios. Estos microservicios son independientes entre sí, cada uno ejecutando un proceso único y gestionando una parte específica de la funcionalidad de la aplicación.

A continuación enumeramos cuáles son las características principales, cómo funcionan, y las ventajas y desventajas de este modelo basado en microservicios.

Características Principales:

Desacoplamiento: Cada microservicio es independiente y responsable de una función específica dentro de la aplicación. Esto permite que se desarrollen, desplieguen, y escalen de manera independiente.

Especialización: Los microservicios se centran en una sola tarea o proceso, siguiendo el principio de responsabilidad única. Esto facilita la comprensión, el desarrollo y el mantenimiento del código.

Comunicación a través de API: Los microservicios interactúan entre sí mediante interfaces de programación de aplicaciones (APIs), generalmente sobre protocolos HTTP/HTTPS con patrones de comunicación REST o GraphQL.

Tecnología Diversa: Cada microservicio puede ser desarrollado utilizando el lenguaje de programación, base de datos, o tecnología de almacenamiento más adecuado para su función específica.

Funcionamiento:
  • Una aplicación basada en microservicios se compone de varios servicios pequeños que se comunican a través de la red.
  • Cada servicio tiene su propia base de datos y lógica de negocio, lo que permite su desarrollo y escalabilidad de manera independiente.
  • Los servicios se despliegan típicamente en contenedores, lo que facilita su replicación y gestión a través de plataformas de orquestación como Kubernetes.
Ventajas:
  • Flexibilidad Tecnológica: Permite el uso de diferentes tecnologías y lenguajes de programación según las necesidades específicas del servicio.
  • Escalabilidad: Los servicios pueden escalarse independientemente, mejorando el uso de recursos y la capacidad de respuesta ante cargas variables.
  • Resiliencia: El fallo en un microservicio no necesariamente causa un fallo en toda la aplicación, lo que mejora la disponibilidad y confiabilidad del sistema.
  • Facilita la Integración Continua y la Entrega Continua (CI/CD): La independencia de los servicios facilita la actualización, el testing y el despliegue rápido y frecuente de nuevas características.
Desventajas:
  • Complejidad de Gestión: El manejo de múltiples servicios y su intercomunicación puede resultar en una complejidad operativa significativa.
  • Consistencia de Datos: Mantener la consistencia a través de los servicios puede ser desafiante, especialmente en transacciones que abarcan múltiples servicios.
  • Latencia: La comunicación entre servicios a través de la red puede introducir latencia.
  • Sobrecarga de Desarrollo: El diseño e implementación inicial pueden requerir más trabajo comparado con una aplicación monolítica debido a la planificación de la interacción entre servicios.
El enfoque de microservicios es particularmente adecuado para aplicaciones empresariales grandes y complejas, donde la capacidad de escalar y actualizar componentes de manera independiente puede ofrecer ventajas significativas en términos de agilidad y mantenibilidad.

Queremos aquí hacer una pausa, pues como veremos más delante en esta entrada, Microservicios es un Modelo de Programación, pero los Contenedores son una manera de llevar a la práctica este modelo de programación y no por ello presentar las mismas desventajas.

¿Qué son los Contenedores?

Los contenedores son una tecnología de virtualización a nivel de sistema operativo que permite empaquetar y distribuir aplicaciones y sus dependencias de manera ligera y portátil. Cada contenedor encapsula una aplicación, junto con todas sus bibliotecas y archivos necesarios para ejecutarse, en un entorno aislado y autocontenido.

Aquí hay algunas características clave de los contenedores:

Aislamiento: Cada contenedor ejecuta su propia instancia del sistema operativo, lo que proporciona un alto grado de aislamiento y seguridad. Los contenedores comparten los recursos del sistema subyacente, como el kernel del sistema operativo, pero tienen sus propios espacios de nombres para procesos, red, almacenamiento, etc.

Portabilidad: Los contenedores son portátiles y se pueden ejecutar en cualquier entorno que admita el motor de contenedores utilizado. Esto significa que una aplicación empaquetada en un contenedor funcionará de la misma manera, independientemente de si se ejecuta en un entorno de desarrollo, pruebas o producción.

Eficiencia: Los contenedores son ligeros y rápidos de crear y destruir. Comparados con las máquinas virtuales tradicionales, que incluyen un sistema operativo completo, los contenedores comparten el núcleo del sistema operativo subyacente, lo que reduce la sobrecarga y el consumo de recursos.

Escalabilidad: Los contenedores facilitan la implementación de aplicaciones en entornos de infraestructura escalables y distribuidos. Pueden escalarse horizontalmente de manera rápida y eficiente para satisfacer las demandas cambiantes de la carga de trabajo.

Orquestación: Para gestionar y coordinar un gran número de contenedores en entornos de producción, se utilizan herramientas de orquestación de contenedores como Kubernetes, Docker Swarm o Amazon ECS. Estas herramientas permiten automatizar tareas como el despliegue, la escalabilidad, la monitorización y la recuperación ante fallos de los contenedores.

Cierto es que a la fecha en la que esta entrada fue creada, los contenedores ya no son unos completos desconocidos y el crecimiento de adopción de éstos ha sido descomunal, pero sí vale la pena (sobre todo para quienes son novatos en este tema) revisar

¿Qué SÍ son y qué NO son los Contenedores?

Qué SÍ son los contenedores:
  • Sí son entornos aislados: Los contenedores encapsulan una aplicación y todas sus dependencias en un entorno aislado del resto del sistema, lo que garantiza que funcionen de manera consistente y sin conflictos con otras aplicaciones.
  • Sí ofrecen portabilidad: Los contenedores son portátiles y pueden ejecutarse en cualquier entorno que admita el motor de contenedores utilizado, lo que facilita el desarrollo, la prueba y la implementación de aplicaciones en diferentes entornos de forma consistente.
  • Sí son eficientes: Los contenedores son ligeros y rápidos de crear y destruir, lo que los hace ideales para implementaciones rápidas y escalables de aplicaciones.
  • Sí son escalables: Los contenedores pueden escalarse horizontalmente fácilmente para satisfacer las demandas cambiantes de la carga de trabajo, lo que los hace ideales para aplicaciones en la nube y en entornos distribuidos.
Qué NO son los contenedores:
  • No son máquinas virtuales: A diferencia de las máquinas virtuales, los contenedores no incluyen un sistema operativo completo. En su lugar, comparten el kernel del sistema operativo subyacente y solo encapsulan las bibliotecas y dependencias necesarias para ejecutar la aplicación.
  • No son un reemplazo de la virtualización tradicional: Aunque los contenedores ofrecen muchas ventajas en términos de eficiencia y portabilidad, no reemplazan por completo la virtualización tradicional. Ambas tecnologías pueden coexistir y ofrecer beneficios complementarios en entornos de desarrollo y producción.
  • No son una solución de seguridad completa: Aunque los contenedores ofrecen un cierto grado de aislamiento y seguridad, no son una solución de seguridad completa por sí solos. Se deben implementar medidas adicionales, como políticas de acceso y control de seguridad, para proteger los contenedores y las aplicaciones que contienen.
MUY IMPORTANTE
Los contenedores son una herramienta poderosa para empaquetar y distribuir aplicaciones de manera eficiente y portátil, pero es importante comprender sus características y limitaciones para aprovechar al máximo su potencial.

¿Qué empresas son actualmente los más importantes e influyentes exponentes de los Contenedores?

Hay varias empresas que han sido influyentes en el desarrollo y la adopción de contenedores. Algunas de las más destacadas incluyen:

Docker, Inc.: Docker es la empresa que popularizó la tecnología de contenedores al crear la plataforma Docker. Su enfoque en la facilidad de uso y la portabilidad ayudó a impulsar la adopción masiva de contenedores en la industria de la tecnología.

Google: Google ha desempeñado un papel fundamental en el desarrollo de la tecnología de contenedores. Contribuyeron al desarrollo de Kubernetes, un sistema de orquestación de contenedores de código abierto, que se ha convertido en el estándar de facto para administrar contenedores a escala.

Red Hat: Red Hat ha sido un líder en la adopción de contenedores en el mundo empresarial. Contribuyeron al desarrollo de herramientas como Kubernetes y OpenShift, una plataforma de contenedores empresariales basada en Kubernetes.

Amazon Web Services (AWS): AWS ofrece una amplia gama de servicios de contenedores, incluyendo Amazon ECS (Elastic Container Service) y Amazon EKS (Elastic Kubernetes Service). Su infraestructura de nube escalable ha facilitado la adopción de contenedores en empresas de todos los tamaños.

Microsoft: Microsoft ha integrado el soporte para contenedores en su plataforma en la nube Azure, así como en su sistema operativo Windows Server. Han contribuido al desarrollo de herramientas como Docker Desktop for Windows y Azure Kubernetes Service (AKS).

VMware: VMware ha expandido su oferta para incluir soluciones de contenedores a través de productos como VMware Tanzu y vSphere Integrated Containers. Su experiencia en virtualización ha ayudado a las empresas a integrar contenedores en sus infraestructuras existentes.

CoreOS (ahora parte de Red Hat): CoreOS fue una empresa pionera en el desarrollo de sistemas operativos optimizados para contenedores. Su sistema operativo CoreOS Container Linux y su plataforma de orquestación de contenedores Tectonic contribuyeron al avance de la tecnología de contenedores en la industria.

Estas son solo algunas de las empresas que han desempeñado un papel importante en el desarrollo y la adopción de contenedores. Hay muchas otras organizaciones y líderes en la comunidad de código abierto que también han contribuido al éxito de esta tecnología.

¿Qué liboros y/o guías básicas hay ya disponibles para el entendimiento y aprendizaje de los Contenedores?

Aquí compartimos una lista de libros y guías básicas que pueden ser útiles para entender y aprender sobre contenedores:

"Docker Deep Dive" por Nigel Poulton: Este libro proporciona una introducción completa a Docker, desde los conceptos básicos hasta las características avanzadas. Es ideal tanto para principiantes como para usuarios experimentados.

"Kubernetes Up & Running" por Kelsey Hightower, Brendan Burns y Joe Beda: Este libro es una guía completa para comenzar con Kubernetes, la plataforma de orquestación de contenedores más popular. Cubre todo, desde los fundamentos hasta la implementación y la administración en producción.

"Docker in Action" por Jeff Nickoloff: Este libro cubre los conceptos básicos de Docker y cómo se puede utilizar para empaquetar, distribuir y ejecutar aplicaciones de manera eficiente. Proporciona ejemplos prácticos y consejos para trabajar con Docker en entornos reales.

"Containerization with Docker" por Russ McKendrick: Este libro es una guía práctica para comenzar con Docker, cubriendo temas como la instalación, la creación de imágenes de contenedores y la administración de contenedores en producción.

"The Kubernetes Book" por Nigel Poulton: Este libro es una guía detallada para comprender y trabajar con Kubernetes. Cubre desde los conceptos básicos hasta las prácticas recomendadas para implementar y administrar aplicaciones en Kubernetes.

"Learn Docker - Fundamentals of Docker 19.x" por Gabriel N. Schenker: Este libro es una introducción práctica a Docker, diseñada para aquellos que están comenzando con la tecnología de contenedores. Cubre los fundamentos y proporciona ejemplos paso a paso para comenzar a trabajar con Docker.

Documentación oficial de Docker y Kubernetes: Ambas comunidades ofrecen una amplia documentación en línea que cubre todos los aspectos de sus respectivas tecnologías. Estas guías son una excelente fuente de información para aprender sobre contenedores.

¿Qué debe de incluír un programa de estudios para una capacitación y formación completa en los Contenedores?

¿Desea ir más allá de lo que ofrecen los libros y la documentación? Entonces al parecer es necesario tomar un curso. ¿Qué debe de incluír un programa de estudios para una capacitación y formación completa en los Contenedores?

Un programa de estudios completo para la capacitación y formación en contenedores debe incluir una variedad de temas que cubran desde los fundamentos básicos hasta los aspectos más avanzados de la tecnología. Aquí hay una propuesta de los temas que podrían incluirse en dicho programa:

Introducción a los contenedores:
  • Definición de contenedores y su importancia en el desarrollo de software moderno.
  • Diferencias entre contenedores y máquinas virtuales.
  • Historia y evolución de la tecnología de contenedores.
Conceptos básicos de Docker:
  • Instalación y configuración de Docker en diferentes sistemas operativos.
  • Creación y gestión de contenedores Docker.
  • Uso de imágenes de Docker y registro de Docker Hub.
  • Redes y almacenamiento en Docker.
Orquestación de contenedores con Kubernetes:
  • Introducción a Kubernetes y su arquitectura.
  • Instalación y configuración de un clúster de Kubernetes.
  • Despliegue y escalado de aplicaciones en Kubernetes.
  • Gestión de recursos y monitoreo en Kubernetes.
Desarrollo de aplicaciones basadas en contenedores:
  • Desarrollo de aplicaciones utilizando Docker y Docker Compose.
  • Uso de Docker en entornos de desarrollo local y en la nube.
  • Integración de contenedores en pipelines de integración continua/despliegue continuo (CI/CD).
Seguridad y buenas prácticas en contenedores:
  • Principios de seguridad en contenedores.
  • Mejores prácticas para la creación de imágenes seguras.
  • Configuración de políticas de acceso y control de seguridad en Kubernetes.
Optimización y rendimiento de contenedores:
  • Estrategias para optimizar el tamaño y el rendimiento de las imágenes de Docker.
  • Configuración de recursos y límites en contenedores.
  • Estrategias de almacenamiento y gestión de datos en contenedores.
Casos de uso y estudios de casos:
  • Aplicaciones de contenedores en diferentes industrias y sectores.
  • Estudios de casos de empresas que han adoptado contenedores con éxito.
  • Prácticas recomendadas y lecciones aprendidas de implementaciones reales.
Este es solo un ejemplo de los temas que podrían incluirse en un programa de estudios completo sobre contenedores. Es importante adaptar el contenido según las necesidades y el nivel de conocimiento de los estudiantes, así como incorporar ejercicios prácticos y proyectos para reforzar los conceptos aprendidos.

¿Qué alternativas existen en línea, para el aprendizaje, formación y capacitación en Contenedores?

Plataformas de cursos en línea:
  • Udemy: Ofrece una amplia variedad de cursos sobre Docker, Kubernetes y contenedores en general, impartidos por instructores expertos.
  • Coursera: Tiene cursos y especializaciones en contenedores ofrecidos por universidades y empresas líderes en tecnología.
  • LinkedIn Learning: Ofrece una amplia gama de cursos y tutoriales sobre Docker, Kubernetes y desarrollo de contenedores.
  • Pluralsight: Tiene cursos especializados en contenedores y orquestación de contenedores, diseñados para profesionales de la tecnología.
  • edX: Ofrece cursos en línea gratuitos y de pago sobre contenedores, impartidos por universidades y organizaciones académicas.
Recursos gratuitos y de código abierto:
  • Documentación oficial de Docker y Kubernetes: Ambas comunidades ofrecen una amplia documentación en línea que cubre todos los aspectos de sus respectivas tecnologías.
  • Tutoriales y guías en blogs y sitios web: Hay muchos blogs y sitios web que ofrecen tutoriales y guías gratuitas sobre Docker, Kubernetes y contenedores en general.
  • GitHub: Hay numerosos repositorios en GitHub con ejemplos de código, proyectos y recursos de aprendizaje relacionados con contenedores.
Cursos especializados y certificaciones:
  • Certificaciones oficiales de Docker y Kubernetes: Tanto Docker como Kubernetes ofrecen programas de certificación oficial que pueden ayudar a validar tus habilidades en contenedores.
  • Cursos especializados en plataformas de capacitación en línea: Algunas plataformas ofrecen cursos específicos para la preparación de certificaciones en Docker y Kubernetes.
Comunidades y grupos de usuarios:
  • Participar en comunidades en línea, como foros, grupos de usuarios y canales de Slack relacionados con Docker y Kubernetes, puede ser una forma útil de aprender y compartir conocimientos con otros profesionales de contenedores.
¿Qué ambientes de ejecución (en máquinas físicas o virtuales) existen y cuáles son las mas recomendables para comenzar a aprender a programar y ejecutar contenedores?

Para comenzar a aprender a programar y ejecutar contenedores, es útil familiarizarse con los ambientes de ejecución que permiten manejar estas tecnologías eficientemente. La buena noticia es que podemos iniciar con herramientas relativamente sencillas que no requieren de infraestructuras complejas ni de grandes recursos de hardware. Aquí algunos de los entornos más populares y accesibles:

1. Docker
Docker es la plataforma de contenedores más popular y un excelente punto de partida para aprender sobre contenedores. Permite crear, desplegar y manejar contenedores de manera sencilla y eficiente. Docker puede ejecutarse tanto en máquinas físicas como virtuales y es compatible con múltiples sistemas operativos, incluyendo Linux, macOS y Windows. Para quienes inician, Docker ofrece una curva de aprendizaje amigable y una gran cantidad de documentación y recursos de aprendizaje.

2. Kubernetes
Aunque Kubernetes es más un sistema de orquestación de contenedores que un ambiente de ejecución per se, aprender a usarlo después de Docker es un paso natural. Kubernetes te permite manejar aplicaciones contenerizadas a gran escala. Es más complejo que Docker en términos de curva de aprendizaje, pero también es muy poderoso y ampliamente utilizado en la industria. Minikube es una herramienta que te permite ejecutar Kubernetes localmente en tu máquina (física o virtual), simplificando el proceso de aprendizaje y experimentación con Kubernetes.

3. Play with Docker (PWD)
Play with Docker es una herramienta en línea que proporciona un entorno Docker gratuito, accesible directamente desde tu navegador. Es una opción excelente para experimentar con Docker sin necesidad de instalar nada en tu máquina. Aunque no sustituye la experiencia de trabajar con Docker localmente, es una forma rápida de empezar a aprender y experimentar con contenedores.

4. Katacoda
Katacoda es una plataforma de aprendizaje interactivo que ofrece escenarios gratuitos y tutoriales en vivo para tecnologías como Docker y Kubernetes. Katacoda ejecuta contenedores y ambientes de orquestación directamente en tu navegador, lo que permite aprender y experimentar sin configuraciones complejas.

Recomendaciones para Principiantes
Para los principiantes, empezar con Docker en una máquina local es altamente recomendable. Esto se debe a que Docker simplifica muchos de los conceptos fundamentales de los contenedores y tiene una comunidad de soporte extensa. Una vez que te sientas cómodo con Docker, avanzar hacia Kubernetes utilizando Minikube o incluso Katacoda para experimentar sin necesidad de un entorno de hardware dedicado puede ser el siguiente paso lógico.

¿Qué Sistemas Operativos son más recomendables para ejecutar Contenedores?

Los contenedores son una tecnología que se ejecuta en sistemas operativos basados en Linux, por lo que cualquier distribución Linux es adecuada para ejecutar contenedores. Sin embargo, algunos sistemas operativos han sido diseñados específicamente con contenedores en mente y ofrecen características adicionales para administrar y desplegar contenedores de manera más eficiente. Aquí hay algunas opciones recomendadas:

Ubuntu: Es una de las distribuciones Linux más populares y ampliamente utilizadas para ejecutar contenedores. Es fácil de instalar, tiene una amplia base de usuarios y cuenta con una gran cantidad de documentación y soporte disponible.

Fedora CoreOS: Es una distribución de Linux optimizada para ejecutar contenedores en entornos de producción. Está diseñada para ser segura, estable y fácil de administrar, con actualizaciones automáticas y soporte nativo para Kubernetes.

Red Hat Enterprise Linux (RHEL): Es una distribución de Linux empresarial con soporte comercial proporcionado por Red Hat. Ofrece características avanzadas de seguridad y administración, así como soporte a largo plazo para entornos críticos.

CentOS: Es una distribución de Linux de código abierto basada en el código fuente de RHEL. Es una opción popular para entornos de servidor debido a su estabilidad y compatibilidad con aplicaciones empresariales.

Debian: Es una distribución de Linux conocida por su estabilidad y seguridad. Es una opción sólida para ejecutar contenedores, especialmente si prefieres un enfoque más conservador y de código abierto.

Arch Linux: Es una distribución de Linux para usuarios avanzados que prefieren construir su sistema desde cero. Si estás dispuesto a configurar tu sistema manualmente, Arch Linux puede ser una opción interesante para ejecutar contenedores.

¿Qué Lenguaje de Programación puedo utilizar para programar contenedores?

La belleza de los contenedores es que permiten empaquetar y ejecutar aplicaciones de manera consistente a través de diferentes entornos, independientemente del lenguaje de programación en que estas estén escritas. Esto significa que podemos utilizar prácticamente cualquier lenguaje de programación para desarrollar tu aplicación antes de contenerizarla. La elección del lenguaje dependerá de preferencias personales, requisitos del proyecto y el ecosistema del lenguaje. Algunos de los lenguajes de programación más comunes utilizados para desarrollar aplicaciones en contenedores incluyen:

Python: Gracias a su simplicidad y legibilidad, junto con una vasta biblioteca de módulos de terceros, Python es un favorito para el desarrollo de aplicaciones web, automatización, análisis de datos, aprendizaje automático, y más.

JavaScript (Node.js): Permite ejecutar JavaScript en el lado del servidor, lo que lo hace ideal para construir aplicaciones web escalables y en tiempo real. La popularidad de JavaScript y el ecosistema NPM ofrecen una gran flexibilidad para el desarrollo de aplicaciones modernas.

Go (Golang): Conocido por su simplicidad, eficiencia y soporte nativo para la concurrencia. Es ampliamente utilizado en el ecosistema de contenedores y microservicios, especialmente porque herramientas como Docker y Kubernetes están escritas en Go.

Java: Sigue siendo popular en entornos empresariales debido a su robustez, escalabilidad y vasto ecosistema. Las aplicaciones Java pueden ser fácilmente contenerizadas y desplegadas en cualquier entorno.

Ruby: En particular el framework Ruby on Rails, es una excelente opción para el desarrollo rápido de aplicaciones web. Aunque ha disminuido en popularidad frente a otros lenguajes más nuevos, sigue siendo una opción sólida para muchos proyectos.

.NET (C#): Con la evolución de .NET Core, las aplicaciones .NET pueden ejecutarse en Linux y contenerizarse fácilmente. Esto hace que C# sea una opción atractiva para el desarrollo de aplicaciones web, servicios, y aplicaciones de escritorio.

Rust: Está ganando popularidad debido a su enfoque en la seguridad y el rendimiento. Es una buena opción para sistemas y aplicaciones donde la eficiencia y la seguridad son críticas.

¿Cuáles son los pasos a seguir para armar un laboratorio casero para aprender a programar y probar contenedores?

1. Definamos Objetivos
Antes de comenzar, es importante saber qué se quiere lograr. Esto puede incluir aprender un lenguaje de programación específico, entender cómo funcionan los contenedores o desarrollar una aplicación concreta.

2. Eligir y Preparar el Hardware
Casi cualquier computadora moderna puede ser adecuada para trabajar con contenedores. Sin embargo, asegurémonos de tener suficiente memoria RAM (8 GB es un buen punto de partida, aunque 16 GB es ideal) y espacio en disco para las imágenes de los contenedores y los contenedores mismos.

3. Instalar un Sistema Operativo Compatible
Los sistemas operativos basados en Linux son ampliamente considerados como los más adecuados para el trabajo con contenedores, aunque Windows y macOS también soportan herramientas de contenedorización como Docker. Si está instalado Linux como Sistema Operativo por defecto, podemos instalarlo en una máquina virtual o usar una dual boot setup.

4. Instalar Docker o una Plataforma de Contenedores Similar
Docker es la plataforma de contenedorización más popular. Su instalación es sencilla y está bien documentada en su sitio web oficial. Otras opciones incluyen Podman, que es un daemon-less y se presenta como una alternativa a Docker.
  • Para Linux: Encontraremos instrucciones específicas para la distribución en la documentación oficial de Docker.
  • Para Windows y macOS: Docker Desktop es la opción recomendada. Hay que asegurarse de cumplir con los requisitos del sistema.
5. Aprender los Fundamentos de Docker y la Contenedorización
Antes de empezar a programar, es crucial entender los conceptos básicos de Docker y cómo funcionan los contenedores. Esto incluye imágenes de contenedores, contenedores, Dockerfiles, volúmenes, redes y el registro de Docker. Hay muchos cursos y tutoriales gratuitos disponibles en línea.

6. Eligir un Editor de Código o IDE
Es mejor utilizar un editor de código o un entorno de desarrollo integrado (IDE) que sea cómodo. Visual Studio Code, por ejemplo, es una opción popular y gratuita que soporta una amplia gama de lenguajes de programación y tiene extensiones para trabajar con Docker.

7. Comenzar con Proyectos Simples
Practicar creando imágenes de contenedores para aplicaciones sencillas en el lenguaje de programación de nuestra elección. Un proyecto típico de iniciación puede ser contenerizar una aplicación web básica o una API.

8. Experimentar con Orquestación de Contenedores
Una vez que estemos cómodo trabajando con contenedores individuales, consideremos aprender sobre orquestación de contenedores usando herramientas como Docker Compose en un inicio, seguido de Kubernetes para escenarios más complejos.

9. Participa en la Comunidad
Unirse a comunidades en línea, como foros de Docker, GitHub, o Stack Overflow, puede proporcionar soporte, nuevos conocimientos y oportunidades para resolver problemas reales de otros usuarios.

10. Mantén la Curiosidad y Continúa Aprendiendo
El campo de la contenedorización y la infraestructura como código está en constante evolución. Hay que mantenerse actualizado con las últimas tendencias, herramientas y mejores prácticas.

Si buscamos soluciones más enfocadas en ambientes de producción o en simulación de ambientes de producción, herramientas como Minikube (para Kubernetes) o Rancher Desktop pueden ser alternativas interesantes. Estas herramientas permiten gestionar clústeres de Kubernetes en una máquina local y están más orientadas hacia pruebas de orquestación y manejo a escala de contenedores.

Hablando concretamente de Minikube, es una herramienta que facilita la ejecución de Kubernetes localmente en la computadora de escritorio o la laptop. Está diseñada para desarrolladores o entusiastas de Kubernetes que desean experimentar o desarrollar con Kubernetes sin necesidad de desplegar un clúster de Kubernetes completo en la nube o en un entorno de servidor dedicado.

Características Principales de Minikube:
  • Sencillez: Minikube inicia un clúster de Kubernetes de un solo nodo dentro de una máquina virtual (VM) en la máquina de escritorio o la laptop, lo que hace que sea fácil de instalar y ejecutar.
  • Compatibilidad: Funciona en sistemas operativos Linux, Windows y macOS.
  • Flexibilidad: Soporta diversas herramientas de virtualización, incluyendo VirtualBox, KVM, HyperKit, y más. También puede ejecutarse directamente en contenedores Docker si preferimos evitar usar una VM.
  • Desarrollo Local: Proporciona un entorno ideal para aprender Kubernetes y experimentar con contenedores sin incurrir en costos de infraestructura de nube.
  • Herramientas de Desarrollo: Minikube incluye características útiles para el desarrollo, como un Dashboard de Kubernetes, soporte para carga de configuración y volúmenes persistentes, y la capacidad de emular redes y condiciones de entorno específicas.
Cómo Funciona Minikube:
Al ejecutar Minikube, este crea y configura una máquina virtual que corre una distribución ligera de Linux. Dentro de esta VM, se inicia un clúster de Kubernetes de un solo nodo, permitiéndote desplegar y gestionar contenedores usando Kubernetes en tu máquina local.

Usos de Minikube:
  • Aprendizaje de Kubernetes: Por ser un clúster de Kubernetes real, aunque sea de un solo nodo, Minikube es una excelente herramienta para aprender cómo funciona Kubernetes y cómo se despliegan y gestionan las aplicaciones en él.
  • Desarrollo de Aplicaciones: Los desarrolladores pueden usar Minikube para desarrollar y probar aplicaciones en un entorno de Kubernetes local antes de desplegarlas en un entorno de producción o en la nube.
  • Pruebas de Integración y Funcionalidad: Permite a los equipos de desarrollo probar nuevas características, configuraciones, y más, en un entorno controlado y fácilmente reproducible.
Inicio con Minikube:
Para empezar con Minikube, necesitamos instalarlo en nuestra máquina. La documentación oficial de Minikube proporciona instrucciones detalladas de instalación y uso para diferentes sistemas operativos. Una vez instalado, podemos iniciar tu clúster de Kubernetes con el comando minikube start y comenzar a experimentar con Kubernetes de manera local.

Conclusión

Aún queda mucho material que podríamos compartir en esta entrada, pero recomendamos más bien comenzar con todo lo que hemos incluido aquí y que sea su experiencia en particular la que dicte cuáles serían los siguientes pasos.

¿Está Usted listo para comenzar con los contenedores?

miércoles, 14 de octubre de 2020

Acceso a Minikube

En esta entrada, revisaremos diferentes métodos para acceder a un Clúster de Kubernetes. Existe una variedad de clientes externos o scripts personalizados que brindan acceso al Clúster con fines administrativos. Usaremos kubectl como una herramienta de Interfaz de Línea de Comando (Command Line Interface CLI) para acceder al Clúster de Minikube Kubernetes, el panel de Kubernetes como una interfaz de usuario basada en web para interactuar con el Clúster y el comando curl con las credenciales adecuadas, para acceder al Clúster a través de una Application Programmable Interface (API).


¿Qué vamos a ver en este capítulo?
  • Revisar los métodos para acceder a Cualquier clúster de Kubernetes.
  • Configurar kubectl para Linux, macOS y Windows.
  • Acceder al Clúster de Minikube desde el Tablero o Dashboard.
  • Acceder a Minikube a través de la API.
Accediendo a Minikube

Se puede acceder a cualquier Clúster de Kubernetes que funcione correctamente a través de cualquiera de los siguientes métodos:

  • Herramientas y scripts de la Interfaz de Línea de Comandos (CLI)
  • Interfaz de usuario basada en navegador (IU web)
  • API de CLI o mediante programación
Estos métodos son aplicables a todos los clústeres de Kubernetes.

Acceso a Minikube: Interfaz de línea de comandos (CLI)

kubectl es el cliente de la Interfaz de Línea de Comandos (CLI) de Kubernetes para administrar los recursos y las aplicaciones del Clúster. Se puede utilizar de forma independiente o como parte de scripts y herramientas de automatización. Una vez que se han configurado todas las credenciales y los puntos de acceso al Clúster necesarios para kubectl, se puede utilizar de forma remota desde cualquier lugar para acceder a un Clúster.

Posteriormente usaremos kubectl para implementar aplicaciones, administrar y configurar recursos de Kubernetes.

Acceso a Minikube: interfaz de usuario basada en navegador

El panel de Kubernetes proporciona una interfaz de usuario basada en navegador para interactuar con un Clúster de Kubernetes para administrar recursos y aplicaciones en Contenedores. Posteriormente lo usaremos para implementar una aplicación en Contenedores.

Acceso a Minikube: API

Como sabemos, Kubernetes tiene el servidor API, y los operadores/usuarios se conectan a él desde el mundo externo para interactuar con el Clúster. Usando CLI y Web UI, podemos conectarnos al servidor API que se ejecuta en el Nodo Maestro para realizar diferentes operaciones. Podemos conectarnos directamente al servidor API usando sus puntos finales API y enviarle comandos, siempre que podamos acceder al nodo maestro y tener las credenciales correctas.

A continuación, podemos ver una parte del espacio de la API HTTP de Kubernetes:

Espacio de API HTTP de Kubernetes

El espacio de la API HTTP de Kubernetes se puede dividir en tres grupos independientes:

Grupo principal (/api/v1)
Este grupo incluye objetos como Pods, Servicios, nodos, espacios de nombres, mapas de configuración, secretos, etc.

Grupo nombrado
Este grupo incluye objetos en formato /apis/$NAME/$VERSION. Estas diferentes versiones de API implican diferentes niveles de estabilidad y soporte:

Nivel alfa: se puede eliminar en cualquier momento, sin previo aviso. Por ejemplo, / apis / batch / v2alpha1.

Nivel beta: está bien probado, pero la semántica de los objetos puede cambiar de formas incompatibles en una versión beta o estable posterior. Por ejemplo, /apis/certificates.k8s.io/v1beta1.Nivel estable: aparece en el software publicado para muchas versiones posteriores. Por ejemplo, /apis/networking.k8s.io/v1.

Todo el sistema: Este grupo consta de puntos finales de API de todo el sistema, como /healthz, /logs, /metrics, /ui, etc.

Podemos conectarnos a un servidor de API directamente llamando a los respectivos puntos finales de API o mediante la CLI / UI web.

A continuación, veremos cómo podemos acceder al entorno de Minikube que configuramos en el capítulo anterior.


kubectl

kubectl generalmente se instala antes de instalar Minikube, pero también podemos instalarlo después. Una vez instalado, kubectl recibe su configuración automáticamente para el acceso al Clúster de Minikube Kubernetes. Sin embargo, en otras configuraciones de Clúster de Kubernetes, es posible que debamos configurar los puntos de acceso del Clúster y los certificados que kubectl requiere para acceder al Clúster.

Existen diferentes métodos que se pueden usar para instalar kubectl, que se mencionan en la documentación de Kubernetes. Para obtener los mejores resultados, se recomienda mantener kubectl en la misma versión que Kubernetes ejecutado por Minikube; en el momento en que se escriben estas líneas, la última versión estable era la v1.14.1. A continuación, veremos algunos pasos para instalarlo en sistemas Linux, macOS y Windows.


Instalación de kubectl en Linux

Para instalar kubectl en Linux, siga las instrucciones que están a continuación:

Descargue el binario kubectl estable más reciente, hágalo ejecut'able y muévalo al PATH o RUTA:

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/NOTA: Para descargar y configurar una versión específica de kubectl (como v1.14.1), ejecute el siguiente comando:

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.14.1/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/


Installing kubectl on macOS

Hay dos formas de instalar kubectl en macOS: manualmente y usando el administrador de paquetes Homebrew. A continuación, proporcionaremos instrucciones para ambos métodos.

Para instalar kubectl manualmente, descargue el último binario estable de kubectl, hágalo ejecutable y muévalo a la RUTA con el siguiente comando:

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/NOTE: To download and setup a specific version of kubectl (such as v1.14.1), issue the following command:

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.14.1/bin/darwin/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/To install kubectl with Homebrew package manager, issue the following command:

$ brew install kubernetes-cli


Instalación de kubectl en Windows

Para instalar kubectl, podemos descargar el binario directamente o usar curl desde la CLI. Una vez descargado, el binario debe agregarse a la RUTA.

Enlace de descarga directa para binario v1.14.1 (simplemente haga clic a continuación):https://storage.googleapis.com/kubernetes-release/release/v1.14.1/bin/windows/amd64/kubectl.exeNOTA: Obtenga el último número de versión de la versión estable de kubectl en el enlace a continuación y, si es necesario, edite el enlace de descarga para el binario desde arriba:

https://storage.googleapis.com/kubernetes-release/release/stable.txtUtilice el comando curl (si está instalado) de la CLI:

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.14.1/bin/windows/amd64/kubectl.exeUna vez descargado, mueva el binario kubectl al PATH o RUTA.

Archivo de configuración de kubectl

Para acceder al Clúster de Kubernetes, el cliente de kubectl necesita el endpoint del Nodo Maestro o Principal y las credenciales adecuadas para poder interactuar con el Servidor API que se ejecuta en el Nodo Maestro o Principal. Al iniciar Minikube, el proceso de inicio crea, de forma predeterminada, un archivo de configuración "config", dentro del directorio .kube (a menudo denominado archivo dot-kube-config), que reside en el directorio de inicio del usuario.

El archivo de configuración tiene todos los detalles de conexión requeridos por kubectl. De forma predeterminada, el binario kubectl analiza este archivo para encontrar el punto final de conexión del nodo principal, junto con las credenciales. Para ver los detalles de la conexión, podemos ver el contenido del archivo ~/.kube/config (en Linux) o ejecutar el siguiente comando:

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority: /home/student/.minikube/ca.crt
server: https://192.168.99.100:8443
name: minikube
contexts:
- context:
cluster: minikube
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
user:
client-certificate: /home/student/.minikube/client.crt
client-key: /home/student/.minikube/client.key

Una vez que kubectl está instalado, podemos obtener información sobre el Clúster de Minikube con el comando kubectl cluster-info:

$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443//api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Puede encontrar más detalles sobre las opciones de la línea de comandos de kubectl aquí.

Aunque para el Clúster de Kubernetes instalado por Minikube el archivo ~/.kube/config se crea automáticamente, este no es el caso de los Clústeres de Kubernetes instalados por otras herramientas. En otros casos, el archivo de configuración debe crearse manualmente y, a veces, volver a configurarse para adaptarse a varias configuraciones de red y cliente/servidor.


Instalación del cliente CLI de kubectl (demostración)


Panel o Dashboard de Kubernetes

Como se mencionó anteriormente, el Panel o Dashboard de Kubernetes proporciona una interfaz de usuario basada en navedador para la administración de Clústeres de Kubernetes. Para acceder al panel desde Minikube, podemos usar el comando del Panel de Minikube, que abre una nueva pestaña en nuestro navegador web, mostrando el Panel de Kubernetes:

$ minikube dashboard

Panel de Kubernetes

NOTA: En caso de que el navegador no abra otra pestaña y no muestre el Panel de Control como se esperaba, verifique el resultado en su terminal, ya que puede mostrar un enlace para el Panel de Control (junto con algunos mensajes de error). Copie y pegue ese enlace en una nueva pestaña de su navegador. Dependiendo de las características de su terminal, es posible que pueda simplemente hacer clic o hacer clic con el botón derecho en el enlace para abrirlo directamente en el navegador. El enlace puede parecer similar a:

http://127.0.0.1:37751/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/

Lo más probable es que la única diferencia sea el número de PUERTO, que arriba es 37751. Su número de puerto puede ser diferente.

Después de cerrar sesión/iniciar sesión o reiniciar su estación de trabajo, se debería esperar el comportamiento normal (donde el comando del tablero de Minikube abre directamente una nueva pestaña en su navegador que muestra el Tablero).

El comando 'kubectl proxy'

Al emitir el comando kubectl proxy, kubectl se autentica con el servidor API en el Nodo Maestro o Principal y hace que el panel esté disponible en una URL ligeramente diferente a la anterior, esta vez en nuestro ejemplo, a través del puerto proxy 8001.

Primero, emitimos el comando kubectl proxy:

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

Bloquea el terminal mientras se ejecuta el proxy. Con el proxy en ejecución, podemos acceder al Panel de Control a través de la nueva URL (simplemente haga clic en él a continuación; debería funcionar en su estación de trabajo). Una vez que detengamos el proxy (con CTRL + C), el Panel de Control ya no será accesible.

http://127.0.0.1:8001/api/v1/namespaces/kube-system/services/kubernetes-dashboard:/proxy/#!/overview?namespace=default

Panel de Kubernetes a través del proxy


API con 'kubectl proxy'

Cuando se está ejecutando el proxy kubectl, podemos enviar solicitudes a la API a través del host local en el puerto proxy 8001 (desde otro terminal, ya que el proxy bloquea el primer terminal):

$ curl http://localhost:8001/
{
"paths": [
"/api",
"/api/v1",
"/apis",
"/apis/apps",
......
......
"/logs",
"/metrics",
"/openapi/v2",
"/version"
]
}

Con la solicitud curl anterior, solicitamos todos los puntos finales de API del servidor de API. Al hacer clic en el enlace de arriba (en el comando curl), se abrirá la misma salida de listado en una pestaña del navegador.

Podemos explorar todas las combinaciones de rutas con curl o en un navegador, como:

http://localhost:8001/api/v1http://localhost:8001/apis/apps/v1http://localhost:8001/healthzhttp://localhost:8001/metrics

API sin 'proxy kubectl'

Cuando no usamos el proxy kubectl, necesitamos autenticarnos en el servidor API cuando enviamos solicitudes API. Podemos autenticarnos proporcionando un token de portador al emitir un curl, o proporcionando un conjunto de claves y certificados.

Un token de portador es un token de acceso que es generado por el servidor de autenticación (el servidor API en el Nodo Maestro o Principal) y devuelto al cliente. Con ese token, el cliente puede volver a conectarse al servidor de la API de Kubernetes sin proporcionar más detalles de autenticación y, luego, acceder a los recursos.

Para obtener el token:

$ TOKEN=$(kubectl describe secret -n kube-system $(kubectl get secrets -n kube-system | grep default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d '\t' | tr -d " ")

Para obtener el API server endpoint:

$ APISERVER=$(kubectl config view | grep https | cut -f 2- -d ":" | tr -d " ")

Confirme que APISERVER almacenó la misma IP que la IP maestra de Kubernetes emitiendo los siguientes 2 comandos y comparando sus resultados:

$ echo $APISERVER
https://192.168.99.100:8443

$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443 ...

Acceda al servidor API usando el comando curl, como se muestra a continuación:

$ curl $APISERVER --header "Authorization: Bearer $TOKEN" --insecure
{
"paths": [
"/api",
"/api/v1",
"/apis",
"/apis/apps",
......
......
"/logs",
"/metrics",
"/openapi/v2",
"/version"
]
}

En lugar del token de acceso, podemos extraer el certificado de cliente, la clave del cliente y los datos de la autoridad de certificación del archivo .kube/config. Una vez extraídos, se codifican y luego se pasan con un comando curl para la autenticación. El nuevo comando curl es similar a:

$ curl $APISERVER --cert encoded-cert --key encoded-key --cacert encoded-ca


Acceso al clúster con el panel y las API de consulta con CLI (demostración)

martes, 13 de octubre de 2020

Minikube: Clúster local de Kubernetes de un solo nodo

Como mencionamos en la entrada "Instalación de Kubernetes", Minikube es la forma más fácil y recomendada de ejecutar un clúster Kubernetes todo en uno localmente en nuestras estaciones de trabajo. En esta entrada, exploraremos los requisitos para instalar Minikube localmente en nuestra estación de trabajo, junto con las instrucciones de instalación para configurarlo en sistemas operativos Linux, macOS y Windows locales.


Objetivos
  • Discutir sobre Minikube
  • Instale Minikube en la estación de trabajo local de Linux, macOS y Windows
  • Verifique la instalación local.
Requisitos para ejecutar 

MinikubeMinikube se instala y se ejecuta directamente en una estación de trabajo local con Sistema Operativo Linux, macOS o Windows. Sin embargo, para aprovechar al máximo todas las funciones que Minikube tiene para ofrecer, se debe instalar un Hipervisor Tipo 2 en la estación de trabajo local para que se ejecute junto con Minikube. Esto no significa que necesitemos crear máquinas virtuales con Sistemas Operativos Huesped con este Hipervisor.

Minikube construye toda su infraestructura siempre que el Hipervisor Tipo 2 esté instalado en nuestra estación de trabajo. Minikube invoca el Hipervisor para crear una única Máquina Virtual que luego aloja al Clúster de Kubernetes de un solo Nodo. Por lo tanto, debemos asegurarnos de que tenemos el hardware y el software necesarios que Minikube requiere para construir su entorno. A continuación, describimos los requisitos para ejecutar Minikube en nuestra estación de trabajo local:

kubectl
Es un binario que se usa para acceder y administrar cualquier clúster de Kubernetes. Se instala por separado de Minikube. Dado que instalaremos kubectl después de la instalación de Minikube, es posible que veamos advertencias durante la inicialización de Minikube; es seguro ignorarlas por el momento, pero tenga en cuenta que tendremos que instalar kubectl para poder administrar el clúster de Kubernetes. Exploraremos kubectl con más detalle posteriormente.

Hipervisor de Tipo 2
  • Sobre Sistema Operativo Linux pudiese ser VirtualBox o KVM
  • Sobre Sistema Operativo macOS pude ser VirtualBox, HyperKit o VMware Fusion
  • Sobre Sistema Operativo Windows puede ser VirtualBox o Hyper-V
NOTA: Minikube admite una opción --vm-driver = none que ejecuta los componentes de Kubernetes directamente en el Sistema Operativo Anfitrión (en el que se ejecuta el Hipervisor Tipo 2) y NO dentro de una Máquina Virtual. Con esta opción, se requiere una instalación de Docker y un Sistema Operativo Linux en la estación de trabajo local, pero NO una instalación del Hipervisor. Si usa --vm-driver = none, asegúrese de especificar una red "bridge" o puente para Docker. De lo contrario, podría cambiar entre reinicios de red, lo que provocaría la pérdida de conectividad con su Clúster.

La Virtualización Asistida por Hardware (VT-x / AMD-v) deberá estar previamente habilitada en la estación de trabajo local, dentro de la configuración del BIOS

Conexión a Internet en la primera ejecución de Minikube: para descargar paquetes, dependencias, actualizaciones y extraer imágenes necesarias para inicializar el clúster de Minikube Kubernetes. Las ejecuciones posteriores requerirán una conexión a Internet solo cuando sea necesario extraer nuevas imágenes de Docker de un repositorio de Contenedores, o cuando las aplicaciones implementadas en los Contenedores lo necesiten. Una vez que se ha extraído una imagen, se puede reutilizar sin una conexión a Internet.

En esta entrada, usamos VirtualBox como Hipervisor en los tres Sistemas Operativos: Linux, macOS y Windows, para permitir que Minikube aprovisione la Máquina Virtual que alojará al Clúster de Kubernetes de un solo Nodo.

Lea más sobre Minikube en la Documentación Oficial de Kubernetes o en GitHub.

Instalación de Minikube sobre Linux

Revisemos como instalar Minikube v1.0.1 específicamente en Ubuntu Linux 18.04 LTS con VirtualBox v6.0.

NOTA: Para otras versiones, los pasos de instalación pueden variar. ¡Compruebe la instalación de Minikube!Instalación del hipervisor VirtualBox

Agregue el repositorio de origen para la distribución biónica (Ubuntu 18.04), descargue y registre la clave pública, actualice e instale:

$ sudo bash -c 'echo "deb https://download.virtualbox.org/virtualbox/debian bionic contrib" >> /etc/apt/sources.list'
$ wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install -y virtualbox-6.0

Instalación de Minikube

Podemos descargar la última versión de la página de versiones de Minikube. En el momento en que se escribió el curso, la última versión de Minikube era la v1.0.1. Una vez descargado, necesitamos hacerlo ejecutable y agregarlo a nuestro PATH:

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v1.0.1/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/NOTA: Reemplazar /v1.0.1/ por /latest/ siempre descargará la última versión.

Iniciar Minikube

Podemos iniciar Minikube con el comando minikube start (ignore las advertencias "Unable to read.../docker/config..." y "No matching credentials..."):

$ minikube start
minikube v1.0.1 on linux (amd64)
Downloading Minikube ISO ...
142.88 MB / 142.88 MB [============================================] 100.00% 0s
Downloading Kubernetes v1.14.1 images in the background ...
Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...
"minikube" IP address is 192.168.99.100
Configuring Docker as the container runtime ...
Version of container runtime is 18.06.3-ce
Waiting for image downloads to complete ...
Preparing Kubernetes environment ...
Downloading kubeadm v1.14.1
Downloading kubelet v1.14.1
Pulling images required by Kubernetes v1.14.1 ...
Launching Kubernetes v1.14.1 using kubeadm ...
Waiting for pods: apiserver proxy etcd scheduler controller dns
Configuring cluster permissions ...
Verifying component health .....
kubectl is now configured to use "minikube"
For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/
Done! Thank you for using minikube!

Comprobación del estado

Con el comando minikube status, mostramos el estado de Minikube:

$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

Detener minikube

Con el comando minikube stop, podemos detener Minikube:

$ minikube stop
Stopping "minikube" in virtualbox ...
"minikube" stopped

Instalación de Minikube sobre macOS

Revisemos como instalar Minikube v1.0.1 específicamente en Mac OS X con VirtualBox v6.0.

NOTA: Para otras versiones, los pasos de instalación pueden variar. ¡Compruebe la instalación de Minikube!

Aunque VirtualBox es el hipervisor predeterminado para Minikube, en Mac OS X podemos configurar Minikube al inicio para usar otro hipervisor, con la opción de inicio --vm-driver=xhyve o =hyperkitInstale el hipervisor VirtualBox para hosts OS X

Descargue e instale el paquete .dmgInstalar Minikube

Podemos descargar la última versión de la página de versiones de Minikube. En el momento en que se escribieron estas líneas, la última versión de Minikube era la v1.0.1. Una vez descargado, necesitamos hacerlo ejecutable y agregarlo a el PATH o ruta:

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v1.0.1/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/NOTA: Reemplazar /v1.0.1/ por /latest/ siempre descargará la última versión.

Iniciar Minikube

Podemos iniciar Minikube con el comando minikube start (ignore las advertencias "Unable to read.../docker/config..." y "No matching credentials..."):

$ minikube start
minikube v1.0.1 on darwin (amd64)
Downloading Kubernetes v1.14.1 images in the background ...
Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...
Downloading Minikube ISO ...
142.88 MB / 142.88 MB [============================================] 100.00% 0s
"minikube" IP address is 192.168.99.100
Configuring Docker as the container runtime ...
Version of container runtime is 18.06.3-ce
Waiting for image downloads to complete ...
Preparing Kubernetes environment ...
Downloading kubeadm v1.14.1
Downloading kubelet v1.14.1
Pulling images required by Kubernetes v1.14.1 ...
Launching Kubernetes v1.14.1 using kubeadm ...
Waiting for pods: apiserver proxy etcd scheduler controller dns
Configuring cluster permissions ...
Verifying component health .....
kubectl is now configured to use "minikube"
For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/
Done! Thank you for using minikube!

Comprobación del estado

Con el comando minikube status, mostramos el estado de Minikube:

$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

Detener minikube

Con el comando minikube stop, podemos detener Minikube:

$ minikube stop
Stopping "minikube" in virtualbox ...
"minikube" stopped

Instalación de Minikube sobre Windows

Aprendamos a instalar Minikube 1.0.1específicamente en Windows 10 con VirtualBox v6.0.6.

NOTA: Para otras versiones, los pasos de instalación pueden variar. ¡Compruebe la instalación de Minikube!NOTA: El soporte de Windows se encuentra actualmente en fase experimental y puede encontrar problemas durante la instalación.Instale el hipervisor VirtualBox para hosts Windows

Descargue e instale el paquete .exeInstalar Minikube

Podemos descargar la última versión de la página de versiones de Minikube. En el momento en que se escribieron estas líneas, la última versión de Minikube era la v1.0.1. Una vez descargado, necesitamos agregarlo al PATH o ruta.

Hay dos paquetes .exe disponibles para descargar para Windows que se encuentran en Minikube v1.0.1:

  • minikube-windows-amd64.exe que debe agregarse a la RUTAo PATH manualmente
  • minikube-installer.exe que agrega automáticamente el ejecutable a la RUTA o PATH.
Descargue e instale el paquete minikube-installer.exe que se encuentra en Minikube v1.0.1.

Iniciar Minikube

Podemos iniciar Minikube usando el comando de inicio de minikube (ignore las advertencias "Unable to read...docker\\config..." y "No matching credentials..."). Abra PowerShell usando la opción Ejecutar como administrador y ejecute el siguiente comando:

PS C:\WINDOWS\system32> minikube start
minikube v1.0.1 on windows (amd64)
Downloading Kubernetes v1.14.1 images in the background ...
Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...
Downloading Minikube ISO ...
0 B / 142.88 MB [-----------------------------------------------------] 0.00%
142.88 MB / 142.88 MB [============================================] 100.00% 0s
"minikube" IP address is 192.168.99.100
Configuring Docker as the container runtime ...
Version of container runtime is 18.06.3-ce
Waiting for image downloads to complete ...
Preparing Kubernetes environment ...
Downloading kubeadm v1.14.1
Downloading kubelet v1.14.1
Pulling images required by Kubernetes v1.14.1 ...
Launching Kubernetes v1.14.1 using kubeadm ...
Waiting for pods: apiserver proxy etcd scheduler controller dns
Configuring cluster permissions ...
Verifying component health .....
kubectl is now configured to use "minikube"
For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/
Done! Thank you for using minikube!

Comprobación del estado

Podemos ver el estado de Minikube usando el comando de estado de minikube. Abra PowerShell usando la opción Ejecutar como administrador y ejecute el siguiente comando:

PS C:\WINDOWS\system32> minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

Detener Minikube

Podemos detener Minikube usando el comando de detención de minikube. Abra PowerShell usando la opción Ejecutar como administrador y ejecute el siguiente comando:

PS C:\WINDOWS\system32> minikube stop
Stopping "minikube" in virtualbox ...
"minikube" stopped.


Minikube CRI-O

Según el sitio web de CRI-O:

"CRI-O es una implementación de Kubernetes CRI (Container Runtime Interface) para permitir el uso de tiempos de ejecución compatibles con OCI (Open Container Initiative)".

Inicie Minikube con CRI-O como tiempo de ejecución del contenedor, en lugar de Docker, con el siguiente comando:

$ minikube start --container-runtime=cri-o
minikube v1.0.1 on linux (amd64)
Downloading Kubernetes v1.14.1 images in the background ...
Tip: Use 'minikube start -p <name>' to create a new cluster, or 'minikube delete' to delete this one.
Restarting existing virtualbox VM for "minikube" ...
Waiting for SSH access ...
"minikube" IP address is 192.168.99.100
Configuring CRI-O as the container runtime ...
Version of container runtime is 1.13.5
Waiting for image downloads to complete ...
Preparing Kubernetes environment ...
Pulling images required by Kubernetes v1.14.1 ...
Relaunching Kubernetes v1.14.1 using kubeadm ...
Waiting for pods: apiserver etcd scheduler controller
Updating kube-proxy configuration ...
Verifying component health ......
kubectl is now configured to use "minikube"
For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/
Done! Thank you for using minikube!

Iniciemos sesión a través de ssh en la máquina virtual de Minikube:

$ minikube ssh

_ _
_ _ ( ) ( )
___ ___ (_) ___ (_)| |/') _ _ | |_ __
/' _ ` _ `\| |/' _ `\| || , < ( ) ( )| '_`\ /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )( ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

$ _


NOTA: Si intenta enumerar los contenedores con el comando docker, no producirá ningún resultado, porque Docker no está ejecutando contenedores:

$ sudo docker container lsCannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Enumere los contenedores creados a través del tiempo de ejecución del contenedor CRI-O con el siguiente comando:

$ sudo runc list
ID PID STATUS BUNDLE CREATED OWNER
1090869caeea44cb179d31b70ba5b6de96f10a8a5f4286536af5dac1c4312030 3661 running /run/containers/storage/overlay-containers/1090869caeea44cb179d31b70ba5b6de96f10a8a5f4286536af5dac1c4312030/userdata 2019-04-18T20:03:02.199284303Z root
1e9f8dce6d535b67822e744204098060ff92e574780a1809adbda48ad8605d06 3614 running /run/containers/storage/overlay-containers/1e9f8dce6d535b67822e744204098060ff92e574780a1809adbda48ad8605d06/userdata 2019-04-18T20:03:02.129881761Z root
1edcfc78bca52be153cc9f525d9fc64be75ccea478897004a5032f37c6c4c9dc 3812 running /run/containers/storage/overlay-containers/1edcfc78bca52be153cc9f525d9fc64be75ccea478897004a5032f37c6c4c9dc/userdata 2019-04-18T20:03:02.740669541Z root
...

Instalación de Minikube (demostración)

viernes, 18 de septiembre de 2020

Orquestación de Contenedores

Con las Imágenes de Contenedor, limitamos el código de la aplicación, su tiempo de ejecución y todas sus dependencias en un formato predefinido. Y, con tiempos de ejecución de contenedores como runC, containerd o rkt, podemos usar esas imágenes preempaquetadas para crear uno o más Contenedores. 

Todos estos entornos de ejecución son buenos para ejecutar contenedores en un solo "host". Pero, en la práctica, nos gustaría tener una solución escalable y tolerante a fallas, que se puede lograr creando un solo controlador/unidad de administración, después de conectar varios nodos juntos. Este controlador/unidad de gestión se conoce generalmente como un Orquestador de Contenedores.

En esta entrega exploraremos por qué debemos usar Orquestadores de Contenedores, veremos diferentes implementaciones de estos y dónde implementarlos.

Los puntos a tratar son:
  • Definir el concepto de Orquestación de Contenedores.
  • Explicar las razones para realizar la Orquestación de Contenedores.
  • Analizar las diferentes opciones de Orquestación de Contenedores.
  • Analizar las diferentes opciones de implementación para Orquestación de Contenedores. 

¿Qué son Contenedores?

Antes de sumergirnos en la Orquestación de Contenedores, revisemos primero qué son.

Los Contenedores son métodos centrados en las aplicaciones para ofrecer aplicaciones escalables de alto rendimiento, en cualquier infraestructura que se elija. Los Contenedores son los más adecuados para ofrecer microservicios, al proporcionar entornos virtuales portátiles y aislados para que las aplicaciones se ejecuten sin interferencia de otras aplicaciones en ejecución.

Los Microservicios
son aplicaciones ligeras escritas utilizando varios lenguajes de programación modernos, con sus propias dependencias, bibliotecas y requisitos ambientales específicos. Para garantizar que una aplicación tenga todo lo que necesita para ejecutarse correctamente, se empaqueta junto con sus Dependencias.

Los Contenedores encapsulan Microservicios y sus Dependencias, pero no los ejecutan directamente. Los Contenedores ejecutan Imágenes de Contenedores.

Una Imagen de Contenedor agrupa la aplicación junto con su ambiente de ejecución y dependencias, implementándose entonces un Contenedor a partir de la Imagen de Contenedor, que a su vez ofrece un entorno ejecutable aislado para la aplicación. Los Contenedores se pueden implementar desde una imagen específica en muchas plataformas, como estaciones de trabajo, máquinas virtuales, nube pública, etc.

¿Qué es la Orquestación de Contenedores?

En entornos de desarrollo (Dev), la ejecución de Contenedores en un solo "host" para prueba y desarrollo de aplicaciones, puede ser una opción. Sin embargo, al migrar a entornos de control de calidad (QA) y producción (Prod), ya no es una opción viable porque las aplicaciones y los servicios deben cumplir requisitos específicos:
  • Tolerancia a fallos
  • Escalabilidad bajo demanda
  • Uso óptimo de recursos
  • Descubrimiento automático para comunicarse entre sí automáticamente
  • Accesibilidad desde el mundo exterior
  • Actualizaciones/reversiones sin interrupciones y/o tiempo de inactividad.
Los Orquestadores de Contenedores son herramientas que agrupan sistemas para formar Clústeres, en los que se habilita un ambiente para la automatización y la escalabilidad en la implementación y administración de Contenedores, para cumplir los requisitos mencionados anteriormente.

Orquestando Contenedores

Dado que las empresas ejecutan sus aplicaciones en Contenedores pudiendo trasladarlas a La Nube, existe una creciente demanda de soluciones de Orquestación de Contenedores. Si bien hay muchas soluciones disponibles, algunas son meras redistribuciones de herramientas de Orquestación de Contenedores bien establecidas, enriquecidas con características y, a veces, con ciertas limitaciones de flexibilidad.

Aunque no es exhaustiva, la lista que compartimos a continuación incluye algunas herramientas y servicios de orquestación de contenedores diferentes, disponibles en la actualidad:

  • Amazon Elastic Container Service (ECS).- Es un servicio alojado proporcionado por Amazon Web Services (AWS) para ejecutar contenedores Docker a escala en su infraestructura.
  • Azure Container Instance (ACI).- Servicio básico de orquestación de contenedores proporcionado por Microsoft Azure.
  • Azure Service Fabric.- Orquestador de contenedores de código abierto proporcionado por Microsoft Azure.
  • Kubernetes.- Herramienta de orquestación de código abierto, iniciada por Google, parte del proyecto Cloud Native Computing Foundation (CNCF).
  • Maratón.- Marco (framework) para ejecutar contenedores a escala en Apache Mesos.
  • Nomad.- Orquestador de contenedores proporcionado por HashiCorp.
  • Docker Swarm.- Orquestador de contenedores proporcionado por Docker, Inc. Es parte de Docker Engine.
Por qué y para qué utilizar Orquestadores de Contenedores

Aunque podemos mantener manualmente un par de contenedores o escribir scripts para docenas de estos, los Orquestadores facilitan mucho las cosas a los operadores, especialmente cuando se trata de administrar cientos y/o miles de Contenedores que se ejecutan en una infraestructura global.

La mayoría de los Orquestadores de Contenedores pueden:
  • Agrupar "hosts" mientras se crea un clúster
  • Programe contenedores para que se ejecuten en "hosts" en el clúster según la disponibilidad de recursos
  • Permitir que los contenedores de un clúster se comuniquen entre sí independientemente del "host" en el que estén implementados en el clúster
  • Vincular contenedores y recursos de almacenamiento
  • Agrupar conjuntos de contenedores similares y vincularlos a construcciones de balanceo de carga, para simplificar el acceso a las aplicaciones en contenedores creando un nivel de abstracción entre los contenedores y el usuario
  • Gestionar y optimizar el uso de recursos
  • Permitir la implementación de políticas para proteger el acceso a las aplicaciones que se ejecutan dentro de los contenedores.
Con todas estas características configurables pero flexibles, los Orquestadores de Contenedores son una opción obvia cuando se trata de administrar aplicaciones basadas en Contenedores, a escala. Aquí en este Blog y en entradas posteriores exploraremos Kubernetes, una de las herramientas de orquestación de contenedores más demandadas disponibles en la actualidad.

A dónde aprovisionar o desplegar Orquestadores de Contenedores

La mayoría de los Orquestadores de Contenedores se pueden implementar en la infraestructura de nuestra elección: servidores físicos, máquinas virtuales, en nuestras instalaciones (On-premise), la Nube Privada o en La Nube Pública. Kubernetes, por ejemplo, se puede implementar en una estación de trabajo, con o sin un hipervisor local como VMware Workstation Player, Oracle VirtualBox, dentro del centro de datos de una empresa, en La Nube dentro de instancias de AWS Elastic Cloud Compute (EC2), máquinas virtuales de Google Compute Engine (GCE), Droplets de DigitalOcean, OpenStack, etc.

Existen soluciones "llave en mano" que permiten la instalación de clústeres de Kubernetes, con solo unos pocos comandos, sobre las infraestructuras como servicio de la nube, como GCE, AWS EC2, Docker Enterprise, IBM Cloud, Rancher, VMware, Pivotal y soluciones multinube a través de IBM Cloud Private y StackPointCloud.

Por último, pero no menos importante, está la Orquestación de Contenedores Administrada como Servicio (CaaS), más específicamente la solución administrada de Kubernetes como Servicio (KaaS), ofrecida y alojada por los principales proveedores de La Nube, como Google Kubernetes Engine (GKE), Amazon Elastic Container Servicices para Kubernetes (Amazon EKS), Azure Kubernetes Service (AKS), IBM Cloud Kubernetes Service, DigitalOcean Kubernetes, Oracle Container Engine para Kubernetes, etc. Estos se explorarán en una de las entradas posteriores.

Para nuestra siguiente entrada, hablaremos más a detalle de qué es Kubernetes y cuáles son sus componentes.