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='{{.spec.clusterIP}}')
export SERVICE_PORT=$(kubectl get service python-service -o go-template='{{(index .spec.ports 0).port}}')
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