Retrieve
Retrieve
TELECOMUNICACIÓN
Madrid
Declaro, bajo mi responsabilidad, que el Proyecto presentado con el título
Madrid
Agradecimientos
A mis familiares, amigos y profesores, por apoyarme y estar siempre a mi lado.
IMPLEMENTACIÓN DE UNA ARQUITECTURA DE MICRO-
SERVICIOS PARA UNA RED DE SENSORES IOT SOBRE
ARDUINO
Autor: Gesteira Miñarro, Roberto.
Director: Fernández-Pacheco Sánchez-Migallón, Atilano Ramiro.
Entidad Colaboradora: ICAI Universidad Pontificia Comillas
1. Introducción
Los mundos de la tecnología y el software están en continua evolución. Los avances
en la electrónica analógica y digital han favorecido a la domótica y al IoT. Por otro
lado, el surgimiento de Cloud Computing y sus servicios IaaS, Paas y SaaS han
cambiado por completo los modelos de negocio de las empresas, siendo más
conveniente contratar proveedores cloud que implementar sus propios servicios [1].
4. Resultados
Los resultados obtenidos han sido satisfactorios, ya que se han logrado los objetivos
propuestos al comienzo del proyecto.
5. Conclusiones
6. Referencias
[1] La importancia del Cloud Computing en las empresas, 2018. [En línea]. Disponible
en: https://www.beservices.es/importancia-cloud-computing-empresas-n-5317-es
(Accedido: 26-06-2020).
[2] K. B. Roland Barcia y R. Osowski, Guía de Microservicios. Punto de vista, IBM. [En
línea]. Disponible en: https://www.ibm.com/downloads/cas/5O8YOPKN (Accedido:
09-06-2020).
[3] Arquitectura de microservicios: qué es, ventajas y desventajas. [En línea]. Disponi-
ble en: https://decidesoluciones.es/arquitectura-de-microservicios/ (Accedido: 25-06-
2020).
IMPLEMENTATION OF A MICROSERVICES ARCHITECTURE
FOR AN IOT SENSOR NETWORK OVER ARDUINO
Author: Gesteira Miñarro, Roberto.
Supervisor: Fernández-Pacheco Sánchez-Migallón, Atilano Ramiro.
Collaborating Entity: ICAI Universidad Pontificia Comillas
ABSTRACT
In this project, the feasibility of using a microservices architecture to manage a sensor
network connected to an Arduino board is analyzed. For this task, a home automation
web application has been developed. This webapp is based on a microservices
architecture deployed in Kubernetes to communicate with the sensors.
1. Introduction
The worlds of technology and software are in continuous evolution. The advances
in analog and digital electronics have favored home automation and IoT. On the
other hand, business models have been completely changed due to the rise of Cloud
Computing and its IaaS, PaaS and SaaS services, making it more convenient to hire
cloud providers rather than implementing their own services [1].
2. Project definition
This project is motivated by new technologies, such as IoT and Cloud Computing.
Virtualization techniques are commonly used in cloud services, using virtual
machines and containers. A very innovative way to deploy applications is through
containers, precisely, since they are extremely efficient in terms of the use of
resources.
The most important part of the developed system is the microservices architecture.
As shown in Fig. 2, a total of 10 microservices have been implemented (the Arduino
board is not a microservice). Each of these has a specific function and to some extent
independent of the other microservices. In addition, the communications established
between microservices are also depicted in the diagram.
A g a : Web a ica i c ai i g he e da hb a d.
Orchestrator: API gateway, entry to the microservices architecture.
Auth: User authentication in the system.
Mic c e : Ma age e f e ic c e .
Mea e: C ec i f ea e e f e e .
Publisher: Publishing measures in RabbitMQ message queues.
RabbitMQ: Message broker in charge of managing message queues.
Stats: Calculation of statistics with the measures of the messages in the queues.
MySQL: Users and microcontrollers storage.
MongoDB: Storage for statistics of measurements.
On the Arduino board, a temperature sensor and an earth humidity sensor have been
used; and a smart light bulb has been simulated using an LED.
4. Results
The results obtained have been satisfactory, since the objectives proposed at the
beginning of the project have been achieved.
In addition, a microservices architecture has been built with Docker and Kubernetes,
taking full advantage of all the benefits it provides compared to a monolithic
architecture.
The use of different programming languages and the independence existing between
microservices makes this architecture highly powerful for application development
in software development teams, since they facilitate teamwork, division of tasks and
the use of distinct technologies and methodologies.
On the other hand, unit and integration tests and manual tests have been carried out
on the developed microservices, thus obtaining high-quality software. In addition,
monitoring tools were used to visualize the resources consumed by each
microservice in production.
5. Conclusions
Once the project is completed, and based on the results obtained, it is concluded that
it is feasible to implement a microservices architecture for the use case of managing
a home automation sensor network.
6. References
[1] La importancia del Cloud Computing en las empresas, 2018. [Online]. Available:
https://www.beservices.es/importancia-cloud-computing-empresas-n-5317-es
(Accessed: Jun 26, 2020).
[2] K. B. Roland Barcia and R. Osowski, Guía de Microservicios. Punto de vista, IBM.
[Online]. Available: https://www.ibm.com/downloads/cas/5O8YOPKN (Accessed:
Jun 09, 2020).
[3] Arquitectura de microservicios: qué es, ventajas y desventajas. [Online]. Available:
https://decidesoluciones.es/arquitectura-de-microservicios/ (Accessed: Jun 25, 2020).
Índice de la memoria
1 Introducción 13
i
3 Estado del arte 45
3.1 Microservicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.2 Contenedores y máquinas virtuales . . . . . . . . . . . . . . . . . . 49
3.3 Cultura DevOps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.4 Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.5 Internet of Things (IoT) . . . . . . . . . . . . . . . . . . . . . . . . 55
3.6 Domótica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.6.1 Wink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.6.2 Usos de la domótica en la actualidad . . . . . . . . . . . . . 57
5 Sistema desarrollado 63
5.1 Arquitectura de microservicios . . . . . . . . . . . . . . . . . . . . . 63
5.2 Implementación en Kubernetes . . . . . . . . . . . . . . . . . . . . 65
5.2.1 Construcción de imágenes de Docker . . . . . . . . . . . . . 65
5.2.2 Manifiestos de Kubernetes . . . . . . . . . . . . . . . . . . . 66
5.3 Sensores IoT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.3.1 Sensor de temperatura . . . . . . . . . . . . . . . . . . . . . 69
5.3.2 Sensor de humedad . . . . . . . . . . . . . . . . . . . . . . . 70
5.4 Obtención de mediciones en tiempo real . . . . . . . . . . . . . . . 71
5.4.1 Comunicación con Arduino . . . . . . . . . . . . . . . . . . . 72
5.4.2 Descubrimiento de microcontroladores . . . . . . . . . . . . 74
5.4.3 Visualización de datos . . . . . . . . . . . . . . . . . . . . . 76
5.4.4 Componentes y servicios de Angular . . . . . . . . . . . . . 77
5.4.5 Utilización de NGINX . . . . . . . . . . . . . . . . . . . . . 79
5.5 Servicio de usuarios . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.5.1 Implementación de JSON Web Token (JWT) . . . . . . . . 81
5.5.2 Gestión de tokens . . . . . . . . . . . . . . . . . . . . . . . . 84
5.5.3 Inicio de sesión y registro de usuarios . . . . . . . . . . . . . 86
5.5.4 Autenticación mediante JWT en Angular . . . . . . . . . . . 89
5.6 Historial de mediciones . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.6.1 Implementación de un CronJob de Kubernetes . . . . . . . . 94
5.7 Otras funcionalidades . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.7.1 Encendido y apagado de LED . . . . . . . . . . . . . . . . . 95
5.7.2 Fallos de conexión de microcontroladores . . . . . . . . . . . 96
6 Análisis de resultados 97
6.1 Análisis de la arquitectura de microservicios . . . . . . . . . . . . . 98
6.2 Utilización de Docker y Kubernetes . . . . . . . . . . . . . . . . . . 99
6.3 Pruebas unitarias y de integración . . . . . . . . . . . . . . . . . . . 99
6.4 Monitorización de microservicios . . . . . . . . . . . . . . . . . . . . 101
Bibliografía 109
v
Fig. 5.13 Autenticación de usuarios en la aplicación . . . . . . . . . . . . . 88
Fig. 5.14 Regeneración del token de acceso desde Angular . . . . . . . . . . 89
Fig. 5.15 Obtención de un historial de temperaturas . . . . . . . . . . . . . 90
Fig. 5.16 Cálculo de estadísticas . . . . . . . . . . . . . . . . . . . . . . . 92
Fig. 5.17 Encendido de un LED. . . . . . . . . . . . . . . . . . . . . . . . 95
Fig. 6.1 Tráfico de red de los microservicios con Grafana y Prometheus . . 102
ix
Índice de tablas
xi
Capítulo 1
Introducción
Por otro lado, el mundo de la domótica también ha avanzado mucho, debido princi-
palmente a las mejoras de los circuitos electrónicos tanto analógicos como digitales,
a la tecnología de Internet of Things (IoT) y a los algoritmos de Machine Learning
e Inteligencia Artificial.
Todos estos cambios forman parte de la conocida como transformación digital. Este
es un proceso que llevan a cabo las empresas para actualizar sus tecnologías, sus
recursos y, en definitiva, sus modelos de negocio para no quedarse atrás respecto de
la competencia en su sector. Además, estos cambios buscan proporcionar soluciones
y valor añadido a las empresas, precisamente, con lo que obtendrán un mejor
desempeño en el mercado [1].
Quizás, lo más destacado hoy en día es la utilización de los servicios de Cloud Com-
puting para obtener soluciones de diversa naturaleza. Ejemplos de estos servicios
en la nube abarcan desde un simple software como servicio hasta una compleja
infraestructura con una gran cantidad de elementos conectados entre sí. Las prin-
cipales ventajas que proporcionan servicios en la nube para las empresas tienen
relación con la reducción de costes de mantenimiento, administración, energía y
seguridad; ya que es el proveedor cloud quien se encarga [2].
13
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
CAPÍTULO 1. INTRODUCCIÓN
14
Capítulo 2
2.1. Docker
15
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Por otro lado, Docker también se utiliza en producción. De este tema también se
hablará en la Sección 3.4. El hecho es que los contenedores de Docker son muy
ligeros y permiten ejecutar aplicaciones de manera muy sencilla. Además, con
las nuevas tecnologías de integración continua y entrega continua (CI/CD) y las
arquitecturas de microservicios, el utilizar contenedores de Docker en producción
es mucho más viable que otras alternativas de despliegue de aplicaciones.
16
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.1. Docker
asignar una etiqueta que indique su versión. Si no se indica etiqueta, por defecto
se pondrá latest, asumiendo que es la versión más reciente.
Una utilidad muy potente que ofrece Docker es la posibilidad de crear imágenes de
Docker personalizadas. Esto se realiza mediante un archivo de texto denominado
Dockerfile. Un ejemplo de este tipo de archivo puede verse en el Código 2.1.
El sufijo alpine indica que el contenedor se ejecuta sobre Alpine Linux, una distri-
bución de Linux muy ligera, simple y segura [4]. De esta manera, el contenedor es
muy liviano y consumirá menos recursos. Se trata de una etiqueta bastante común
en las imágenes de Docker Hub.
FROM node:12.18-alpine
WORKDIR /orchestrator-ms
COPY *.json ./
RUN npm install --production
17
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
FROM: Suele ser la primera instrucción del Dockerfile. Indica la imagen del
contenedor que se utilizará para ejecutar las siguientes líneas.
COPY: Sirve para añadir archivos desde el host hasta un directorio del con-
tenedor. Con esta instrucción se pueden añadir archivos de configuración o
códigos fuente.
ENV: Con este comando se indican variables de entorno (clave-valor) que tenga
que haber en el contenedor. No obstante, las variables de entorno también
se pueden introducir al iniciar el contenedor, como se verá más adelante.
18
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.1. Docker
Existe una versión experimental de este comando que se utiliza para que la ima-
gen construida funcione correctamente en distintas arquitecturas. Por ejemplo,
se puede especificar que funcione en arquitecturas linux/amd64, linux/arm64, li-
nux/arm/v7 y linux/arm/v6, entre otras. Para utilizar este comando es necesario
activar las funcionalidades experimentales de Docker y realizar ciertas configura-
ciones del comando docker buildx.
El comando docker buildx se utiliza en este proyecto para que las imágenes
de Docker construidas funcionen tanto en un ordenador (con arquitectura AMD)
como en una Raspberry Pi 4 (con arquitectura ARM).
19
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Los contenedores de Docker están pensados para no persistir datos. De hecho, cada
vez que se arranca un contenedor, este inicia siempre con las mismas instrucciones
del Dockerfile con el que se construyó la imagen, a no ser que no se borre el
contenedor, lo cual no es una práctica habitual. No obstante, antes se dijo que
Docker es útil para instanciar bases de datos como MySQL o MongoDB.
Al igual que antes, el significado de los comandos y sus múltiples opciones puede
encontrarse en la documentación oficial de Docker, accesible en [5].
20
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.2. Kubernetes
2.2. Kubernetes
Dentro del nodo master (plano de control) se ejecutan los siguientes tres procesos:
kube-apiserver, kube-controller-manager y kube-scheduler. En los demás
nodos del cluster (denominados minions) se ejecutan kubelet y kube-proxy. En
la Fig. 2.2 se muestra la arquitectura de un cluster de Kubernetes desplegado en
la nube. Lo interesante de esta imagen es ver los distintos procesos de Kubernetes
que se están ejecutando en cada nodo.
21
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
etcd: Se trata de una base de datos de tipo clave-valor para almacenar los
datos del cluster.
kubelet: Componente que se ejecuta en cada nodo del cluster que se asegura
de que todos los contenedores desplegados están ejecutándose correctamente
en los Pods.
22
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.2. Kubernetes
Una vez conocida la estructura interna de Kubernetes, conviene explicar los prin-
cipales tipos de objetos que se pueden crear en Kubernetes:
23
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
24
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.2. Kubernetes
apiVersion: v1
kind: Service
metadata:
name: angular-ms
spec:
ports:
- nodePort: 31600
port: 80
protocol: TCP
targetPort: 80
selector:
app: angular-ms
tier: frontend
type: NodePort
Otros parámetros interesantes son las etiquetas (en este caso app y tier, que po-
drían tener cualquier nombre, pero se considera buena práctica elegir nombres re-
presentativos). Estas etiquetas sirven para vincular el Service con un Deployment
y sus Pods. Una vez vinculados, se podrá acceder a los Pods de este Deployment
desde dentro del cluster mediante la dirección http://angular-ms, por ser este
el nombre del Service (clave name). También es posible utilizar las direcciones IP
de los Pods, asignadas por el Service, pero no es buena práctica ya que los Pods
son mortales y estas direcciones podrían cambiar.
Por otro lado, en el Código 2.3 se puede observar la descripción del Deployment de
angular-ms. Su definición es más extensa que la del Service, ya que es necesario
especificar más características.
25
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
En primer lugar, se ve que las etiquetas del Service anterior están escritas tanto
en la especificación del Deployment como en su plantilla (descripción de los Pods).
Otro aspecto interesante es que se indica el número de réplicas de Pods (en este
caso solo una réplica). Para describir los Pods se utiliza la clave template. Como
se vio antes, un Pod es un conjunto de contenedores. Estos contenedores se definen
mediante una lista YAML con la clave containers (en este caso la lista es de un
elemento, por lo que solo habrá un contenedor en el Pod). Dicho contenedor utiliza
una imagen llamada 7rocky/angular-ms, y Kubernetes la descarga de Docker
Hub, como repositorio de imágenes por defecto.
Existe también otro concepto relacionado con la inicialización de los Pods: los
initContainers. Estos son un conjunto de contenedores (no Pods) que se ejecutan
antes de que se levante el Pod en sí. Por ejemplo, en el Deployment del Código 2.3
se utiliza un contenedor con la imagen busybox:1.28 para ejecutar unos coman-
dos. En este caso, se utiliza el comando nslookup de UNIX para conectarse al
microservicio Orchestrator (cuyo nombre de DNS viene especificado en la variable
de entorno $ORCHESTRATOR_MS_HOSTNAME), de manera que este initContainer no
finaliza hasta que el microservicio Orchestrator esté disponible. Así, se consigue
que el microservicio Angular no inicie antes de tiempo.
Una vez aplicado el archivo YAML (conocido también como manifiesto), Kuber-
netes comenzará a crear todo lo que se ha requerido. Mediante comandos co-
mo kubectl get all, kubectl get pods, kubectl get deployments o kubectl
get services se podrá ver la información relativa a los objetos desplegados en el
cluster.
26
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.2. Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: angular-ms
spec:
replicas: 1
selector:
matchLabels:
app: angular-ms
tier: frontend
template:
metadata:
labels:
app: angular-ms
tier: frontend
spec:
containers:
- image: 7rocky/angular-ms
imagePullPolicy: Always
name: angular-ms
ports:
- containerPort: 80
resources:
limits:
cpu: 100m
memory: 64Mi
requests:
memory: 8Mi
initContainers:
- command:
- 'sh'
- '-c'
- 'until nslookup $ORCHESTRATOR_MS_HOSTNAME; do :; sleep 2; done;'
env:
- name: ORCHESTRATOR_MS_HOSTNAME
valueFrom:
configMapKeyRef:
key: ORCHESTRATOR_MS_HOSTNAME
name: env-configmap
image: busybox:1.28
name: init-angular-ms
27
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Para eliminar los objetos del cluster, se puede usar kubectl delete deployment
nombre-deployment y kubectl delete service nombre-service . Aunque es
más sencillo realizar kubectl delete -f nombre-archivo.yaml, que borrará del
cluster todos los objetos descritos en dicho archivo.
Como Kubernetes utiliza Docker por defecto como entorno de ejecución de conte-
nedores, muchos de los comandos de Kubernetes se parecen a los de Docker. Por
ejemplo, kubectl exec -it nombre-pod -- comando se utiliza para ejecutar un
comando dentro de un Pod (comúnmente se ejecuta sh o bash). Este comando pue-
de ser útil para depurar errores al desplegar una aplicación en Kubernetes.
Otros comandos útiles son kubectl describe nombre-objeto para obtener in-
formación detallada de un determinado objeto de Kubernetes; o kubectl logs
nombre-pod para visualizar los registros generados por cierto Pod en ejecución.
Cabe mencionar también que no es necesario escribir un archivo YAML para des-
plegar aplicaciones en Kubernetes. Se pueden utilizar los comandos kubectl run y
kubectl expose para desplegar un Deployment y exponerlo mediante un Service,
respectivamente. Aun así, es preferible utilizar archivos YAML, ya que estos pue-
den ser versionados mediante un sistema de control de versiones, a diferencia de
usar simples comandos.
2.2.4. Minikube
Minikube es una solución para crear un cluster local de Kubernetes formado por
un solo nodo. Se trata de una manera sencilla de iniciarse en el mundo de Kuber-
netes. Está disponible para Windows, macOS y Linux.
28
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.2. Kubernetes
29
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.2.5. MicroK8s
Esto se debe a que Kubernetes necesita de entornos Linux para funcionar. De ahí
que Minikube haga uso de máquinas virtuales (al menos para sistemas Windows y
macOS). MicroK8s no utiliza máquinas virtuales y, además, soporta la posibilidad
de crear un cluster multi-nodo. Los comandos de MicroK8s son prácticamente
iguales a los de Minikube. Su instalación también es bastante sencilla.
No obstante, Minikube sigue siendo una solución válida para desplegar el cluster,
pero no lo suficientemente apropiada para desarrollar al mismo tiempo.
Una vista de este dashboard se presenta en la Fig. 2.3. Como curiosidad, esta
página web está desarrollada con Angular.
30
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.2. Kubernetes
Otras herramientas que aportan más información útil para los administradores de
sistemas encargados de los despliegues en Kubernetes son Prometheus y Grafana.
31
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.3. Angular
Los principales tipos de archivos que se utilizan en Angular son archivos HTML,
CSS y TS. Sin embargo, los navegadores no entienden TypeScript, sino JavaScript;
por lo que Angular realiza la transpilación de TypeScript a JavaScript automáti-
camente.
Para utilizar Angular, es conveniente instalar Angular CLI mediante npm. Al iniciar
un proyecto de Angular, el entorno de desarrollo se configura por defecto para
que cada vez que se guarde un archivo, Angular CLI realice las conversiones de
archivos TS a JS y además se actualice la página del navegador automáticamente
para cargar los nuevos cambios. Esto aumenta considerablemente la experiencia
de desarrollo y la productividad del desarrollador.
32
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.3. Angular
Por otro lado, es posible utilizar preprocesadores de CSS (como LESS, SASS o
Stylus). Los archivos escritos con preprocesadores tienen que ser convertidos a CSS
para que el navegador los pueda entender. El uso de preprocesadores añade diversas
funcionalidades a las hojas de estilo convencionales (por ejemplo, utilización de
variables, reutilización de clases o estilos anidados) [10].
Angular utiliza una herramienta llamada Webpack para realizar estar traducciones
de código y para refrescar automáticamente el navegador al realizar un cambio en
un archivo.
Angular utiliza componentes para definir las vistas. Cada componente tiene una
funcionalidad subyacente. Los componentes en Angular poseen una plantilla en
HTML, una o varias hojas de estilo y un controlador en TypeScript.
Los componentes utilizan servicios (Services) para realizar funciones que no están
directamente relacionadas con la vista. Es común utilizar servicios para realizar
peticiones HTTP a arquitecturas de tipo API REST, principalmente.
Cabe mencionar que todas las peticiones HTTP que se realizan desde Angular se
hacen mediante AJAX (Asynchronous JavaScript And XML). Esta característica
es la que hace que las aplicaciones de Angular sean SPA, es decir, aplicaciones web
que no recargan la página.
33
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Entre las muchas librerías de Angular, existe Angular Material, la cual consiste en
una serie de componentes que implementan patrones de interacción con el usuario
de acuerdo con la normativa de Material Design [11]. Algunos de los componentes
de Angular Material son: cajas de texto, botones, iconos, selectores, calendarios,
menús desplegables, ventanas de diálogo y barras de progreso, entre otros.
Una librería que utiliza Angular por defecto es RxJS, la cual proporciona funciones
reactivas de JavaScript y TypeScript. La característica clave de esta librería es que
utiliza objetos denominados Observables, que facilitan el uso de código asíncrono
basado en callbacks [12].
Por otro lado, en Angular también es posible realizar pruebas. Angular incluye
por defecto las librerías karma y protractor. La primera de ellas sirve para realizar
pruebas unitarias y de integración; mientras que la segunda se utiliza para realizar
pruebas end-to-end (E2E).
2.4. Node.js
34
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.4. Node.js
Existen muchos otros módulos programados para Node.js. Para utilizar estos mó-
dulos con Node.js, se suele utilizar npm como administrador de paquetes (se dice
que npm significa Node.js Package Manager, ya que las siglas se corresponden).
35
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
npm test: Se utiliza para ejecutar los tests unitarios del proyecto. Esto tam-
bién es un script del package.json, que esta vez se llama test. Se pueden
añadir scripts personalizados al package.json, y para ejecutarlos habrá que
utilizar npm run nombre-script .
2.5. Arduino
36
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.5. Arduino
void setup() {
// put your setup code here, to run once:
void loop() {
// put your main code here, to run repeatedly:
La función setup() se utiliza para realizar las configuraciones iniciales del micro-
controlador (definir pines de entrada y salida, configurar conexiones, etc.). Por otro
lado, en la función loop() se escribe el código que deberá realizar el microcon-
trolador continuamente, ya que los programas diseñados para microcontroladores
siempre deben entrar en bucle infinito.
En este proyecto se utiliza la placa de Arduino Uno WiFi Rev2 [15], ya que posee
una antena WiFi incorporada. De esta manera no es necesario adquirir un módulo
de conexión WiFi aparte de la placa de Arduino.
Para utilizar la interfaz de conexión WiFi se usa una librería de Arduino llamada
WiFiNINA.h. Es fácil de aprender cómo se usa esta librería a partir de la documen-
tación de Arduino y de los ejemplos que proporciona el Arduino IDE referentes a
dicha librería, accesibles en [16].
37
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.6. Python
Para realizar pruebas unitarias, se utiliza unittest, una librería de Python que
proporciona diversas funciones para realizar aserciones.
38
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.7. Go
2.7. Go
2.8. MongoDB
39
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
{
"_id": "5cf0029caff5056591b0ce7d",
"firstname": "Jane",
"lastname": "Wu",
"address": {
"street": "1 Circle Rd",
"city": "Los Angeles",
"state": "CA",
"zip": "90404"
},
"hobbies": [
"surfing",
"coding"
]
}
1
Documento extraído de [20]
40
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.9. MySQL
2.9. MySQL
2.10. RabbitMQ
41
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.10.1. AMQP
Lo que se consigue con este sistema de colas es la posibilidad de que los microservi-
cios se despreocupen la recepción de los mensajes que envían. Al estar RabbitMQ
en medio, este almacenará los mensajes que sean necesarios en la colas correspon-
dientes hasta que el destinatario pueda recibirlos.
2.11. NGINX
42
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.12. Git
2.12. Git
Esta característica de Git es útil cuando se quiere realizar una nueva funcionalidad
en el código. El proceso es: crear una nueva rama, desarrollar la funcionalidad y
fusionar dicha rama con la rama origen. De esta manera se tiene el código más
estructurado y se consigue que la rama master tenga siempre código funcional.
43
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
2.12.2. GitHub
Los conceptos de Git son sencillos; sin embargo, para utilizarlo es necesario usar
una interfaz de línea de comandos, lo cual puede llegar a ser tedioso y confuso. Por
ello, existen soluciones on-line como GitHub, GitLab o BitBucket que implementan
una interfaz gráfica de Git bastante más amigable que una consola.
44
Capítulo 3
Desde el surgimiento de Internet alrededor del año 1990, las tecnologías del desa-
rrollo web han evolucionado en gran medida. En la actualidad existen cientos de
formas de desarrollar un sitio web; tantas, que a veces es difícil elegir qué tecnología
utilizar.
De estos avances de tecnologías surgió Internet of Things (IoT), que hace referencia
a la conexión de objetos cotidianos a la red de Internet (por ejemplo, un reloj, una
televisión, una lámpara, una persiana o un radiador, normalmente apodados con
el término smart).
45
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
3.1. Microservicios
Por otro lado, una arquitectura de microservicios consiste en dividir una aplicación
monolítica en programas más pequeños que implementan una sola funcionalidad
(principio de responsabilidad única). De este modo, se utilizan distintos servidores
donde se alojan y se ejecutan cada uno de estos microservicios, manteniendo una
comunicación entre sí por medio de la red (comúnmente mediante REST y colas
de mensajes) [25].
46
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
3.1. Microservicios
en los que toda la aplicación estaba contenida en un solo servidor web Apache
(montado en Linux) que ejecutaba los scripts de PHP para procesar una petición
y consultaba una base de datos de MySQL. También era frecuente el uso de ar-
quitecturas J2EE, basadas en el lenguaje Java Enterprise Edition, con un servidor
de aplicaciones como Apache Tomcat.
Con el auge de las aplicaciones web y móvil, este tipo de arquitectura se torna
insostenible cuando el tamaño de la aplicación aumenta o cuando el tráfico recibido
es muy elevado.
47
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Ventajas Descripción
Al estar toda la lógica contenida en un solo
Rapidez servidor, todas las comunicaciones entre mó-
dulos se realizan en un tiempo óptimo
Como toda la aplicación está en un único ser-
vidor, el sistema es más seguro y estable en
Seguridad y estabilidad
cuanto a comunicaciones por la red o fallos
del sistema
Ventajas Descripción
Permite la creación de módulos y la separa-
ción de funcionalidades de manera sencilla.
Escalabilidad
Además, solo es necesario desplegar el servi-
cio modificado o añadido
Cada desarrollador puede centrarse en unos
pocos microservicios y encargarse de las
Trabajo en equipo
pruebas unitarias y del despliegue de estos
microservicios
Aporta poder de decisión para elegir el len-
guaje de programación más apropiado para
Distintos lenguajes
el microservicio, en función de los requisitos
que sean necesarios
Es habitual utilizar la arquitectura de micro-
servicios con un proceso de automatización,
Automatización
como CI/CD u orquestación de servicios con
Kubernetes
Resulta sencillo adaptar el código de un mi-
croservicio ya funcional para generar otro mi-
Reutilización
croservicio parecido, y así ahorrar tiempo en
el proceso de desarrollo
Es posible utilizar varias versiones (típica-
mente dos) de un microservicio funcionando
Versiones
a la vez en producción, lo cual permite evitar
fallos de regresión
48
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Inconvenientes Descripción
Puede llegar a ser costoso migrar a otro len-
Lenguaje de programa-
guaje de programación o incluso a una nueva
ción
versión del lenguaje utilizado
Las aplicaciones monolíticas no suelen ser re-
Exclusividad utilizables ya que están diseñadas a medida
para algún propósito concreto
Como todas las funcionalidades están en un
Despliegue solo servidor, al modificar o añadir una fun-
ción, se debe desplegar la aplicación entera
Inconvenientes Descripción
Puede ser costoso corregir errores proceden-
tes de la comunicación entre distintos módu-
Pruebas de integración
los, ya que los microservicios tienden a ser
independientes entre sí
Cuando una petición realiza muchas conexio-
Tiempo de petición nes entre módulos, es probable que la laten-
cia no sea adecuada
Aumentar el número de microservicios de la
Complejidad aplicación puede elevar considerablemente su
nivel de complejidad
Las distintas maneras de alojar una aplicación web son: en un servidor físico, en
una máquina virtual o en un contenedor.
49
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Entonces, una solución a esto es utilizar distintos contenedores que hagan uso del
sistema operativo del servidor para funcionar. Por este motivo, los contenedores son
más livianos que las máquinas virtuales, ya que los contenedores tienen los mínimos
archivos de configuración que necesitan y no un sistema operativo completo.
50
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Por otro lado, en la actualidad es muy común el uso de computación sin servidor
(también conocida como serverless). Cada vez más, se recurre a proveedores de ser-
vicios en la nube, como Amazon Web Services, Google Cloud Platform, IBM Cloud
o Microsoft Azure. Esta tecnología es ampliamente utilizada para el desarrollo de
arquitecturas de tipo API REST.
Por ejemplo, con AWS Lambda [28] se puede ejecutar un código cuando Lambda
esté activo, de modo que es Lambda el que administra y aprovisiona sus propios
servidores. De esta manera, el código solo será ejecutado cuando sea requerido, lo
cual optimiza los recursos utilizados y minimiza el coste del servicio.
Por otro lado, el grupo de Operations se encarga de manejar los despliegues de las
aplicaciones que realizan los desarrolladores. Por tanto, los operadores deben saber
configurar servidores, bases de datos, servidores en la nube, máquinas virtuales y
contenedores de aplicaciones, además de realizar distintos tipos de métricas sobre
las aplicaciones en producción, para detectar puntos de mejora.
51
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Fig. 3.3. Ciclo de vida del software según la cultura DevOps [29]
52
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Existen muchos servicios que se atribuyen a Cloud Computing, los cuales se pue-
den clasificar en software como servicio (SaaS, Software as a Service), plataforma
como servicio (PaaS, Platform as a Service) e infraestructura como servicio (IaaS,
Infrastructure as a Service), principalmente.
SaaS consiste en un servicio proporcionado por los proveedores cloud listo para
que los usuarios lo utilicen por medio de Internet. De esta manera, los clientes solo
pagan por el uso de este servicio. Algunos ejemplos de SaaS son Gmail (un servi-
cio de correo electrónico) o Slack (un sistema de mensajería orientado al ámbito
profesional), como se puede ver en la Fig. 3.5.
53
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
ra desarrollar o probar una aplicación. Algunos de los PaaS más conocidos son
Cloud Foundry (disponible en IBM Cloud) y Heroku, muy útiles pare desplegar
aplicaciones web.
Por último, IaaS es una solución para montar una arquitectura de computadores
y servicios conectados entre sí, siendo el cliente el que elige qué hacer con cada
servidor, con cierto rango de libertad. Amazon Web Services y Microsoft Azure
son los dos principales proveedores cloud que ofrecen IaaS.
En la Fig. 3.6 se muestra una comparativa entre estos tres servicios de Cloud
Computing y la opción de construir una solución local, sin utilizar la nube. Es
interesante ver cómo el SaaS es gestionado al completo por el proveedor, y el
cliente solo tiene que utilizarlo; las PaaS, en cambio, requieren que los clientes
aporten datos y aplicaciones; mientras que en la IaaS, el proveedor solo se encarga
de gestionar sus propios servidores, el almacenamiento y la red.
Lo interesante es que cloud públicas como Amazon Web Services, Microsoft Azure,
Google Cloud Platform o IBM Cloud ofrecen servicios para utilizar Kubernetes y
Docker en el despliegue de aplicaciones (incluyéndose en las PaaS). Y este servicio
es el que se implementa en este proyecto, pero de manera local.
54
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
55
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
3.6. Domótica
Para proveer estos servicios, la domótica se sirve de las tecnologías de IoT y Ma-
chine Learning, principalmente. De esta manera, se consigue la conectividad de los
distintos dispositivos inteligentes de una vivienda (televisiones, lámparas, neveras,
radiadores, persianas, aspiradores, etc.).
A estos servicios de domótica se les suele añadir una aplicación de control y gestión,
para que los usuarios puedan manejar sus dispositivos a su antojo y disponer de
una gran cantidad de datos relacionados con el estado de su vivienda.
3.6.1. Wink
Wink es una empresa cuya actividad principal es la domótica. Los usuarios que
utilizan Wink disponen de una app desde la que pueden gestionar los aparatos
inteligentes de su casa, ya que estos se pueden conectar a Wink.
En estos artículos se presenta el problema que tenía Wink y lo que querían lograr.
Buscaban construir una infraestructura con baja latencia y alta disponibilidad y
confiabilidad para poder servir las comunicaciones entre los millones de disposi-
tivos conectados a Wink. La solución a la que llegaron fue implementar el stack
Kubernetes-Docker-CoreOS4 para montar una red de microservicios.
4
CoreOS es un sistema operativo open-source basado en el kernel de Linux y pensado para
utilizarse en los nodos de un cluster, como por ejemplo, un cluster de Kubernetes
56
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
3.6. Domótica
En primer lugar, para que los usuarios puedan conectar sus dispositivos inteligen-
tes, es necesario que dispongan de un concentrador o hub (como Wink Hub), que es
un aparato que está conectado a los servidores del servicio correspondiente y a los
dispositivos del usuario por medio de la red, de manera que actúa de intermediario.
Por otro lado, los usuarios disponen de una aplicación móvil conectada al provee-
dor y realizan sus gestiones directamente desde la aplicación, de forma que esas
gestiones viajan hasta el hub de su vivienda, que está conectado a sus dispositivos.
57
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Un ejemplo claro de tarea programada puede ser subir las persianas o encender
las luces a una determinada hora. Y un escenario bastante común, puede ser un
entorno de cine utilizando una smart TV y una iluminación tenue.
Todo esto se realiza mediante la aplicación móvil en unos pocos pasos, o incluso
hablando con un asistente personal que esté conectado al hub, lo cual hace que la
experiencia de usuario sea excelente.
Para lograr esto, se debe cumplir además que el retardo de tiempo desde que se
da la instrucción hasta que se realiza la acción no sea excesivo. Este parámetro
es lo que consiguió optimizar Wink mediante el stack Kubernetes-Docker-CoreOS;
en concreto, lograron un retardo de menos de 200 milisegundos en encender una
luz desde la aplicación móvil, cerrar una puerta o cambiar la temperatura de un
termostato, según se dice en [33].
58
Capítulo 4
4.1. Motivación
Primeramente, el desarrollo web está en auge. Actualmente, gran parte de las em-
presas disponen de una página web moderna, con una interfaz de usuario excelente.
Las empresas necesitan publicitarse en la red, y qué mejor manera de realizarlo con
una página web (o una app móvil) que atraiga la atención de un cliente potencial.
59
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
servicios en la nube, de ahí que sea algo importante. Este sistema se utiliza en con-
junción con Docker para montar arquitecturas de microservicios, principalmente.
El uso de microservicios ha aumentado por parte de las empresas tecnológicas,
ya que proporcionan un gran número de ventajas, como se vio anteriormente. Es-
tá claro que las últimas tendencias en desarrollo de software giran en torno a la
orquestación de contenedores y a las arquitecturas de microservicios.
En este proyecto se desarrolla una aplicación que integra funciones de Cloud Com-
puting, de IoT y de domótica, para demostrar que es una buena forma de im-
plementar un sistema de control de sensores. Como estas tecnologías son muy
novedosas y de interés para la comunidad de desarrolladores, la realización de este
proyecto puede ser de gran utilidad para conocer su estado y madurez al imple-
mentarlas en una aplicación concreta.
4.2. Objetivos
60
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
4.3. Metodología
4.3. Metodología
Para este proyecto, se utilizará una metodología ágil, como es frecuente en el mundo
del desarrollo de software. De esta manera, el desarrollo del proyecto se estructura
en ciclos o iteraciones conocidos como sprints. En cada sprint, se tratará de abordar
una funcionalidad y se realizará una documentación sobre la misma, para facilitar
la posterior etapa de pruebas y corrección de errores.
Cabe mencionar que los tiempos establecidos para cada tarea son flexibles, en el
sentido de que hay tareas que se iniciaron antes de lo estipulado y tareas que
continuaron más allá de la fecha de finalización indicada. No obstante, este dia-
61
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
grama de Gantt sí describe los pasos seguidos para la realización del proyecto y la
importancia de cada tarea, de manera orientativa.
Por otro lado, se ha utilizado Trello para la gestión de tareas concretas. Trello es
una herramienta de gestión de proyectos que permite crear tableros y tarjetas de
distinta temática. En este sentido, se crearon listas de tareas por hacer, tareas en
proceso y tareas hechas, para poder conocer el progreso del proyecto.
Respecto a la estimación económica, se han tenido en cuenta los costes del hard-
ware utilizado y de los trabajadores. Los costes de software son nulos, ya que se
han usado tecnologías open-source. La Tabla 4.1 muestra los costes considerados.
62
Capítulo 5
Sistema desarrollado
En la Fig. 5.1 se muestra el esquema diseñado. Cada una de estas entidades forman
parte del cluster de Kubernetes, a excepción de los microcontroladores (represen-
tados mediante el logotipo de Arduino).
63
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
MongoDB Stats
Auth
Microcontrollers
Con esto, se consigue que el cluster esté protegido contra el acceso no autorizado, ya
que no es posible acceder a microservicios como MySQL o MongoDB directamente
desde el exterior.
64
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Por otro lado, está el microservicio Publisher, que se encarga de recopilar las
mediciones de todos los microcontroladores almacenados en la base de datos de
MySQL y publicar estos datos en distintas colas de RabbitMQ. Esta tarea se
realiza periódicamente, cada minuto.
Existe otro microservicio, denominado Stats, que se encarga de tomar los mensajes
de las colas de RabbitMQ, calcular estadísticas en función del tipo de magnitud y
almacenar los resultados en la base de datos de MongoDB.
En este punto, es necesario escribir varios archivos Dockerfile y utilizar los co-
mandos explicados en la Sección 2.1.
65
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Las imágenes resultantes se han de subir a Docker Hub para que Kubernetes
pueda utilizarlas, aunque existe una manera de que Kubernetes utilice imágenes
de Docker locales, pero no es lo más común.
Por otro lado, existen ciertas configuraciones que no deberían estar escritas di-
rectamente en el código de los microservicios. Para no tener estas configuraciones
hard-coded, se utilizan variables de entorno.
66
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongo-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: standard
volumeMode: Filesystem
Kubernetes, por defecto, proporciona una serie de variables de entorno a los Pods
con información de todos los Services existentes en el cluster (por ejemplo, los
puertos de escucha). Sin embargo, existen otras variables de entorno que serían
muy útiles para los microservicios. Mediante un ConfigMap se pueden especificar
variables de entorno y que los Pods utilicen aquellas que necesiten. En el Código 5.2
se muestran las variables de entorno consideradas.
apiVersion: v1
data:
ANGULAR_MS_HOSTNAME: angular-ms
AUTH_MS_HOSTNAME: auth-ms
MEASURE_MS_HOSTNAME: measure-ms
MICROCONTROLLERS_MS_HOSTNAME: microcontrollers-ms
MONGO_DATABASE_NAME: iot
MONGO_HOSTNAME: mongo
MYSQL_DATABASE_NAME: iot
MYSQL_HOSTNAME: mysql
ORCHESTRATOR_MS_HOSTNAME: orchestrator-ms
QUEUE_HUMIDITY_NAME: humidities
QUEUE_LIGHT_NAME: lights
QUEUE_TEMPERATURE_NAME: temperatures
RABBITMQ_HOSTNAME: rabbitmq
STATS_MS_HOSTNAME: stats-ms
kind: ConfigMap
metadata:
name: env-configmap
namespace: default
67
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
apiVersion: v1
data:
MONGO_INITDB_ROOT_USERNAME: cm9vdA==
MONGO_INITDB_ROOT_PASSWORD: c2VjcmV0
MYSQL_ROOT_PASSWORD: bXktc2VjcmV0LXB3
MYSQL_ROOT_USERNAME: cm9vdA==
RABBITMQ_DEFAULT_USER: dXNlcg==
RABBITMQ_DEFAULT_PASS: cGFzc3dvcmQ=
kind: Secret
metadata:
name: secrets
namespace: default
type: Opaque
Otros parámetros que conviene especificar como variables de entorno son las cre-
denciales de acceso a las bases de datos y a RabbitMQ. Para ello, en vez de usar un
ConfigMap, se utiliza un Secret, el cual no presenta estas credenciales de forma
explícita, sino codificadas en Base64. El Código 5.3 contiene estas credenciales en
un Secret.
Cabe mencionar que no es necesario que la placa sea de Arduino, es posible utilizar
cualquier otro microcontrolador o dispositivo que tenga de una antena WiFi para
conectarse por HTTP a los microservicios.
68
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
En la página web del componente se muestra una función para transformar el valor
digital leído del puerto analógico a un valor de temperatura en grados centígrados.
Esta función es la siguiente:
1
T (a) = 1 !
1023
"
1 − 273’15 (5.1)
· ln −1 +
B a 298’15
69
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
300
T (a), o C
200
100
a
0
200 400 600 800 1 000
Otro sensor utilizado es el Grove - Moisture Sensor [18], que se puede utilizar para
medir la humedad del suelo (por ejemplo, de la tierra de una maceta).
Como se puede ver en la Fig. 5.4, el sensor está compuesto por dos sondas metálicas
que permiten que la corriente circule a través del suelo, para poder calcular el valor
de una resistencia que mide la cantidad de humedad presente en el suelo.
Según el valor que reciba el Arduino por el puerto analógico, se puede distinguir si
el suelo está seco, húmedo o mojado. Según las características del dispositivo pre-
sentes en su página web, se tienen los rangos de valores expuestos en la Tabla 5.1.
70
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
71
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Para realizar las peticiones HTTP desde los microservicios Orchestrator y Mea-
sure, se utiliza una librería de Node.js llamada axios. No obstante, para que la
comunicación sea exitosa, es necesario que el microservicio Measure pueda locali-
zar la placa de Arduino. Por este motivo, es necesario que el microservicio Measure
disponga de la dirección IP o una dirección de internet accesible.
Para que los microservicios puedan comunicarse con la placa de Arduino, esta tiene
que actuar como un servidor HTTP.
72
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Type: application/json
{"temperature":503}
Nótese que las cabeceras HTTP tienen que ser escritas por cuenta propia en el
sketch de Arduino, manteniendo el formato descrito en la RFC 2616 (por ejemplo,
ha de existir un salto de línea entre las cabeceras y el cuerpo en un mensaje HTTP).
client.println("Access-Control-Allow-Origin: *");
client.println("Connection: keep-alive");
client.println("Content-Type: application/json\n");
}
73
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
USERS MICROCONTROLLERS
username 1 ip
password measure
refresh_token sensor
n
username
74
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Con esta solución, los microservicios como Measure y Publisher se comunicarán con
el microservicio Microcontrollers para obtener una lista de los microcontroladores
con algún sensor concreto, como se muestra en la Fig. 5.7.
GET /humidity
findByMeasure()
Este flujo de peticiones HTTP se realizará cada vez que los microservicios Measure
o Publisher necesiten conocer los datos de los microcontroladores para llevar a cabo
las peticiones. De hecho, en el flujo de la Fig. 5.5, anteriormente comentado, se ha
omitido este paso intermedio por parte del microservicio Measure.
Desde otro punto de vista, una vez iniciada la sesión en la aplicación de Angular, el
usuario dispone de una lista de sus microcontroladores y las mediciones realizadas
por estos. Para ello, la aplicación debe obtener una lista de los microcontroladores
del usuario. El flujo de mensajes HTTP se muestra en la Fig. 5.8.
75
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
GET /microcontrollers
GET /
findByUsername()
Sin duda, la interfaz y la experiencia de usuario que ofrece Google Charts son
excelentes. Se trata de una API en la que el desarrollador simplemente provee los
datos y las configuraciones del gráfico, y las funciones de la API ya realizan el
resto. La documentación de Google Charts es pública y está disponible en [38].
Esta librería está pensada para usarse en una página web, mediante JavaScript.
Sin embargo, existen opciones para integrar Google Charts en una aplicación de
Angular (que está desarrollada en TypeScript), como la librería angular-google-
charts o la librería ng2-google-chart.
Los datos que se mostrarán mediante Google Charts son las distintas mediciones
realizadas por los sensores de la placa de Arduino, ya sean medidos en tiempo real
o sean datos anteriores guardados en base de datos. Los principales diagramas que
se utilizan son los denominados AreaChart, LineChart y GaugeChart.
76
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Así, para implementar la visualización de datos en tiempo real se han utilizado los
siguientes objetos de Angular:
77
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
1 1 1
n n
HumidityStatsComponent HumidityChartComponent
"provides#
"contains# "provides#
DashboardMicrocontrollerComponent
78
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Estas redirecciones son necesarias para que la página web pueda comunicarse con
el cluster de Kubernetes. El microservicio de Angular es el único que tiene un
NodePort, por lo que es el único accesible desde el exterior del cluster. Por este
motivo, si se realizan peticiones al microservicio Orchestrator, estas van a fallar.
79
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
upstream orchestrator-ms {
server orchestrator-ms;
}
server {
listen 80;
location / {
root /usr/share/nginx/html/;
index index.html;
try_files $uri $uri/ /index.html;
}
location = /humidity {
if ($http_referer = '') {
return 403;
}
proxy_pass http://orchestrator-ms/humidity;
}
location = /light {
if ($http_referer = '') {
return 403;
}
proxy_pass http://orchestrator-ms/light;
}
location = /temperature {
if ($http_referer = '') {
return 403;
}
proxy_pass http://orchestrator-ms/temperature;
}
location = /microcontrollers {
if ($http_referer = '') {
return 403;
}
proxy_pass http://orchestrator-ms/microcontrollers;
}
80
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Cabe mencionar que en el Código 5.5 solamente se muestra la localización del ar-
chivo index.html y la redirección de las rutas involucradas en esta funcionalidad
(faltarían las rutas relacionadas con la autenticación de usuarios); y que NGINX
devolverá un error “403 Forbidden” en caso de que la URL sea accedida directa-
mente desde la barra de búsqueda de un navegador web (así solo se permiten las
peticiones realizadas directamente por el código de la aplicación web).
Existen otras maneras de autenticar a los usuarios. Por ejemplo, es muy común el
uso de la sesión HTTP en aplicaciones web convencionales. Sin embargo, esta ma-
nera no es aconsejable si se utilizan microservicios, ya que estos deberían dedicarse
a otras tareas distintas de almacenar datos de los usuarios en memoria.
Para comenzar, es necesario explicar lo que es un token. Esto no es más que una
cadena de caracteres que contiene cierta información codificada.
Un token de JWT está constituido por tres partes, separadas por puntos. A con-
tinuación se muestra un ejemplo tomado de [40]:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibm
FtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.jdKVAStGjdb8oZrTPQyVAZ
qcjwVRc7josQ1MlpYyjog
81
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Las tres partes del token JWT son las que aparecen coloreadas. La primera parte
representa la cabecera, y contiene información sobre el tipo de token y el algoritmo
utilizado para verificar su autenticidad. En este caso, la cabecera sería el siguiente
objeto JSON:
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "123456789",
"name": "John Doe",
"iat": "1516239022"
}
Por último, la tercera parte del token JWT representa la firma del token. Para
obtener esta firma, primero se codifican los objetos JSON anteriores (analizados
como JSON strings) en Base64 independientemente y se concatenan por medio de
un punto (con esto, se consiguen las dos primeras partes del token). A continuación
se añade una clave secreta al resultado anterior y se realiza un hash del conjunto
(con el algoritmo especificado en la cabecera, en este caso HS256).
Por tanto, a partir del token JWT se puede obtener la información que contiene (la
cabecera y el payload) de manera sencilla. De ahí que no se deba incluir información
sensible en el cuerpo del token.
82
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
token es válido si el hash obtenido coincide con la tercera parte de dicho token.
Cabe mencionar que una función de hash es unidireccional, lo que quiere decir que
aunque se conozca un hash no se podrá conocer el texto con el que se calculó dicho
hash. Además, las funciones de hash tienen la propiedad de que un cambio en el
texto de entrada da como resultado un hash completamente distinto.
En el estándar JWT existen los llamados JWT Claims, los cuales agregan informa-
ción al token sobre la creación del mismo. Estos JWT Claims no son obligatorios,
pero sí es recomendable utilizarlos. En este proyecto se han utilizado iat (issued
at) y exp (expiration time), los cuales representan la marca de tiempo de creación
y de expiración, respectivamente.
Por este motivo, existe otro tipo de token denominado refresh token, que sirve
únicamente para regenerar un token de acceso sin necesidad de introducir las
credenciales de usuario de nuevo. Los refresh tokens tienen, por lo general, un
mayor tiempo de vida, ya que se suelen almacenar en base de datos y se relacionan
con un usuario concreto.
El uso que se le suele dar a los tokens, y el que se le da en este proyecto, sigue el
siguiente proceso:
Cada vez que se realice una consulta desde el front-end al back-end, el to-
ken de acceso viajará en la petición HTTP (típicamente en una cabecera
Authorization: Bearer token ) para que el servidor pueda validar que el
usuario ha iniciado sesión correctamente (puesto que tiene un token generado
83
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Por otro lado, para generar refresh tokens, se han utilizado cadenas de caracteres
aleatorias de 256 caracteres (utilizando el módulo rand-token de Node.js). Este
valor se guarda en base de datos, como se vio en la Fig. 5.6, para poder permitir
el refresco del token de acceso de un usuario concreto si provee el mismo valor de
refresh token guardado en la base de datos.
84
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
alt
[valid refresh token]
POST /refresh
generateRefreshToken()
POST /refresh
Update()
1
true
token, refresh token
Fig. 5.11. Regeneración del token de acceso por medio del refresh token
85
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
En los diagramas de secuencia de la Fig. 5.12 y Fig. 5.13 se describen los procesos
de registro e inicio de sesión de usuarios, respectivamente.
Por este motivo, nada más llegan al microservicio Orchestrator las credenciales de
usuario, se calcula el hash de la contraseña para mandarlo al microservicio Auth,
junto con el nombre de usuario y el nuevo refresh token generado.
Una diferencia que presenta el proceso de inicio de sesión con respecto al proceso
de registro de un nuevo usuario es que una vez verificado que el usuario y la
contraseña son correctas, se ha de actualizar el valor del campo refresh_token
de dicho usuario en la tabla USERS de MySQL, por seguridad.
86
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
alt
[user does not exist]
POST /register
generateRefreshToken()
POST /register
Insert()
1
true
token, refresh token
[user exists]
POST /register
generateRefreshToken()
POST /register
Insert()
0
false
401 Unauthorized
87
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
alt
[user exists]
POST /login
generateRefreshToken()
POST /login
Exists()
true
Update()
1
true
token, refresh token
generateRefreshToken()
POST /login
Exists()
false
false
401 Unauthorized
88
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Para gestionar los tokens de usuario dentro de una aplicación de Angular, es con-
veniente utilizar objetos de Angular conocidos como guardias e interceptores.
Respecto al interceptor, este es realmente útil, por ejemplo, para incluir la ca-
becera Authorization: Bearer token en aquellas peticiones que la requieran
(básicamente todas, excepto las de inicio de sesión y registro de usuarios).
Angular Orchestrator
GET /temperature
401 Unauthorized
POST /refresh
token, refresh token
GET /temperature
200 OK
89
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Por otro lado, se ha elegido utilizar el almacenamiento local del navegador para
guardar los valores del token de acceso y del refresh token de un usuario. Los
navegadores poseen una API denominada localStorage que permite la obtener,
insertar, actualizar y borrar valores en el almacenamiento local de manera sencilla,
a modo de clave-valor.
GET /temperature
GET /temperatures
find()
90
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
91
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
subscribe()
publishMeasure()
send()
alt
[length < MAX_ITEMS] Peticiones y pu-
blicaciones pe-
append()
riódicas a cada
minuto
Recopilación de
mensajes y al-
macenamiento
[length = MAX_ITEMS] de estadísticas a
cada hora
calculate_stats()
insert()
92
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Ambos valores de tiempo son necesarios: el primero, al ser numérico, resulta más
sencillo para que un programa interactúe con él; el segundo, en cambio, resulta
más legible para el usuario, por lo que es el que se utilizará en la aplicación de
Angular a la hora de mostrar los datos.
Como se dijo antes, desde Angular se realiza la petición de los valores medidos entre
dos fechas concretas, las cuales se envían en formato UTC. En el microservicio
Measure, se convierte la fecha a marca de tiempo para realizar la búsqueda en
la base de datos de MongoDB, ya que la utilización de valores numéricos es más
eficiente.
Una vez recibidos los datos en la aplicación de Angular, estos se pintan en una
gráfica utilizando el objeto GoogleChart y el gráfico LineChart, como se explicó
en la Sección 5.4.3, dando la posibilidad de visualizar los valores medios, máximos
y mínimos a lo largo de un intervalo de tiempo en la misma gráfica.
93
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Una vez terminada esta funcionalidad y después de comprobar que realmente fun-
ciona y es una solución válida, se vio que el microservicio Measure comenzaba a
tener muchas funcionalidades.
Este microservicio consiste en un programa de inicio y fin que realiza los siguientes
pasos:
Sin duda, esta es una solución más elegante y aprovecha las ventajas de Kuber-
netes y las arquitecturas de microservicios, desacoplando funcionalidad de otros y
disminuyendo la complejidad del sistema.
94
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Como se puede ver en el diagrama de la Fig. 5.17, las peticiones se realizan con
el método POST, indicando en el cuerpo de la petición el estado deseado de la
bombilla (ON/OFF). Finalmente, el microservicio Measure pone este estado explí-
citamente en la URL, para que sea más fácil de manejar por el microcontrolador.
POST /light
POST /light
POST /light/on
95
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
96
Capítulo 6
Análisis de resultados
En este capítulo se presentan y analizan los resultados más relevantes del proyecto
realizado.
La aplicación web contiene varios aspectos de domótica (ya que este es precisa-
mente el caso de uso considerado para el proyecto), es completamente funcional y
está perfectamente integrada con la placa de Arduino a través de la arquitectura
de microservicios.
97
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Quizás lo más destacado (ver el esquema de la Fig. 5.1) sea el poder utilizar
diferentes lenguajes de programación en cada microservicio y poder integrarlos de
manera efectiva.
98
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
En este proyecto solo se han usado unas pocas ventajas de Kubernetes, ya que se
han utilizado Minikube y MicroK8s, versiones de Kubernetes ligeras pensadas para
el desarrollo en entornos locales. Lo normal es utilizar un proveedor cloud como
Amazon Web Services, Google Cloud Platform o Microsoft Azure para desplegar
un cluster de Kubernetes en sus servidores. Estos servicios no son gratuitos (al
menos no de manera indefinida), por lo que se ha preferido montar el cluster de
Kubernetes en un entorno local.
En el caso del presente proyecto, solamente existe un nodo dentro del cluster, y el
número de Pods que contiene se puede contar fácilmente. De hecho, en los todos
Deployments se ha especificado una sola réplica del Pod, y no se ha habilitado el
autoescalado horizontal con el HPA (Horizontal Pod Autoscaler) de Kubernetes,
ya que no existe una necesidad real para implementarlo.
En los cluster de las empresas que utilizan Kubernetes existen cientos de miles
de Pods. Por ejemplo, el servicio de GKE (Google Kubernetes Engine) de Google
Cloud Platform admite el despliegue de un cluster de hasta 5 000 nodos, con hasta
110 Pods por nodo y con un total de 300 000 contenedores en ejecución [41]. En un
entorno como este, es vital el uso de herramientas de automatización y gestión para
Kubernetes (como Rancher) y herramientas de monitorización (como Prometheus
y Grafana) por parte de los administradores de sistemas.
99
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Una vez escritos algunos tests, al añadir nueva funcionalidad o modificar alguna
parte de un microservicio, se ejecutaban estas pruebas automáticas para comprobar
que todo seguía funcionando correctamente. Este método de desarrollo es pareci-
do al TDD (Test-Driven Development) y con él se consigue generar un software
funcional y de mejor calidad.
Por otro lado, aunque Angular provee un entorno de pruebas con las librerías karma
y protractor, no se consideró la realización de tests de manera programática, ya
que no se trata de una aplicación de gran complejidad. No obstante, durante el
desarrollo de la aplicación web, sí se realizaron pruebas manualmente mediante
las herramientas de desarrollador del navegador (inspector de elementos, consola
y depurador de JavaScript, paneles de red y almacenamiento, etc.).
100
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Las métricas de los Pods se corresponden con el ratio de bytes transmitidos (líneas
de color verde) y el ratio de bytes recibidos (líneas de color ámbar) en un intervalo
de 30 minutos.
101
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Por otro lado, se puede ver cómo el microservicio Auth presenta actividad de red
cada 5 minutos, aproximadamente. Esto se debe a que los tokens de acceso tienen
una caducidad de 5 minutos, precisamente, por lo que la aplicación de Angular
realizará una petición de refresco cada vez que expiren los tokens. De hecho, estos
picos tan característicos de la gráfica de Auth se pueden observar también en las
gráficas de MySQL, Angular y Orchestrator (no tan pronunciados porque estos
microservicios tienen más actividad).
102
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
103
Capítulo 7
105
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Esto último se puede mejorar incluyendo un hub que actúe de intermediario (como
se comentó en la Sección 3.6.2); lo cual no tiene que ver con el objetivo principal
del proyecto, ya que existiría el mismo problema con una arquitectura monolítica.
Como solo se disponía de una placa de Arduino, para simular otra placa de Arduino
se utilizó un servidor web sencillo de Node.js (denominado Fake-Arduino) que
devolviera valores aleatorios de temperatura y humedad y que tuviera una variable
binaria para emular una bombilla inteligente.
Por otro lado, la aplicación web desarrollada no se limita solo a obtener datos de
los microcontroladores. También se ha implementado un servicio de usuarios y au-
tenticación con el estándar JWT, muy utilizado en arquitecturas de microservicios
y arquitecturas tipo REST. A raíz de esto surgió la idea de poder utilizar varios
microcontroladores por usuario.
Una vez terminado el presente proyecto, surgen nuevas ideas para agregar a la
aplicación desarrollada. A pesar de que es un proyecto de gran envergadura y que
106
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Añadir cálculos acerca del consumo de las bombillas inteligentes, por ejemplo,
para proporcionar dicha información a los usuarios y conseguir así una apli-
cación más familiarizada con el desarrollo sostenible. En base a estos costes
energéticos, se podrían implementar algoritmos para gestionar los recursos y
lograr un consumo responsable.
107
Bibliografía
[1] ¿Qué es la transformación digital?, Red hat. [En línea]. Disponible en: https:
/ / www . redhat . com / es / topics / digital - transformation / what - is - digital -
transformation (Accedido: 28-06-2020) (citado en p. 13).
[2] La importancia del Cloud Computing en las empresas. [En línea]. Disponible
en: https://www.beservices.es/importancia-cloud-computing-empresas-n-
5317-es (Accedido: 26-06-2020) (citado en p. 13).
[3] ¿Qué es Docker?, Red Hat. [En línea]. Disponible en: https://www.redhat.
com/es/topics/containers/what-is-docker (Accedido: 06-04-2020) (citado en
p. 15).
[4] index | Alpine Linux, Alpine Linux. [En línea]. Disponible en: https : / /
alpinelinux.org (Accedido: 20-06-2020) (citado en p. 17).
[5] Reference documentation | Docker Documentation, Docker. [En línea]. Dispo-
nible en: https://docs.docker.com/reference/ (Accedido: 22-04-2020) (citado
en pp. 18, 19, 20).
[6] Orquestación de contenedores para producción - Kubernetes, Kubernetes. [En
línea]. Disponible en: https : / / kubernetes . io / es/ (Accedido: 22-04-2020)
(citado en pp. 21, 116).
[7] Case Studies - Kubernetes, Kubernetes. [En línea]. Disponible en: https :
//kubernetes.io/case-studies/ (Accedido: 25-04-2020) (citado en p. 21).
[8] Conceptos - Kubernetes, Kubernetes. [En línea]. Disponible en: https : / /
kubernetes.io/es/docs/concepts/ (Accedido: 22-04-2020) (citado en pp. 21,
22).
[9] Angular - Introduction to the Angular Docs, Angular. [En línea]. Disponible
en: https://angular.io/docs (Accedido: 25-04-2020) (citado en pp. 32, 33).
[10] Preprocesador CSS - Glosario | MDN, Mozilla. [En línea]. Disponible en:
https : / / developer . mozilla . org / es / docs / Glossary / Preprocesador _ CSS
(Accedido: 25-04-2020) (citado en p. 33).
109
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
BIBLIOGRAFÍA
[11] Components | Angular Material, Angular. [En línea]. Disponible en: https://
material.angular.io/components/categories (Accedido: 25-04-2020) (citado
en p. 34).
[12] RxJS. [En línea]. Disponible en: https://rxjs-dev.firebaseapp.com (Accedido:
25-04-2020) (citado en p. 34).
[13] Node.js, OpenJS Foundation. [En línea]. Disponible en: https://nodejs.org/
es/ (Accedido: 14-04-2020) (citado en p. 34).
[14] Arduino - Introduction, Arduino. [En línea]. Disponible en: https://www.
arduino.cc/en/Guide/Introduction (Accedido: 24-04-2020) (citado en p. 36).
[15] ARDUINO UNO WiFi REV2 | Arduino Official Store, Arduino. [En línea].
Disponible en: https://store.arduino.cc/arduino-uno-wifi-rev2 (Accedido:
24-04-2020) (citado en pp. 37, 68).
[16] WiFiNINA, Arduino. [En línea]. Disponible en: https://www.arduino.cc/
en/Reference/WiFiNINA (Accedido: 24-04-2020) (citado en p. 37).
[17] Grove - Temperature Sensor - Seeed Studio. [En línea]. Disponible en: https:
/ / www . seeedstudio . com / Grove - Temperature - Sensor . html (Accedido:
30-05-2020) (citado en pp. 38, 69).
[18] Grove - Moisture Sensor - Seeed Studio. [En línea]. Disponible en: https://
www.seeedstudio.com/Grove-Moisture-Sensor.html (Accedido: 30-05-2020)
(citado en pp. 38, 70).
[19] Documentation - The Go Programming Language. [En línea]. Disponible en:
https://golang.org/doc/ (Accedido: 22-04-2020) (citado en p. 39).
[20] The most popular database for modern apps, MongoDB. [En línea]. Dispo-
nible en: https://www.mongodb.com/ (Accedido: 13-04-2020) (citado en
pp. 39, 40).
[21] MySQL Editions, MySQL. [En línea]. Disponible en: https://www.mysql.
com/products/ (Accedido: 13-04-2020) (citado en p. 41).
[22] AMQP v1.0, 2011. [En línea]. Disponible en: http://www.amqp.org/sites/
amqp.org/files/amqp.pdf (Accedido: 13-04-2020) (citado en p. 42).
[23] nginx, NGINX. [En línea]. Disponible en: https://nginx.org/en/ (Accedido:
25-04-2020) (citado en p. 42).
[24] Git. [En línea]. Disponible en: https://git-scm.com/ (Accedido: 10-04-2020)
(citado en p. 43).
[25] K. B. Roland Barcia y R. Osowski, Guía de Microservicios. Punto de vista,
IBM. [En línea]. Disponible en: https : / / www . ibm . com / downloads / cas /
5O8YOPKN (Accedido: 09-06-2020) (citado en p. 46).
110
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Bibliografía
111
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
BIBLIOGRAFÍA
[38] Using Google Charts | Google Developers, Google. [En línea]. Disponible
en: https : / / developers . google . com / chart / interactive / docs/ (Accedido:
05-05-2020) (citado en p. 76).
[39] JSON Web Token (JWT), IETF, 2015. [En línea]. Disponible en: https :
//tools.ietf.org/html/rfc7519 (Accedido: 07-05-2020) (citado en p. 81).
[40] JSON Web Tokens - jwt.io. [En línea]. Disponible en: https://jwt.io (Acce-
dido: 07-05-2020) (citado en p. 81).
[41] Elige el tamaño y el permiso de los clústeres de Google Kubernetes Engi-
ne, Google Cloud. [En línea]. Disponible en: https : / / cloud . google . com /
solutions/scope-and-size-kubernetes-engine-clusters?hl=es-419 (Accedido:
19-06-2020) (citado en p. 99).
[42] Desarrollo Sostenible – United Nations Sustainable Development Sites, ONU.
[En línea]. Disponible en: https://www.un.org/sustainabledevelopment/es/
(Accedido: 10-06-2020) (citado en p. 155).
[43] Desarrollo Sostenible. ¿Qué es y cómo alcanzarlo?, Acciona. [En línea]. Dis-
ponible en: https://www.acciona.com/es/desarrollo-sostenible/ (Accedido:
10-06-2020) (citado en p. 155).
[44] ¿Cómo puede la Domótica hacer de tu Vivienda un Entorno más Sostenible?
[En línea]. Disponible en: https://inarquia.es/domotica-vivienda-sostenible
(Accedido: 10-06-2020) (citado en p. 158).
[45] Cómo ayuda la domótica en edificios en nuestro día a día. [En línea]. Dis-
ponible en: https://inarquia.es/como- ayuda- la- domotica- en- edificios- en-
nuestro-dia-a-dia (Accedido: 10-06-2020) (citado en p. 158).
[46] El camino hacia las TIC sostenibles. [En línea]. Disponible en: https : / /
revistabyte . es / tema - de - portada - byte - ti / el - camino - hacia - unas - tic -
sostenibles/ (Accedido: 10-06-2020) (citado en p. 158).
112
Anexo A. Guía de instalación
A.1. Docker
Para utilizar Docker, es necesario instalar Docker Desktop, que es un programa que
permite crear imágenes de Docker personalizadas, ejecutarlas y descargar imágenes
de Docker Hub o algún otro registro, entre otras tareas.
113
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Es necesario registrarse con una cuenta de Docker para instalar Docker Desktop. Si
no se dispone de cuenta, habrá que crearse una nueva. Esta cuenta será la misma
que se utiliza en Docker Hub.
114
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
A.1. Docker
docker --version
115
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
A.2. Kubernetes
116
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
A.2. Kubernetes
Después, será necesario instalar uno de los siguientes gestores de máquinas vir-
tuales: HyperKit, VirtualBox o VMWare Fusion. En este proyecto se ha utilizado
VirtualBox. Se puede entrar simplemente en la página https://www.virtualbox.org
y pinchar en “Descargar”. A continuación, se elige el sistema operativo del ordena-
dor en el que se vaya a utilizar y la versión de VirtualBox deseada (la más reciente).
Se descargará un instalador (ver las siguientes figuras):
117
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
118
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
A.2. Kubernetes
Por último, se instala Minikube. De nuevo, se puede instalar con HomeBrew o con
curl. Usar HomeBrew es más sencillo, ya que solo se ha de escribir el siguiente
comando en una consola:
minikube version
minikube stop
119
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Con Minikube basta para poder desarrollar este proyecto. No obstante, al desplegar
el cluster, el ordenador consumirá muchos recursos y podrá ralentizarlo haciendo
tedioso el desarrollo de la arquitectura de microservicios en entorno local. Por este
motivo, se ha utilizado una Raspberry Pi 4 para desplegar el cluster de Kubernetes.
Existe otro modo de desplegar Kubernetes en local, esto es, utilizando MicroK8s.
Este programa se instaló en Ubuntu Server 20.04 LTS en una Raspberry Pi 4.
Para ello, es necesario ejecutar los comandos que aparecen en https://microk8s.
io/docs/install-alternatives#arm, que son específicos para la arquitectura ARM
(propia de la Raspberry Pi). Habiendo realizado esto y reiniciado el dispositivo, se
pueden seguir los pasos de instalación que aparecen en https://microk8s.io/docs/.
Una vez hecho esto, la Raspberry Pi está preparada para desplegar un cluster de
Kubernetes (en este caso de un solo nodo).
Por otro lado, será necesario utilizar una funcionalidad experimental de Docker
(docker buildx) para construir imágenes multiplataforma, ya que Raspberry Pi
utiliza una arquitectura ARM, mientras que los ordenadores utilizan AMD. Este
comando aparece en https://docs.docker.com/buildx/working-with-buildx/.
120
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
A.3. Node.js
A.3. Node.js
Para desarrollar con Node.js, es necesario instalar Node.js y npm, el cual es el gestor
de paquetes por defecto de Node.js. En la página de https://www.nodejs.org/ se
pueden instalar ambos programas mediante un único instalador, como se puede
ver en las siguientes figuras:
121
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Para verificar que la instalación ha sido exitosa, se deben introducir los siguientes
comandos en una consola:
node --version
npm --version
sudo n stable
122
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Angular es un framework de desarrollo web del lado del cliente. Está desarrollado
principalmente en TypeScript y es mantenido por Google. Se trata de un frame-
work multiplataforma pensado para crear aplicaciones web de una sola página.
Con este comando se instalará Angular CLI de manera global en el sistema ope-
rativo. A partir de este momento, se podrá utilizar el comando ng para crear un
nuevo proyecto o para crear nuevos componentes y servicios de Angular, entre otras
funcionalidades. Para verificar que Angular CLI se ha instalado correctamente, se
puede ejecutar:
ng version
123
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
A.5. Python
124
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
A.5. Python
Para instalar Python y poder programar con este lenguaje, conviene seguir los
pasos mostrados en las siguientes figuras. En primer lugar, hay que entrar en la
página https://www.python.org/downloads/ (ver Fig. A.21). Desde ahí se puede
descargar un instalador. Aparte de Python, se instalarán otros programas como
IDLE o Python Launcher, pero que no serán necesarios para desarrollar en Python.
125
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Una vez instalado Python, se debe entrar en una consola y escribir lo siguiente:
python --version
Para poder instalar librerías de Python, se puede utilizar pip, el cual es un gestor
de paquetes de Python. Para instalarlo, hay que descargar primero un script de
Python mediante curl y ejecutar dicho script:
python get-pip.py
Una vez hecho esto, para comprobar la correcta instalación de pip, se puede eje-
cutar el siguiente comando:
pip --version
126
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
A.6. Go
A.6. Go
brew install go
go version
El resultado de estos dos comandos se muestra en la Fig. A.25. Aparte del núme-
ro de versión, también aparecerá la arquitectura de la máquina en la que se ha
instalado Go (en el caso de macOS, esta es darwin/amd64).
127
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Instalar Visual Studio Code es muy sencillo. La instalación se puede realizar en-
trando en https://code.visualstudio.com/download y seleccionando el sistema ope-
rativo de la máquina en la que se vaya a usar (ver Fig. A.26). El archivo descargado
será la aplicación como tal.
128
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Go. Muy útil para programar en Go, ya que posee autocompletado de código
y un linter habilitado por defecto. No obstante, al ser una extensión bastante
nueva, aún no soporta ciertas funcionalidades, como los módulos de Go.
129
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
A.9. Postman
Postman es una plataforma muy útil para el desarrollo de API REST. Se puede
utilizar para realizar peticiones HTTP especificando la URL, el método HTTP, los
parámetros de consulta o el cuerpo de la petición en distintos formatos, cabeceras
HTTP, tokens, cookies, etc.
En este proyecto se utiliza Postman para realizar llamadas a las rutas de los dis-
tintos microservicios de manera independiente, en entorno de desarrollo. De esta
manera se puede ver el contenido de los mensajes entre microservicios de forma
directa.
130
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
A.9. Postman
131
Anexo B. Manual de usuario
cd IoT_Microservices/
El resultado obtenido será algo similar a la Fig. B.1. Una vez en el directorio de
trabajo, se pueden listar los contenidos del mismo mediante el comando ls -la,
como muestra la Fig. B.2.
5
Si no se dispone de Git, se puede descargar un archivo comprimido desde el repositorio de
GitHub
133
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Para configurar el comando de kubectl, basta con iniciar los servicios de Minikube
o MicroK8s (minikube start o microk8s start). Véase la Sección A.2 para más
información sobre la instalación de Kubernetes.
Para desplegar el cluster en producción, en primer lugar hay que aplicar los mani-
fiestos de configuración de Kubernetes. En el directorio manifests-k8s hay tres
134
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
cd manifests-k8s/config/
cd pvc-k8s/
Una vez hecho esto, habrá que desplegar los manifiestos del directorio prod, los
cuales contienen Deployments, StatefulSets, Services y un CronJob con las
135
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
cd manifests-k8s/
La manera más eficaz de saber que todos los objetos de Kubernetes están ejecu-
tándose es mediante kubectl get all.
136
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Para detener la ejecución del cluster se pueden utilizar los siguientes comandos,
similares a los anteriores:
cd manifests-k8s/
137
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
En esta página se pueden ver tres tarjetas (haciendo scroll) con las cuales se puede
acceder al dashboard personal del usuario, a su centro de control de bombillas
inteligentes o a su listado de sensores y microcontroladores.
Todos estos enlaces están protegidos, ya que contienen información personal del
usuario. Por ello, es necesario que el usuario esté registrado y autenticado antes
de acceder a este contenido. Para iniciar sesión, se tiene un botón en la esquina
superior derecha de la pantalla, dentro de la barra de navegación (como se puede
ver en las figuras anteriores).
138
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
En su dashboard podrá observar las medidas que están tomando todos sus sensores
en tiempo real (con un refresco automático cada 10 segundos o manual).
Como se puede observar en la Fig. B.8, existen unas franjas de color azul que
indican el tipo de medida, el sensor que la está realizando, en qué dirección IP se
encuentra, y el estado de su conexión.
En la Fig. B.8 se observa que la conexión es estable. Mientras que en la Fig. B.9
el dispositivo no está conectado correctamente al sistema. En esta Fig. B.9 se
muestran también las opciones que aparecen al desplegar el menú de la franja de
color azul (“Estadísticas” y “Editar”).
139
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
140
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Por otro lado, la bombilla inteligente se muestra mediante una imagen de una bom-
billa apagada o encendida (según el estado real de la misma). También se incluye
un interruptor para poder apagar o encender la bombilla desde la aplicación.
Las estadísticas se limitan a calcular el valor medio de todos los datos recibidos,
los valores máximo y mínimo y el último dato recibido, añadiendo el instante de
tiempo correspondiente. En el caso de la bombilla inteligente, se muestra el tiempo
que está la bombilla encendida y apagada y la relación entre ambos tiempos.
En esta página, el usuario selecciona dos fechas distintas (una de inicio y una de
fin) para cargar los datos guardados de una magnitud en concreto entre las fechas
indicadas8 . Al pulsar el botón de “Cargar”, se mostrará mediante un LineChart
una gráfica con los valores medios de todas las horas guardadas en base de datos.
141
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Aunque es evidente, el usuario no podrá indicar una fecha de inicio que sea poste-
rior o igual a la fecha final, ni posterior a la fecha actual.
Cabe mencionar que las direcciones IP han de pertenecer a la misma red de área
local que la máquina en la que se ejecuta el cluster de Kubernetes (en este caso,
la red es la 192.168.1.0/24). Esto es debido a que la aplicación solamente funciona
en entorno local.
142
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Al pinchar en “Editar” (al igual que en el menú desplegable de la Fig. B.9), se abre
una página con un formulario para poder modificar los valores del sensor. Como
se ve en la Fig. B.12, se trata de un formulario guiado que consta de cuatro pasos.
En el paso número 3, se muestra una lista de los sensores compatibles con el sistema
desarrollado y la magnitud elegida en el paso número 1. Así, se evitan conflictos
entre magnitudes y sensores.
Cabe mencionar que las páginas mostradas están acondicionadas para pantallas
de teléfono móvil, de manera que la aplicación web desarrollada sea responsive y
pueda ser utilizada desde distintos tipos de dispositivo.
143
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Una manera de depurar errores en los Pods se consigue con los siguientes comandos
de kubectl:
144
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Una segunda manera de depurar errores, más amigable, consiste en abrir el dash-
board de Kubernetes. Desde este dashboard se puede realizar todo lo anterior,
pero con interfaz gráfica. Por ejemplo, se puede entrar en los Pods mediante una
consola integrada en la propia página web y visualizar los registros y el estado de
cada Pod, entre otras posibilidades.
En Minikube es muy sencillo abrir este dashboard, simplemente hay que utilizar
un comando para que se abra automáticamente una pestaña del navegador:
minikube dashboard
145
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Este abrirá un editor de la consola (como Vim) con el manifiesto en YAML. Habrá
que cambiar una línea (type: ClusterIP por type: NodePort) y añadir un valor
de NodePort válido9 a la lista de ports, como se muestra en el Código B.1.
146
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
spec: spec:
clusterIP: 10.152.183.73 clusterIP: 10.152.183.73
externalTrafficPolicy: Cluster externalTrafficPolicy: Cluster
ports: ports:
- port: 443 - port: 443
protocol: TCP protocol: TCP
targetPort: 8443 targetPort: 8443
nodePort: 30443
selector: selector:
k8s-app: kubernetes-dashboard k8s-app: kubernetes-dashboard
sessionAffinity: None sessionAffinity: None
type: ClusterIP type: NodePort
Una vez rechazada la alerta del navegador, aparecerá una ventana para introducir
el token anteriormente generado (ver Fig. B.14). Al ingresar el token, se podrá
visualizar el dashboard de Kubernetes.
Por último, cabe mencionar que si se quiere realizar alguna modificación en los mi-
croservicios y desplegarlos en producción, será necesario construir nuevas imágenes
de Docker, cambiando el Dockerfile y utilizando los comandos docker build o
docker buildx, subirlas a Docker Hub y modificar la clave image de aquellos
Deployments que se quieran modificar en el cluster de producción. Estos coman-
dos y su funcionamiento se explican más detalladamente en la Sección 2.1 y en la
Sección 2.2.
En este punto, se asume que el desarrollador tiene instaladas todas las tecnologías
que quiere utilizar, ayudándose del anexo anterior si fuera necesario.
147
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Una vez aplicados estos manifiestos, se pueden aplicar los del directorio dev:
cd manifests-k8s/
Para verificar que los manifiestos se han aplicado correctamente, se puede ejecutar
kubectl get all (ver Fig. B.16).
Otros comandos útiles para ver que todo está correcto son kubectl get y kubectl
describe, especificando el tipo de objeto de Kubernetes. Por ejemplo, se podría
escribir kubectl get pods o kubectl describe configmaps.
Para acceder a los Pods del cluster, se ha de utilizar el comando kubectl exec
-it pod/<identificador-pod> -- <comando> . Por ejemplo, para conectarse a
MongoDB (o MySQL) o para entrar en el sistema de archivos de un Pod (mediante
sh o bash), se pueden ejecutar los siguientes comandos:
148
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
10
kubectl exec -it pod/mongo-dev-0 -- mongo -u root -p
149
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Si se quieren ejecutar los tests, se puede utilizar el comando npm test desde el
11
Con este comando se ejecutará la librería nodemon, el cual es un programa que está atento
a los archivos para reiniciar el servidor al guardar los cambios
150
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
cd stats-ms/
python -m src
Para utilizar este microservicio Publisher en modo de desarrollo local, será necesa-
151
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
rio ejecutar específicamente npm run dev, el cual utiliza un archivo index_dev.js,
ligeramente distinto del archivo index.js, que es el utilizado en producción por
medio de npm start.
cd auth-ms/src/
go mod download
go run main.go
cd angular-ms/iot-app/
npm install
npm start
Por último, para programar la placa de Arduino, se puede utilizar Arduino IDE y
152
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Por otro lado, un cliente REST como Postman puede ser muy útil para realizar
peticiones HTTP a cada microservicio y mejorar la productividad y la depuración
de errores en la comunicación entre microservicios.
12
Cuando se dice “eliminar los manifiestos” se hace referencia a quitarlos de Kubernetes. No
confundir con borrar los archivos YAML
153
Anexo C. Objetivos de Desarrollo
Sostenible
En este capítulo se muestra la relación que tiene el presente Trabajo Fin de Grado
con los Objetivos de Desarrollo Sostenible (ODS) aprobados por la ONU en 2015,
en la denominada Agenda 2030 sobre el Desarrollo Sostenible [42].
Cada uno de estos 17 objetivos (ver Fig. C.1) consiste en un conjunto de metas
específicas que deben alcanzarse en los próximos 10 años (hasta el año 2030).
La adopción de estos objetivos por parte de los líderes mundiales tiene el fin de
erradicar la pobreza, proteger el planeta y asegurar la prosperidad.
Tal y como se dice en [43], “la sostenibilidad es el desarrollo que satisface las
necesidades del presente sin comprometer la capacidad de las futuras generaciones,
garantizando el equilibrio entre el crecimiento económico, el cuidado del medio
ambiente y el bienestar social”.
Puede parecer que este concepto de sostenibilidad no tenga relación con el desa-
rrollo de software y las nuevas tecnologías. Sin embargo, sí que existe una pequeña
relación. Por este motivo, el proyecto realizado en este Trabajo Fin de Grado per-
sigue algunos de los 17 Objetivos de Desarrollo Sostenible. En la Tabla C.1 se
muestra el ODS de cada dimensión que más relación tiene con el proyecto desa-
rrollado, su nivel de importancia, y las metas específicas que más se ajustan.
155
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Se ha considerado que el ODS9 es el que más relación tiene con el proyecto desa-
rrollado. Esto se debe a que las tecnologías que se utilizan en la aplicación son
innovadoras y contribuyen a realizar un mejor uso del software y de las infra-
156
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Por otro lado, el ODS11 tiene algo de relación con la domótica, IoT y Machine
Learning. Estas tecnologías pueden servir para desarrollar viviendas sostenibles.
Al ser muy sutil la relación de este ODS con el proyecto desarrollado, se le ha dado
una importancia secundaria.
157
UNIVERSIDAD PONTIFICIA COMILLAS
Escuela Técnica Superior de Ingeniería (ICAI)
Grado en Ingeniería en Tecnologías de Telecomunicación
Las bombillas inteligentes suelen estar fabricadas con tecnología LED. Esta for-
ma de iluminación permite alcanzar ahorros de hasta el 70 % frente a bombillas
convencionales [44].
158