Skip to content

CarlosLlano/sd-exam3

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PARCIAL 3 SISTEMAS DISTRIBUIDOS

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

img1

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

img2

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:

img3

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:

  1. Se comunica permanentemente con el contenedor de consul (-consul-addr=consul:8500)

  2. 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)

  3. 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:

ev2

Diagrama general de los componentes empleados

captura


4. Incluya evidencias que muestran el funcionamiento de lo solicitado. 

Inicio

docker-compose up -d

evidencia1

evidencia 2

evidencia 3

Archivo haproxy.cfg

evidencia4

Escalar

docker-compose scale web=2

evidencia5

evidencia8

evidencia6

evidencia7

Archivo de configuracion

evidencia9

docker-compose scale web=5

ezgif com-optimize


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

About

Descubrimiento de servicio con Consul

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%