1. Consigne los comandos de linux necesarios para el aprovisionamiento de los servicios solicitados. En este punto, no debe incluir archivos tipo Dockerfile solo se requiere que usted identifique los comandos o acciones que debe automatizar.
CONTENEDOR CONSUL
Funcion: llevar registro de los servicios
docker run -d --name=consul -p 8500:8500 consul
CONTENEDOR REGISTRATOR
Funcion: Para cada contenedor que es iniciado, verifica sus servicios y los registra en el contenedor consul.
docker run -d \
--name=registrator \
--net=host \
--volume=/var/run/docker.sock:/tmp/docker.sock \
gliderlabs/registrator:latest \
-internal \
consul://localhost:8500
Se puede comprobar el funcionamiento de este contenedor con el siguiente comando:
docker logs registrator
Se observa que el registrator encontro y añadio los servicios del contenedor consul. Para verificar que fueron registrados:
curl localhost:8500/v1/catalog/services
SERVICIO WEB
El servicio web consistirá en un script de python que lleva constancia del numero de veces que el servicio web ha sido utilizado.
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
host = socket.gethostname()
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! I have been seen %s times. My Host name is %s\n\n' % (count ,host)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
Para almacenar y consultar esta informacion hace uso de un contenedor con la base de datos redis.
CONTENEDOR BALANCEADOR DE CARGA
Funcion: se encarga de redirigir las peticiones a cada uno de los servicios web. En cuanto a la implementacion se decide utilizar un contenedor con el sistema operativo centos y sobre este instalar haproxy y consul-template. Este ultimo es necesario para actualizar el archivo de configuracion de haproxy dinamicamente.
Tanto el contenedor con el servicio web como el contenedor que ejerce como balanceador de carga, necesitan archivos Dockerfile para su funcionamiento. El resto de contenedores (consul, registrator y redis) unicamente requieren el uso de las imagenes publicas.
2. Escriba los archivos Dockerfile para cada uno de los servicios solicitados junto con los archivos fuente necesarios. Tenga en cuenta consultar buenas prácticas para la elaboración de archivos Dockerfile.
Dockerfile para el servicio web
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
Dockerfile para el balanceador de carga
FROM centos:latest
RUN yum -y install wget && yum -y install unzip && yum -y install haproxy
ENV CONSUL_TEMPLATE_VERSION 0.19.3
ADD https://releases.hashicorp.com/consul-template/${CONSUL_TEMPLATE_VERSION}/consul-template_${CONSUL_TEMPLATE_VERSION}_SHA256SUMS /tmp/
ADD https://releases.hashicorp.com/consul-template/${CONSUL_TEMPLATE_VERSION}/consul-template_${CONSUL_TEMPLATE_VERSION}_linux_amd64.zip /tmp/
RUN cd /tmp && \
sha256sum -c consul-template_${CONSUL_TEMPLATE_VERSION}_SHA256SUMS 2>&1 | grep OK && \
unzip consul-template_${CONSUL_TEMPLATE_VERSION}_linux_amd64.zip && \
mv consul-template /bin/consul-template && \
rm -rf /tmp
WORKDIR /etc/haproxy
ADD haproxy.ctmpl .
Al final del dockerfile se observa que se monta un archivo llamado haproxy.ctmpl en la carpeta de configuracion de haproxy. Este archivo servira de plantilla para obtener dinamicamente la configuracion de haproxy. Para ello, contiene en su definicion de nodos, la siguiente sintaxis de consul-template:
Para obtener el archivo haproxy.cfg se requiere consul-template. En el punto siguiente, se detalla como utilizando esta herramienta el balanceador puede seguir funcionando cada vez que haya un escalamiento de los servicios web.
3. Escriba el archivo docker-compose.yml necesario para el despliegue de la infraestructura (10%). No emplee configuraciones deprecated. Incluya un diagrama general de los componentes empleados.
El archivo docker-compose.yml automatiza los comandos vistos en el punto 1.
version: '2'
services:
consul:
image: consul
container_name: consul
ports:
- 8500:8500
registrator:
image: gliderlabs/registrator:latest
container_name: registrator
links:
- consul:consul
volumes:
- /var/run/docker.sock:/tmp/docker.sock
command: -internal consul://consul:8500
balanceador:
build: haproxy/.
container_name: balanceador
labels:
- "SERVICE_NAME=Balanceador"
ports:
- "80:80"
links:
- consul:consul
command: consul-template -consul-addr=consul:8500 -template="/etc/haproxy/haproxy.ctmpl:/etc/haproxy/haproxy.cfg:/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D -p /var/run/haproxy.pid"
web:
build: web/.
labels:
- "SERVICE_NAME=ServicioWeb"
ports:
- "5000"
redis:
image: "redis:alpine"
container_name: redis
ports:
- "6379"
Como aspecto adicional que aun no se habia detallado en los puntos anteriores, el balanceador de carga inicia consul-template con el siguiente comando:
consul-template -consul-addr=consul:8500 -template="/etc/haproxy/haproxy.ctmpl:/etc/haproxy/haproxy.cfg:/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D -p /var/run/haproxy.pid"
Con este comando el balanceador realiza varias cosas:
-
Se comunica permanentemente con el contenedor de consul (-consul-addr=consul:8500)
-
Establece que cada vez que se inicie o se detenga un contenedor con el servicio web, se utilice la plantilla haproxy.ctmpl para generar el archivo de configuracion haproxy.cfg (-template="/etc/haproxy/haproxy.ctmpl:/etc/haproxy/haproxy.cfg:/usr/sbin/haproxy)
-
Reinicia el servicio haproxy cada vez que se actualice el archivo de configuracion (/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D -p /var/run/haproxy.pid)
De esta forma, por ejemplo con un escalamiento de tres para el servicio web, consul-template puede obtener:
Diagrama general de los componentes empleados
4. Incluya evidencias que muestran el funcionamiento de lo solicitado.
Inicio
docker-compose up -d
Archivo haproxy.cfg
Escalar
docker-compose scale web=2
Archivo de configuracion
docker-compose scale web=5
5. Documente algunos de los problemas encontrados y las acciones efectuadas para su solución al aprovisionar la infraestructura y aplicaciones
Problema: reiniciar el servicio de haproxy
La imagen de centos en la cual se instalo haproxy, no contenia las directivas para el manejo de servicios (service o systemctl). Sin embargo, siempre se puede gestionar los servicios de forma directa. En el caso de haproxy, el comando que permite iniciar o reiniciar el servicio es el siguiente:
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D -p /var/run/haproxy.pid