Docker es una plataforma de software que le permite crear, probar e implementar aplicaciones rápidamente. Docker empaqueta software en unidades estandarizadas llamadas contenedores que incluyen todo lo necesario para que el software se ejecute, incluidas bibliotecas, herramientas de sistema, código y tiempo de ejecución.
https://aws.amazon.com/es/docker
4. ¿Qué son los contenedores?
Virtualización de SO
Aislamiento de procesos
Imágenes
AutomatizaciónServidor
SO invitado
Recipientes/
bibliotecas
Recipientes/
bibliotecas
Apl. 2Apl. 1
5. Ventajas de los contenedores
Portabilidad
Flexibilidad
Rapidez
EficaciaServidor
SO invitado
Recipientes/
bibliotecas
Recipientes/
bibliotecas
Apl. 2Apl. 1
6. Evolución de los servicios para convertirse en
microservicios
Aplicación monolítica
IU de
pedidos
IU de
usuarios
IU de
envíos
Servicio
de pedidos
Servicio
de usuarios
Servicio
de envíos
Acceso
a los datos
Host 1
Servicio A
Servicio B
Host 2
Servicio B
Servicio D
Host 3
Servicio A
Servicio C
Host 4
Servicio B
Servicio C
7. Contenedores: un sistema natural para los microservicios
Modelado sencillo
Cualquier aplicación, cualquier lenguaje
La imagen es la versión
Se prueba e implementa la misma imagen
Los servidores sin estado reducen el riesgo en un cambio
9. Calendarizar un clúster es complicado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
Servidor
SO
invitado
11. Administración de clústeres: administración
de recursos
Docker
Tarea
Instancia de EC2
Contenedor
Docker
Tarea
Instancia de EC2
Contenedor
Tarea
Contenedor
Docker
Instancia de EC2
Tarea
Contenedor
AZ 1 AZ 2
12. Administración de clústeres: Calendarización
Docker
Tarea
Instancia de EC2
Contenedor
Docker
Tarea
Instancia de EC2
Contenedor
Tarea
Contenedor
Docker
Instancia de EC2
Tarea
Contenedor
AZ 1 AZ 2
13. Amazon ECS: administración de recursos
Docker
Tarea
Instancia de contenedor
Contenedor
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Tarea
Contenedor
AZ 1 AZ 2
Motor de administración de clústeres
14. Amazon ECS: Comunicación con los agentes
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
Tarea
Contenedor
AZ 1 AZ 2
Motor de administración de clústeres
Servicio de comunicación con los agentes
15. Amazon ECS: Almacén de llave/valor
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
ELB
Internet
ELB
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
Tarea
Contenedor
AZ 1 AZ 2
Almacén de clave/valor
Motor de administración de clústeres
Servicio de comunicación con los agentes
16. Amazon ECS: API
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
ELB
Internet
ELB
Usuario/
programador
API
Motor de administración de clústeres
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
Tarea
Contenedor
AZ 1 AZ 2
Almacén de clave/valor
Servicio de comunicación con los agentes
17. Amazon ECS: Calendarización
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
ELB
Internet
ELB
Usuario/
calendarizador
API
Motor de administración de clústeres
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
Tarea
Contenedor
AZ 1 AZ 2
Almacén de clave/valor
Servicio de comunicación con los agentes
27. Amazon ECS
Docker
Tarea
Instancia de contenedor
Amazon
ECS
Contenedor
Agente de ECS
ELB
Internet
ELB
Usuario/
programador
API
Motor de administración de clústeres
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
Tarea
Contenedor
Docker
Tarea
Instancia de contenedor
Contenedor
Agente de ECS
Tarea
Contenedor
AZ 1 AZ 2
Almacén de clave/valor
Servicio de comunicación con los agentes
34. Creación de un servicio
Adecuado para
aplicaciones y servicios
de ejecución prolongada
35. Creación de un servicio
Balance de carga del tráfico entre contenedores
Recuperación automática de contenedores que no funcionan
correctamente
Elastic Load Balancing
Volumen de datos
compartido
Contenedores
Volumen de datos
compartido
Contenedores
Volumen de datos
compartido
Contenedores
36. Servicios escalables
Escalado ascendente
Escalado descendente
Elastic Load Balancing
Volumen de datos
compartido
Contenedores
Volumen de datos
compartido
Contenedores
Volumen de datos
compartido
Contenedores
Volumen de datos
compartido
Contenedores
37. Actualización de servicio
Implementación de nueva versión
Vaciado de conexiones
Volumen de datos
compartido
Contenedores
Volumen de datos
compartido
Contenedores
Volumen de datos
compartido
Contenedores
nuevo nuevo nuevo
Elastic Load Balancing
Volumen de datos
compartido
Contenedores
Volumen de datos
compartido
Contenedores
Volumen de datos
compartido
Contenedores
anterior anterior anterior
Vamos a hablar acerca de los contenedores y por qué probablemente quieras utilizarlos. Entender para que son y como las demas personas los utilizan.
Y después como puedes utilizarlos a gran escala. Hablaremos sobre Amazon ECS, que te entrega administración de clústers
Y tendremos al final una demo con la CLI y también con la consola de ECS
Los contenedores son muy similares a virtualización de hardware, por ejemplo EC2.
En vez de particionar un host físico en múltiples máquinas virtuales, un contenedor aisla el proceso a ejecutar en un único sistema operativo
Para hacerlo, docker utiliza algunas propiedades del kernel del sistema operativo en el que vive. Con esto crear muchos procesos basados en usuarios.
Tu puedes poner límites en estos procesos como por ejemplo, cuanta memoria o CPU puede este proceso utilizar
Además puedes aislar rutas del sistema, archivos o unidades de disco enteras en tu SO base para que este proceso no pueda verlas
Docker provee un sistema de imágenes para que de forma sencilla puedas definir que corre en donde (por ejemplo, que versión de tu aplicación corre en qué contenedor)
Todo esto puede ser auomatizado ya que, si tienes la imágen de tu aplicación puedes hacer tareas repetitivas con ella.
Pues casi todo lo platicado me lo provee una máquina virtual. Entonces, para qué aprender docker?
Existen cuatro beneficios principales:
Portable: Donde sea que ejecutes tu imagen, funcionará exactamente igual. Funciona igual en tu laptop local o en tu ambiente productivo.
La imagen es la versión, por lo que es mas sencilla de administrar vs todo un SO
Puedes crear y recrear tus ambientes ya que es modular. Podemos hablar de microservicios al descomponer una aplicación en múltiples servicios que, en conjunto realizan una actividad completa. Cada servicio puede verse como un contenedor
Los contenedores son ràpidos tanto en inicializarse pero también te permiten que tus equipos de desarrollo se muevan mas rápido en términos de implementación y mejoras
La meta es descomponer la aplicación tanto como sea posible para reducir dependencia entre diferentes procesos.
Para demostrar un poco como una arquitectura de microservicios te puede ayudar a escalar de una mejor manera y moverte mas rápido. Les tengo una historia: Amazon.com, este negocio de venta de productos en línea tenía una arquitectura monolítica hace unos 12 años.
Todo, desde el servidor web hasta la interfaz de usuario, los sistemas de órdenes, el carrito de compra, el motor de recomendaciones y mucho mas… todo esto era un único código fuente enorme
Existia mucha interdepencencia entre cada uno de estos “mini sistemas” y esto hacia que escalar el sitio web fuera una tarea complicadísima
Para escalar mejor, Amazon hizo una descomposición de su arquitectura en servicios separados. Habilitó el uso de equipos de trabajo mas pequeños y enfocados en un servicio en particular, haciéndolos mucho mas eficientes
Nuevos releases o actualizaciones podian entregarse mas rápidamente de forma independiente
Esta es la arquitectura que hoy llamamos microservicios.
Los contenedores siguen una línea natural para crear arquitecturas de microservicios
Hace mucho mas sencillo modelar una aplicación y sus dependencias para empaquetarlas en algo llamado “docker file”. Al final esa “imagen” es una vesión de tu microservicio.
Esta imagen puede ser guardada en un repositorio, como si fuera código fuente. Por ejemplo puedes guardarlo github o el servicio de repositorios de AWS (ECR)
Así que es muy sencillo probarlo y ejecutarlo. Una nueva implementación es igual a un nuevo set de contenedores sin importar el server base
Recuerden que la meta es descomponer la aplicación tanto como sea posible para reducir dependencia entre diferentes procesos.
Utilizar la CLI de docker es muy sencillo. Podemos pasar de tener código fuente y un docker file a una imagen corriendo en muy poco tiempo
Cuando estás en tu laptop, comenzar a correrlo es muy sencillo… pero cuando tienes muchas imágenes corriendo (cambio de slide)
Y tu ambiente de microservicios comienza a verse así, probablemente estés corriendo un clúster.
La administración de un clúster de contenedores no es algo trivial
Necesitamos una manera de ubicar nuestros contenedores en las instancias que tienen los recursos suficientes para ejecutar las tareas de dicho contenedor
Para hacerlo de manera inteligente, necesitas conocer el estado de todo en tu sistema… por ejemplo, cuales instancias en mi clúster están saludables y tienen X o Y capacidad disponible. Como saber si un contenedor ya no está funcionando o si necesita obtener datos digamos, de un servicio de balanceo de cargas.
Como insertar a la ecuación herramientas de integración contínua que ya nuestros clientes utilizan? o un calendarizador de terceros?
Estas son algunas de las muchas preguntas que nuestros clientes tienen todos los dias
Y bueno, para responder algunas de esas preguntas, hablemos mas a fondo acerca de ellas.
Algo muy importante a tener en un clúster es un manejador de recursos (o un scheduler), responsible por dar seguimiento a todos tus recursos
Para calendarizar contenedores de la mejor manera, necesitas conocer los límites de cada recurso que conforma tu clúster, por ejemplo CPU y memoria)
Amazon ECS provee una solución para la administración de tu clúster
Básicamente se tiene un motor de administración del clúster como backend que coordina todas las instancias EC2 que conforman tu clúster ECS
Si lo ves como un clúster solo es un pool de CPU, RAM y espacio en disco, listo para que tus contenedores lo utilicen.
A estas instancias EC2 que conforman tu clúster ECS se les preinstaló un agente de ECS pero tu eres dueño de estas instancias. Incluso puedes conectarte vía ssh a ellas
Este cluster es escalable. Es posible tener un cluster de una instancia o de 100 o 1000 instancias
Generalmente nuestros clientes utilizan un clúster para separar ambientes (por ejemplo, Pruebas, desarrollo, QA, producción)
Es bueno comentarles que este agente ECS es de código abierto. Está escrito en GO y está disponible para que ustedes lo descarguen
Hablando mas a fondo sobre el agente de ECS, necesitamos tener una repositorio de datos en donde tener la información completa sobre el clúster:
Todas las tareas que corren en las instancias
Los contenedores que crean las tareas
Los recursos disponibles para nuevas tareas
Toda esta información se llama “estado del clúster” y se guarda en una base de datos no relacional, tipo llave/valor en AWS
Otro dato único de la arquitectura de ECS es que nosotros desacoplamos el calendarizador de contenedores de la administración del clúster.
Toda la información del clúster está disponible para el administrador a través de las APIs del calendarzador
Como comenté hace un momento, un calendarizador provee lógica para saber como, cuando y donde inicializar y detener contenedores
La arquitectura de ECS está diseñada para compartir el estado del clúster y con ello te permite ejecutar cualquier scheduler que requieras o con el que ya te sientas cómodo
Hablando un poco mas sobre calendarización
Con ECS cada calendarizador puede de forma periódica solicitar información sobre el estado del clúster
Esto lo hace por ejemplo para validar que los recursos estén disponibles y/o para tomar decisiones sobre donde ejecutar una nueva tarea
Una vez el calendarizador ejecute una acción (en este caso, coloque una tarea nueva en el clúster), va a actualizar el estado del cluster con nueva información
Si otro calendarizador ejecutó una acción que tomó recursos que el viejo calendarizador necesitaba, la transacción será rechazada por el sistema interno de concurrencia de ECS
Entonces, prácticamente lo que permite hacer ECS es compartir el estado del clúster para todos los calendarizadores que así lo requieran en el momento que lo requieran
Eso suena muy padre, pero cuales son los beneficios principales que nos ofrece ECS?
Nosotros desarrollamos ECS debido a que nuestros clientes habían estado ejecutando imágenes docker en EC2 pero era muy dificil administrarlos
Ellos solicitaban una manera mas sencilla… algo como un software de administración de un clúster de docker
Entonces, con ECS podemos
Administrar un clúster de instancias EC2
Conocer el estado del clúster en cualquier momento
Monitoreo granular
Escalar desde uno a 100 o miles de contenedores ejecutandose
En la gráfica mostrada podemos ver en un periodo de 3 dias,
Linea azul, el número de instancias EC2
Linea verde y roja son el P99 y P50 de latencia encontrada en nuestros servicios corriendo en los contenedores que se encuentran siendo ejecutados por (en algún momento) más de 1000 instancias EC2 que conforman nuestro clúster ECS
Esto demuestra que no existe aumento de latencia mientras se agregan instancias EC2 a nuestro clúster
ECS está hecho para trabajar de manera transparente con otros servicios de AWS que probablemente ya estén utilizando, por ejemplo un balanceador de carga, almacenamiento EBS o un rol de identidad en IAM
Puedes lanzar un clúster dentro de tu VPC y utilizar grupos de seguridad para controlar la red
Además con Cloudtrail puedes capturar todos los accesos via API para tener análisis de seguridad y cumplimiento de auditorias. Puedes hacer seguimiento de cambios y muchas cosas más
Hablando un poco mas sobre extensibilidad,
Utilizando las APIs del servicio encontrarás comandos como “listar, describir o ejecutar”, mismas que pueden sonarte bastante familiares si ya utilizas EC2
Como hemos comentado, puedes utilizar cualquier calendarizador debido a las APIs abiertas del servicio
Y recapitulando, el agente de ECS y la CLI es de código abierto.
Para sumarizar todo lo que hemos platicado, ECS te permite pasar de la idea a la ejecución muy rápido cuando hablamos de sistemas altamente distribuidos y microservicios
Asi que, si quieres un cluster de contenedores sin necesidad de administrar el clúster tu mismo, ECS es la respuesta
Y hablando de servicios, como se ejecutan en Amazon ECS?
Lo primero que debemos hacer es modelar nuestra aplicación utilizando un archivo llamado Definición de tarea, o Task Definition.
En esta tarea se definen los contenedores a ejecutar juntos
Esta definición de tarea puede ser rastreada utilizando su nombre y número de revisión… algo así como su versión
Lo importante a recordar es que: si necesitas múltiples contenedores trabajando juntos como parte de una aplicación y es necesario que todos se ejecuten en la misma instancia, debes definirlos en una definición de tarea juntos
Para crear una definición de tarea puedes utilizar la consola para especificar la imágen de docker a utilizar para los contenedores
Puedes también especificar recursos como CPU o Memoria, puertos, volúmenes
Y también puedes especificar que comando ejecutar cuando el contenedor se inicializa
Al final podemos ver un checkbox que dice “Esencial”. Esta le dice a la tarea si debería o no fallar si este contenedor deja de ejecutarse
Tambien puedes declarar tus variables en json o en docker compose si así lo requieres
Una vez que tu definición de tarea haya sido creada, puedes calendarizarla a una instancia que tenga recursos disponibles para ejecutarla
Una vez la hayas calendarizado, esa definición de tarea se convierte en una tarea en ejecución, o simplemente, una tarea
Es la unidad mínima de trabajo en ECS. Puedes tener una tarea que tenga un único contenedor o hasta 10 contenedores que trabajan juntos en una única instancia EC2 dentro de un clúster de ECS
Por ejemplo, imagínate que necesitas una aplicación que necesita nginx, rails y redis ejecutándose juntos. Pues tendras que crear una definición de tarea con esos tres contenedores y cuando la calendarices, esta se convertirá en una tarea en ejecución
Tu puedes correr tantas tareas como quepan en tu instancia y para ello debes cuidar la utilización de CPU y Memoria de tu clúster
Esta es la manera de crear un servicio en la consola de aWS
Simplemente tienes que referenciar tu definición de tarea y elegir el número de veces que esta definición sea ejecutada
También puedes definir un ELB (que en este caso será un application load balancer, para poder balancear entre puertos)
El número de tareas dentro de tu servicio se parece mucho a un grupo de autoescalado. Tiene una capacidad deseada por lo que ECS mantendrá el número de tareas en ejecución como tu lo hayas configurado
Si una tarea falla, el servicio automáticamente ejecutará una nueva tarea hasta llegar al número de tareas deseadas
Y al igual que la capacidad deseada, podemos jugar con el número de tareas dependiendo de lo que necesite nuestra aplicación como si fuera un grupo de autoescalado en EC2. Podemos agregar y retirar tareas dependiendo de alarmas configuradas
Además, podemos por medio de APIs podemos desplegar nuevas versiones sin afectar a nuestros usuarios por medio de técnicas como vaciado de conexiones.
También existen opciones para hacer depliegue total o parcial