PROYECTO SISTEMAS DISTRIBUIDOS
1.Consigne los comandos de linux necesarios para el aprovisionamiento de los servicios empleados. En este punto no debe incluir archivos tipo Dockerfile solo se requiere que usted identifique los comandos o acciones que debe automatizar
Aclaracion:
- Se utiliza el playground http://labs.play-with-k8s.com/ para ejecutar kubernetes
- El servicio web se emplea utilizando una imagen propia: dakar9499/python-service y consiste en un script de python que da el nombre del contenedor que lo ejecuta.
Comandos necesarios y que deben automatizarse:
Despliegue del pod con las replicas y etiqueta exigidas
kubectl run web-deployment --image=dakar9499/python-service --replicas=3 --port=5000 --labels=app=web
Creacion del servicio
kubectl expose deployment web-deployment --name=python-service --port=8000 --target-port=5000
Verificacion de funcionamiento:
En el playground utilizado se deben ejecutar los siguientes comandos:
export SERVICE_IP=$(kubectl get service python-service -o go-template='')
export SERVICE_PORT=$(kubectl get service python-service -o go-template='')
kubectl run busybox --generator=run-pod/v1 --image=busybox --restart=Never --tty -i --env "SERVICE_IP=$SERVICE_IP" --env "SERVICE_PORT=$SERVICE_PORT"
wget -qO- http://$SERVICE_IP:$SERVICE_PORT
2.Escriba los archivos Dockerfile para los servicios empleados junto con los archivos fuente necesarios.
Dockerfile para el serivicio web
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
archivos fuente (app.py)
from flask import Flask
import os
import socket
app = Flask(__name__)
host = socket.gethostname()
@app.route('/')
def hello():
return 'Hello World! My Host name is %s\n\n' % (host)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
Para que pueda usarse el servicio con kubernetes, se tuvo que subir a docker-cloud la imagen obtenida usando los siguientes comandos
docker build -t python-service .
docker login
docker tag python-service $DOCKER_ID_USER/python-service
docker push $DOCKER_ID_USER/python-service
3.Escriba los archivos de configuración necesarios deployment.yml, service.yml para el despliegue de la infraestructura.
Incluya un diagrama general de los componentes empleados
deployment.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: dakar9499/python-service
ports:
- containerPort: 5000
service.yml
apiVersion: v1
kind: Service
metadata:
name: python-service
spec:
ports:
- port: 8000
targetPort: 5000
protocol: TCP
selector:
app: web
diagrama general de los componentes empleados
4.Incluya evidencias que muestran el funcionamiento de lo solicitado.
Comandos para montar el cluster
kubectl create -f deployment.yml
kubectl create -f service.yml
Inicio con dos nodos
Escalamiento de pods
Caída de uno de los nodos que forman parte del cluster
Los Pods son reasignados automáticamente a un nodo saludable. En este caso, se elimino el nodo2 y los pods fueron asignados al nodo 3
5.Documente algunos de los problemas encontrados y las acciones efectuadas para su solución al aprovisionar la infraestructura y aplicaciones
Problema: Referenciar un conjunto de pods
Para que con el servicio se produzca el comportamiento de balanceador de carga, hay que identificar cuales son los pods a los cuales la peticion sera redirigida.
Inicialmente se penso que haciendo referencia al nombre del deployment funcionaria, sin embargo, kubernetes aporta una directiva (selector) para hacer referencia a un conjunto de objetos (pods) si previamente se los ha etiquetado.
De esta forma:
etiqueta de los pods
referencia a los pods desde el servicio