TFG Daniel Moreno Belinchon
TFG Daniel Moreno Belinchon
TFG Daniel Moreno Belinchon
Y SISTEMAS DE TELECOMUNICACIÓN
VºBº
CALIFICACIÓN:
El Secretario,
A mis padres
AGRADECIMIENTOS
Después de cuatro años ha llegado el momento de poner fin a esta gran etapa
como estudiante de Ingeniería Telemática, la cual no puedo finalizar sin mostrar mi
agradecimiento a aquellas personas y entidades que han formado parte de ella.
En primer lugar, quiero agradecer a todos los profesores y miembros de la
Universidad Politécnica de Madrid su labor docente y profesional que ha marcado
mi aprendizaje durante estos cuatro años.
En segundo lugar, quiero mostrar un agradecimiento especial a mi tutor, el
Dr. Antonio da Silva Fariña, por su apoyo, confianza y por ofrecerme la oportunidad
de realizar este proyecto a su lado.
Por último, agradecer el apoyo incondicional que me ha prestado mi familia,
y en especial mis padres por ayudarme con su ejemplo y esfuerzo a conseguir todo
lo que me propongo. Sin vosotros nada de esto hubiese sido posible, siempre os
estaré agradecido.
¡GRACIAS!
I
II
RESUMEN
Hoy en día el modelo de computación más utilizado sigue siendo el cloud
computing, que permite a una serie de recursos hardware como ordenadores y
servidores, ofrecer una serie de servicios a través de internet.
Con los avances de la tecnología, y con la llegada del internet de las cosas
(IoT) en relativamente poco tiempo el número de dispositivos conectados a la red
ha crecido enormemente. De modo que muy pronto resultará habitual disponer de
gran cantidad de dispositivos domésticos y personales que estén conectados a la red
constantemente. Con estos avances, ha surgido la necesidad de plantear alternativas
a la computación en la nube que permitan distribuir y descentralizar el
procesamiento de los entornos cloud. Es así como surge el fog computing: un
modelo de computación que permite llevar parte de las aplicaciones de cloud,
generalmente en forma de microservicios y VNF (Virtual Network Functions), a los
nodos o extremos de la red con el fin de realizar una parte del procesamiento de la
información antes de transmitirla.
El propósito de este proyecto, Despliegue de microservicios mediante
técnicas de virtualización ligera basadas en contenedores, es el análisis y
despliegue de aplicaciones y VNF a través de la red. Para conseguirlo, se ha realizado
un análisis de las herramientas y tecnologías disponibles que ha servido como base
para posteriormente diseñar determinados entornos reales en los que se han
desplegado una serie de microservicios y funciones virtuales de red.
El proyecto ha sido planteado de forma tenga un alcance que resulte lo más
útil y aproximado a la realidad posible, y por ello se han definido casos de uso y
despliegues que tienen aplicación y sentido práctico en nuestros días.
En primer lugar, se ha realizado un estudio de ingeniería, plasmado en el
presente documento, que ha servido para la adquisición de multitud de
conocimientos relacionados con arquitecturas software, microservicios y
virtualización de funciones de red. Dichos conocimientos han sido puestos en
práctica mediante el diseño e implementación de una serie de escenarios teóricos y
prácticos sobre los que se han desplegado una serie de aplicaciones.
El alcance de este proyecto unido a la filosofía y características de las
tecnologías utilizadas hacen que los escenarios y casos de uso aquí planteados
resulten aplicables a entornos cotidianos de hoy en día en los que se prima la
agilidad, escalabilidad, rapidez, economía y bajo consumo de recursos de las
aplicaciones y servicios desplegados.
III
IV
ABSTRACT
Nowadays the most widely used model of computing continues to be cloud
computing that allows a series of resources hardware such as computers and servers,
offer a series of services via internet.
With the advances in technology and the arrival of the internet of things (IoT)
in a relatively short time the number of devices connected to the network has grown
tremendously. In a short time it will be usual to have lots of domestic and personal
devices constantly connected to the network. With these advances, has emerged the
need to think about alternatives to cloud computing enabling distributed and
decentralized processing of cloud environments. This is how the fog computing
arises: a model of computation which can carry part of cloud applications, usually
as microservices and VNF (Virtual Network Functions), to networks node and
network extremes in order to carry out a part of the processing of the information
before transmitting it.
The purpose of this project, Deployment of microservices by light container-
based virtualization techniques, is the analysis and deployment of VNF and based
on microservices applications across the network. To achieve this, an analysis of the
tools and technologies available has been carried and it has served as basis for
designing certain real environments in which a series of microservices and virtual
networking capabilities have been deployed.
The project has been raised in a way to have a scope that is as useful and real
as possible, and therefore some use cases and deployments that have full application
in our days have been defined.
In the first place, an engineering study has been carried out, reflected in the
present document, which has served to acquire a multitude of knowledge related to
software architectures, microservices and virtualization of network functions. This
knowledge has been put into practice through the design and implementation of a
series of theoretical and practical scenarios on which a bunch of applications have
been deployed.
The scope of this project, together with the philosophy and characteristics of
the technologies used, make the scenarios and use cases proposed here applicable
to today's day-to-day environments where agility, scalability, speed, economy and
low consumption of the applications and deployments prevail.
V
VI
ÍNDICE
AGRADECIMIENTOS ..................................................................................... I
RESUMEN .................................................................................................... III
ABSTRACT ...................................................................................................... V
ÍNDICE ......................................................................................................... VII
LISTADO DE FIGURAS.................................................................................IX
LISTADO DE TABLAS ...................................................................................XI
LISTADO DE ACRÓNIMOS .......................................................................XIII
1. INTRODUCCIÓN .................................................................................. - 1 -
1.1. ALCANCE Y OBJETIVOS DEL PROYECTO ................................. - 2 -
1.2. ESTRUCTURA DE LA MEMORIA ................................................ - 2 -
2. ANTECEDENTES Y MARCO TECNOLÓGICO ................................ - 5 -
2.1. CLOUD COMPUTING ................................................................... - 5 -
2.2. MICROSERVICIOS .................................................................... - 7 -
2.2.1. Introducción a los microservicios ........................................... - 7 -
2.2.2. Características de los microservicios .................................... - 10 -
2.2.3. Contenedores ........................................................................ - 16 -
2.2.4. Orquestadores o gestores ...................................................... - 20 -
2.3. NFV ........................................................................................... - 31 -
2.3.1. Introducción .......................................................................... - 31 -
2.3.2. Características ....................................................................... - 32 -
2.3.3. Soluciones ............................................................................. - 34 -
2.3.4. Relación NFV-SDN ............................................................... - 37 -
2.4. OPENSTACK ............................................................................. - 39 -
2.4.1. Introducción ......................................................................... - 39 -
2.4.2. Componentes ........................................................................ - 39 -
2.4.3. Arquitectura .......................................................................... - 41 -
3. CONSIDERACIONES DE DISEÑO................................................. - 45 -
3.1. ESPECIFICACIONES Y RESTRICCIONES DE DISEÑO ........ - 45 -
3.2. DECISIONES DE DISEÑO ....................................................... - 45 -
4. IMPLEMENTACIÓN Y RESULTADOS .......................................... - 47 -
4.1. Introducción al entorno ............................................................ - 47 -
4.2. Análisis detallado ...................................................................... - 48 -
4.2.1. Escenario 1. Docker Swarm monoarquitectura. ................... - 48 -
4.2.2. Escenario 2. Docker Swarm multiarquitectura. ................... - 51 -
VII
4.2.3. Escenario 3. Kubernetes monoarquitectura. ........................ - 54 -
5. PRESUPUESTO ............................................................................... - 57 -
6. CONCLUSIONES Y TRABAJOS FUTUROS ................................... - 59 -
6.1. CONCLUSIONES ...................................................................... - 59 -
6.2. TRABAJOS FUTUROS ............................................................. - 59 -
7. REFERENCIAS ................................................................................ - 61 -
ANEXOS .................................................................................................... - 67 -
A. ENTORNO DISPONIBLE................................................................ - 69 -
B. DOCKER .......................................................................................... - 71 -
Instalación ............................................................................................. - 71 -
Docker en Ubuntu.............................................................................. - 71 -
Docker en Debian .............................................................................. - 74 -
Instalación genérica ........................................................................... - 76 -
Manejo ................................................................................................... - 77 -
Nociones básicas ................................................................................ - 77 -
Gestión de imágenes y contenedores ................................................ - 77 -
Clúster Docker .................................................................................. - 80 -
C. OPENBATON ................................................................................... - 83 -
a. Instalación Go .............................................................................. - 83 -
b. Instalación VIM Driver para Docker ........................................... - 83 -
c. Instalación VNFM Docker............................................................- 84 -
d. Instalación OpenBaton................................................................. - 85 -
e. Unión OpenBaton & Drivers ........................................................- 86 -
f. Creación de un paquete VNF .......................................................- 89 -
g. Despliegue de VNF .......................................................................- 90 -
D. KUBERNETES ................................................................................. - 93 -
Instalación ............................................................................................. - 93 -
Manejo ................................................................................................... - 94 -
Nociones básicas ................................................................................ - 94 -
Gestión de deployments y pods ......................................................... - 95 -
Clúster Kubernetes ............................................................................ - 97 -
Clúster Kubernetes multiarquitectura ............................................ - 101 -
Desactivar swap ................................................................................... - 105 -
E. CREACIÓN Y DESPLIEGUE DE UN FIREWALL ........................ - 107 -
F. ARQUITECTURA OPENSTACK .................................................... - 111 -
G. INSTALACIÓN DEVSTACK ........................................................... - 113 -
VIII
LISTADO DE FIGURAS
Figura 1: evolución a arquitecturas de microservicios ............................... - 1 -
Figura 2: tipos de servicios en la nube ....................................................... - 5 -
Figura 3: nube pública ................................................................................ - 6 -
Figura 4: nube privada ................................................................................ - 6 -
Figura 5: nube híbrida ................................................................................ - 6 -
Figura 6: implementaciones de SOA .......................................................... - 8 -
Figura 7: evolución arquitectura software ................................................ - 10 -
Figura 8: monolito VS microservicios ...................................................... - 10 -
Figura 9: extracto de The Bell System Technical Journal ......................... - 11 -
Figura 10: ley de Conway .......................................................................... - 12 -
Figura 11: equipos multidisciplinares ....................................................... - 12 -
Figura 12: aplicación descentralizada ....................................................... - 13 -
Figura 13: descentralización de datos ....................................................... - 14 -
Figura 14: comparación monolito y microservicios ................................. - 16 -
Figura 15: arquitectura sin contenedores ..................................................- 17 -
Figura 16: virtualización VS contenedores ................................................- 17 -
Figura 17: histórico descargas Docker ...................................................... - 18 -
Figura 18: arquitectura típica Docker ....................................................... - 20 -
Figura 19: arquitectura Docker Swarm .................................................... - 22 -
Figura 20: interfaz Portainer .................................................................... - 23 -
Figura 21: interfaz Swarmpit .................................................................... - 24 -
Figura 22: interfaz Docker-swarm-visualizer ........................................... - 24 -
Figura 23: ejemplo API Kubernetes ......................................................... - 27 -
Figura 24: arquitectura Kubernetes ......................................................... - 28 -
Figura 25: interés por orquestadores ....................................................... - 29 -
Figura 26: interfaz gráfica Kubernetes ..................................................... - 31 -
Figura 27: esquema ETSI NFV MANO ..................................................... - 33 -
Figura 28: contexto OpenBaton ............................................................... - 34 -
Figura 29: arquitectura OpenBaton ......................................................... - 35 -
Figura 30: VNFM genérico ....................................................................... - 35 -
Figura 31: interfaz OpenBaton .................................................................. - 36 -
Figura 32: enfoque Cloudify ..................................................................... - 37 -
Figura 33: caso de uso Cloudify ................................................................ - 37 -
Figura 34: red tradicional VS SDN ........................................................... - 38 -
Figura 35: arquitectura SDN..................................................................... - 38 -
Figura 36: servicios principales de OpenStack......................................... - 41 -
Figura 37: interfaz gráfica Devstack ......................................................... - 42 -
Figura 38: servicios OpenStack multinodo .............................................. - 43 -
Figura 39: mapa de red del escenario I .................................................... - 49 -
Figura 40: despliegue httpd escenario I ................................................... - 49 -
Figura 41: tiempo de despliegue por réplica httpd escenario I ................ - 50 -
Figura 42: tiempos de despliegue escenario I .......................................... - 51 -
Figura 43: mapa de red del escenario II ................................................... - 51 -
Figura 44: despliegue httpd escenario II .................................................. - 52 -
Figura 45: tiempo de despliegue por réplica httpd escenario II .............. - 53 -
Figura 46: reparto de contenedores ......................................................... - 53 -
IX
Figura 47: mapa de red del escenario III .................................................. - 54 -
Figura 48: despliegue httpd escenario I y escenario III ........................... - 55 -
Figura 49: tiempos de despliegue por réplica httpd escenario III ........... - 55 -
Figura 50: comparativa presupuestos ...................................................... - 58 -
Figura 51: nodos clúster Docker usando CLI ............................................ - 81 -
Figura 52: resumen clúster a través de Portainer .................................... - 81 -
Figura 53: servicios y nodos Docker Swarm .............................................- 82 -
Figura 54: ejemplos servicio Docker Swarm ............................................- 82 -
Figura 55: Docker VIM driver en marcha .................................................- 84 -
Figura 56: VNFM en marcha .................................................................... - 85 -
Figura 57: inicio sesión OpenBaton ..........................................................- 86 -
Figura 58: interfaz principal OpenBaton ..................................................- 86 -
Figura 59: managers VNFM en OpenBaton ............................................. - 87 -
Figura 60: instancias VIM OpenBaton ..................................................... - 87 -
Figura 61: PoP añadido y funcionando en OpenBaton ........................... - 88 -
Figura 62: mensajes Docker VIM Driver ................................................. - 88 -
Figura 63: catálogo NSD OpenBaton ........................................................- 90 -
Figura 64: resumen OpenBaton ...............................................................- 90 -
Figura 65: listado de pods Kubernetes .....................................................- 98 -
Figura 66: interfaz gráfica Kubernetes ..................................................... - 99 -
Figura 67: listado de nodos CLI Kubernetes ............................................ - 99 -
Figura 68: listado de nodos gráfico Kubernetes ..................................... - 100 -
Figura 69: nodos multiarquitectura en Kubernetes ............................... - 104 -
Figura 70: interfaz principal del firewall ................................................ - 107 -
Figura 71: listado de interfaces del firewall ............................................ - 108 -
Figura 72: listado de objetos del firewall ................................................ - 108 -
Figura 73: listado de reglas del firewall .................................................. - 109 -
Figura 74: creación de regla en el firewall .............................................. - 109 -
Figura 75: listado reglas NAT en el firewall ............................................ - 110 -
Figura 76: mapa red FW ......................................................................... - 110 -
Figura 77: arquitectura lógica OpenStack ............................................... - 111 -
Figura 78: gestión de instancias en DevStack ......................................... - 114 -
Figura 79: gestión de contenedores en DevStack .................................... - 114 -
Figura 80: ejemplo contenedor en DevStack I ........................................ - 115 -
Figura 81: ejemplo contenedor en DevStack II ....................................... - 115 -
X
LISTADO DE TABLAS
Tabla 1: arquitectura monolítica VS microservicios ................................. - 15 -
Tabla 2: pods de red .................................................................................. - 28 -
Tabla 3: nodos primer escenario .............................................................. - 47 -
Tabla 4: nodos segundo escenario ............................................................ - 48 -
Tabla 5: costes mano de obra .................................................................... - 57 -
Tabla 6: coste compra de hardware .......................................................... - 57 -
Tabla 7: coste alquiler hardware ............................................................... - 58 -
Tabla 8: características entorno ............................................................... - 69 -
Tabla 9: instrucciones Dockerfile ............................................................. - 79 -
Tabla 10: nodos clúster Docker.................................................................- 80 -
Tabla 11: nodos clúster Kubernetes .......................................................... - 97 -
Tabla 12: nodos clúster multiarquitectura k8s ........................................- 101 -
XI
XII
LISTADO DE ACRÓNIMOS
AMQP Advanced Message Queuing Protocol
API Application Programming Interface
AWS Amazon Web Services
BSS Business Support System
CLI Command Line Interface
CORBA Common Object Request Broker Architecture
DCOM Distributed Component Object Model
DevOps Development & Operations
DHCP Dynamic Host Configuration Protocol
DNS Domain Name System
EC2 Elastic Compute Cloud
ECS Elastic Container Service
EM Element Management
ESB Enterprise Service Bus
ETSI European Telecommunications Standards Institute
FTP File Transfer Protocol
GCP Google Cloud Computing
GPG GNU Privacy Guard
HTTP HyperText Transfer Protocol
IaaS Infrastructure as a Service
IDL Interface Definition Language
IoT Internet of Things
IP Internet Protocol
J2EE Java 2 platform Enterprise Edition
JSON JavaScript Object Notation
KVM Kernel-based Virtual Machine
LXC Linux Containers
MANO Management and Orchestration
MSA MicroServices Architecture
NAT Network Address Translation
XIII
NFS Network File System
NFV Network Function Virtualization
NFVI NFV Infraestructure
NFVO NFV Orchestrator
NS Network Service
OMG Object Management Group
OSS Operations Support System
PaaS Platform as a Service
QEMU Quick EMUlator
RC Replication Controller
REST Representational State Transfer
RH Red Hat
RHEL Red Hat Enterprise Linux
RPC Remote Procedure Call
RPM Red Hat Package Manager
RS Replication Set
SaaS Software as a Service
SDK Software Development Kit
SDN Software Defined Networking
SLA Service Level Agreement
SMTP Simple Mail Transfer Protocol
SOA Service Oriented Architecture
SOAP Simple Object Access Protocol
TCP Transmission Control Protocol
TLS Transport Layer Security
TOSCA Topology and Orchestration Specification for Cloud
Applications
UDP User Data Protocol
UML User Mode Linux
VIM Virtualised Infraestructure Manager
VNF Virtual Network Function
XIV
VNFM VNF Manager
WSDL Web Services Description Language
WWW World Wide Web
XMI XML Metadata Interchange
XML eXtensible Markup Language
XV
XVI
INTRODUCCIÓN
1. INTRODUCCIÓN
Hoy en día en el ámbito de las telecomunicaciones existe cierta tendencia a
llevar los servicios a la nube haciendo uso del cloud computing, una técnica
mediante la cual un grupo de ordenadores y servidores ofrecen servicios de diversos
tipos a través de internet. Se usa principalmente porque ofrece gran cantidad de
ventajas como transparencia, flexibilidad, ubicuidad, seguridad y escalabilidad
entre otras.
Sin embargo, con los avances del internet de las cosas (IoT), y otras
tecnologías entre otras tecnologías, ha surgido la necesidad de pensar en
alternativas a la computación en la nube que permitan distribuir el procesamiento
en los extremos de la red sin necesidad de tener que salir hacia internet para realizar
ciertas operaciones.
Así ha surgido el concepto de fog computing un modelo de computación que
permite llevar ciertos procesos, generalmente en forma de microservicios y VNF
(Virtual Network Functions), a los nodos o extremos de la red con el fin de realizar
un análisis y procesado de la información antes de transmitirla.
Este proyecto se basa, principalmente, en el estudio de microservicios, NFV
(Network Function Virtualization) y otras tecnologías necesarias para el manejo y
despliegue de los mismos.
Por un lado, las arquitecturas de microservicios defienden un modo de
despliegue, basado en SOA (Service Oriented Architecture), que permita distribuir
aplicaciones como un conjunto de servicios débilmente acoplados que funcionan de
forma independiente y aislada. La evolución y arquitectura básica se plasma en la
figura 1 [1].
-1-
A lo largo de este proyecto se van a analizar y poner en práctica tanto estas
dos tecnologías como todas las necesarias para poder comprender y desplegar
microservicios y NFV.
1.1. ALCANCE Y OBJETIVOS DEL PROYECTO
Este proyecto tiene como finalidad principal el análisis y despliegue de
aplicaciones diseñadas en base a la arquitectura de microservicios a través de la red,
haciendo uso de una serie de tecnologías como NFV.
Para ello se han definido una serie de objetivos divididos por tecnologías. En
primer lugar, los relacionados con la arquitectura de microservicios son:
Analizar el estado del arte
Comprender su filosofía y arquitectura
Analizar y comprender los métodos de despliegue de microservicios:
contenedores
Estudiar con detalle tareas necesarias como la orquestación
Identificar las tecnologías que mejor se adaptan al entorno
Aplicar los conocimientos a un caso de uso sencillo
Preparar un entorno adecuado para el despliegue de una aplicación
basada en microservicios haciendo uso de las tecnologías estudiadas
Definir y desplegar una aplicación funcional
Por otro lado, los objetivos relativos a VNF son:
Análisis del estado del arte
Estudiar su filosofía y arquitectura
Estudiar las normas que rigen su aplicación y definición como ETSI
(European Telecommunications Standards Institute)
Identificar las tecnologías que mejor se adaptan al entorno
Aplicar y relacionar los conceptos con las tecnologías estudiadas de
microservicios y contenedores
Una vez definidas las dos bases principales del proyecto (microservicios y
NFV) queda pendiente la relación y aplicación de ambas en su conjunto, surgiendo
necesario el estudio de diversas tecnologías como OpenBaton, Cloudify y OpenStack
que se estudian en este proyecto.
1.2. ESTRUCTURA DE LA MEMORIA
En primer lugar, el primer capítulo recoge una introducción que aparte de
servir para poner en contexto e introducir la arquitectura de microservicios y NFV
también recoge de forma resumida el alcance y la estructura de la memoria.
En el capítulo dos se recogen de forma más detallada un análisis de los
conceptos y puntos clave de las tecnologías que se utilizan en el proyecto. El objetivo
del mismo es introducir aquellos conceptos más importantes de las tecnologías que
se han utilizado y estudiado en este proyecto, y por lo tanto su lectura será clave para
la comprensión de la filosofía y características que definen cada una de ellas.
-2-
INTRODUCCIÓN
-3-
-4-
ANTECEDENTES Y MARCO TECNOLÓGICO
Sin embargo, con los avances del internet de las cosas (IoT) [3], entre otras
tecnologías, ha surgido la necesidad de pensar en alternativas a la computación en
la nube que permitan distribuir el procesamiento en los extremos de la red sin
necesidad de tener que salir hacia internet para ciertas operaciones.
-5-
Así ha surgido el concepto de fog computing [4], un modelo de computación
que permite llevar ciertos procesos, generalmente en forma de microservicios, a los
nodos o extremos de la red con el fin de realizar un análisis y procesado de la
información antes de transmitirla.
Por otro lado, en función del alcance o ubicación de los servicios las nubes
pueden ser clasificadas en [5]:
Públicas: cuando el proveedor ofrece una serie de servicios de forma abierta
a todas las entidades que lo deseen.
-6-
ANTECEDENTES Y MARCO TECNOLÓGICO
2.2. MICROSERVICIOS
2.2.1. Introducción a los microservicios
Hasta hace relativamente poco, el método tradicional de desarrollo de
aplicaciones más común se basaba en arquitecturas monolíticas, es decir, aquellas
cuyo objetivo es conseguir una aplicación única y de un solo nivel que se comporta
como una sola entidad, autónoma e independiente del resto.
Típicamente las aplicaciones empresariales están compuestas por tres capas
principales: una capa servidora que contiene gran parte de la lógica y responde a
peticiones, la parte de almacenamiento normalmente en forma de base de datos y la
parte del cliente que suele ser una mera interfaz de acceso a los datos ofrecidos por
el servidor [6]. En dichas aplicaciones, la parte servidora, por ejemplo, se encarga
de recibir peticiones, procesarlas accediendo a la lógica y base de datos y devolver
una respuesta. Su comportamiento es monolítico pues sus componentes no son
independiente del resto y se comporta como una única entidad que no realiza una
sola tarea, sino que realiza una serie de pasos para completar una determinada
función.
Existen muchos casos de éxito de aplicaciones monolíticas. La ventaja
principal de las mismas es que suelen tener buen rendimiento al tener toda la lógica
y procesos concentrados en un único sistema. Sin embargo, son bastantes las
desventajas que han hecho que esta arquitectura quede de lado y se busquen otras
alternativas. Las desventajas principales son [7]:
Los elementos de una aplicación monolítica están fuertemente ligados
y relacionados, lo que implica que cualquier cambio en el monolito,
por pequeño que sea, implicará volver a construir y distribuir el
mismo.
Compilar y generar los ejecutables suele llevar horas.
Las aplicaciones por lo general carecen de modularidad. Es decir, no
están divididas en módulos o subprogramas, y por tanto no permiten
reutilización de partes de la aplicación y su mantenimiento y
reparación es más costoso.
No son escalables verticalmente puesto que cualquier cambio en el
sistema implicará volver a desplegar la aplicación.
Resulta difícil aislar ciertas partes de la aplicación puesto que todas
ellas comparten el mismo entorno de ejecución.
Ciertas decisiones de diseño enfocadas a una parte de la aplicación
pueden afectar fuertemente a otras partes.
Los monolitos son, por lo general, aplicaciones muy amplias con gran
cantidad de dependencias que resultan muy difíciles de entender y
mantener.
En definitiva, las aplicaciones monolíticas son muy difíciles de mantener
debido principalmente a su falta de modularidad y escalabilidad.
Hay diferentes formas de alcanzar esa modularidad y escalabilidad, por
ejemplo, a través de arquitecturas orientadas a servicios como SOA.
-7-
De acuerdo con IEEE- Std 1471-2000 [8], una arquitectura software define
“la organización fundamental de un sistema encarnado en sus componentes, las
relaciones que tienen entre sí, el entorno y los principios que guían su diseño y
evolución”
SOA es estilo arquitectónico basado en distintas piezas de software que
ofrecen unas determinadas funcionalidades como servicios haciendo uso de
protocolos de comunicación normalmente a través de la red. Pero, ¿qué es un
servicio? Un servicio es un mecanismo que permite el acceso a unos determinados
recursos a través de la red. Es entendido como una representación lógica y discreta
de una actividad de negocio que resuelve una determinada necesidad [9].
Algunos principios de SOA son:
Autonomía: los servicios son independientes y ellos mismos controlan
su funcionalidad.
Abstracción: un servicio es entendido como un sistema transparente,
solo se debe conocer la forma de invocarlo y se obtiene la respuesta.
Carecen de estado: los servicios dan una respuesta en función de la
petición, pero no de transacciones previas, lo que hace que el
rendimiento sea mayor.
Modularidad: las tareas se reparten en diferentes servicios con el fin
de tener piezas de código más pequeñas y específicas.
Reusabilidad: los servicios pueden ser divididos en tantos como se
necesite con el fin de poder reutilizarlos y disponer de un sistema más
modular.
Encapsulamiento: unos servicios pueden encapsular a otros.
El contrato de servicio está estandarizado en el que se define un
acuerdo de comunicación que especifica el punto de entrada o de
llamada al sistema.
Como se puede ver en la figura 6 [9], las arquitecturas SOA pueden ser
implementadas a través de diferentes tecnologías.
-8-
ANTECEDENTES Y MARCO TECNOLÓGICO
Una de las implementaciones más comunes de SOA son los Web Services
(Servicios Web), componentes software que encapsulan una funcionalidad
específica y pueden ser accedidos a través de protocolos estándares de internet. Las
tecnologías asociadas más comunes son [10]:
HTTP (HyperText Transfer Protocol) es el protocolo de comunicación
por excelencia de internet que permite las transferencias de
información a través en la WWW (World Wide Web). Muchos de los
servicios web se construyen en HTTP y hace que estos sean accesibles
a través de Internet.
XML (eXtensible Markup Language) es un lenguaje de marcado
estándar que sirve para definir la estructura de los datos.
WSDL (Web Services Description Language) es un lenguaje basado en
XML que se utiliza para describir los servicios web. Se utiliza para
describir detalladamente las interfaces públicas de los servicios y la
forma de comunicación de los mismos.
SOAP (Simple Object Access Protocol) es un protocolo de mensajería
definido en XML para el intercambio de información en entornos
distribuidos y heterogéneos. Es independiente de la plataforma y
lenguajes de desarrollo y puede trabajar sobre cualquier pila de
protocolos, por ejemplo: HTTP, SMTP (Simple Mail Transfer
Protocol)…
UDDI (Universal Description, Discovery and Integration) es un
estándar basado en XML para describir, publicar y encontrar servicios
web.
Otras implementaciones muy comunes de SOA son:
CORBA (Common Object Request Broker Architecture) [11] es un
estándar definido por el OMG (Object Management Group) 1 que
describe un mecanismo de mensajería para la comunicación entre
objetos remotos distribuidos de forma heterogénea a través de la red.
La comunicación se establece a través de unas interfaces definidas en
IDL (Interface Definition Language) y es independiente del sistema
operativo y del lenguaje de programación utilizado.
DCOM (Distributed Component Object Model) es una tecnología
propiedad de Microsoft para distribuir software a través de la red.
J2EE (Java 2 Platform Enterprise Edition) permite la definición de
aplicaciones orientadas a servicios.
En los últimos años, existe una implementación de SOA que está ganando
mucho peso, son las MSA (MicroServices Architectures). En la figura 7 [9] se
muestra la evolución de las arquitecturas de software durante los últimos años.
de tecnologías orientadas a objetos como CORBA, UML y XMI (XML Metadata Interchange) entre
otras.
-9-
Figura 7: evolución arquitectura software
- 11 -
Figura 10: ley de Conway
- 12 -
ANTECEDENTES Y MARCO TECNOLÓGICO
- 13 -
Gestión de datos descentralizada
En el modelo monolítico se tiende a disponer de un único almacén de datos,
o varios en alta disponibilidad, con el fin de garantizar la persistencia y coherencia
de los mismos. Sin embargo, con las arquitecturas basadas en microservicios se
defiende que cada microservicio gestione su propio sistema de base de datos. Una
representación se muestra en la figura 13.
Automatización de infraestructura
El gran desarrollo de la computación en la nube de los últimos años ha traído
consigo la mejora de las técnicas de automatización disponibles para los
microservicios.
Las técnicas de automatización han evolucionado y mejorado mucho con la
computación en la nube, lo que hace que los microservicios puedan ser fácilmente
desplegados y depurados en tiempo real. Además, haciendo uso del continuous
delivery2 se puede tener siempre la última versión desplegada en producción.
Diseñados para fallar
Como consecuencia de utilizar los servicios como componentes, las
aplicaciones han de ser diseñadas para tolerar los fallos puesto que cualquier
llamada puede no ser respondida debido a la indisponibilidad del servidor. Visto así,
es una desventaja en comparación con las arquitecturas monolíticas puesto que
supone un extra de trabajo para solventarlo. Sin embargo, una vez un servicio es
diseñado y preparado para fallar la aplicación el su conjunto es mucho más robusta
y estable que si se tratase de una aplicación monolítica.
Con el fin de conseguir servicios tolerantes a fallos es importante detectarlos
rápido y disponer de los sistemas de automatización que se han tratado en el punto
anterior para desplegar nuevas versiones en caso de que sea necesario. En estos
- 15 -
Escalado Horizontal: hacer copias de la Vertical: se puede escalar aquella
aplicación al completo parte de la aplicación que se
necesite
Sin embargo como se observa en la figura 14 [21] la arquitectura monolítica
sigue resultando más productiva para aquellos problemas y situaciones que se
caracterizan por su sencillez.
- 17 -
virtualización ligera de contenedores. Está escrito en Go y utiliza LXC, cgroups y el
kernel de Linux.
Aunque LXC y Docker pueden complementarse, la sencillez y la interfaz de
alto nivel ofrecida por Docker le han llevado a ser la plataforma más usada y
evolucionar y crecer desmesuradamente desde su creación, hasta el punto de llegar
a los 12 billones de descargas de imágenes en 2018. Véase figura 17 [26].
- 18 -
ANTECEDENTES Y MARCO TECNOLÓGICO
4 Raft es un algoritmo de consenso que permite distribuir el estado de una máquina a lo largo
de un clúster, asegurando que cada uno de los nodos del clúster están en el mismo estado y
garantizando la consistencia de la información.
- 20 -
ANTECEDENTES Y MARCO TECNOLÓGICO
- 21 -
Docker Swarm
Docker contiene un framework5 de orquestación y una plataforma de gestión,
llamado Docker Swarm [31], para la gestión de nodos que forman un clúster. Es
accesible por defecto por línea de comandos a través de CLI (Command Line
Interface) y ofrece un mecanismo para el escalado, distribución, orquestación y
monitorización de microservicios en arquitecturas multinodo de forma rápida y
sencilla haciendo uso de ficheros yaml.
Además dispone de un mecanismo que permite a los nodos descubrirse y
establecer relaciones entre sí utilizando TLS (Transport Layer Security) como capa
de transporte.
La arquitectura de Docker Swarm se muestra en la figura 19. En ella se aprecia
un clúster formado por varios nodos trabajadores y varios managers. Los usuarios
interactúan con Docker Swarm a través del CLI ofrecido por los managers.
Portainer
Portainer es una solución de gestión de contenedores accesible a través de
una interfaz web que permite gestionar diferentes entornos Docker (nodos y swarm
clúster).
Entre otras cosas permite:
Visualizar un resumen del estado general del nodo o nodos.
Gestión de plantillas de aplicaciones: permite editar y hacer uso de
plantillas ya creadas con el fin de poder desplegar los contenedores ahí
definidos.
Gestión de stacks: creación y modificación de conjuntos de servicios.
Swarmpit
Como se muestra en la figura 21, presenta una interfaz muy parecida a la de
portainer pero bastante más simple y enfocada principalmente a la gestión del
clúster. Se trata de una solución sencilla y ligera que permite una gestión básica de
Docker Engine.
- 23 -
Figura 21: interfaz Swarmpit
Docker-swarm-visualizer
Docker-swarm-visualizer proporciona simplemente una representación
gráfica en directo del clúster, incluyendo los nodos y los contenedores que está
ejecutando cada uno de ellos, sin poder realizar ningún tipo de gestión ni alteración
del entorno.
- 24 -
ANTECEDENTES Y MARCO TECNOLÓGICO
Kubernetes
Kubernetes, también conocido como k8s, es un sistema de código abierto
multiplataforma para la automatización de despliegues, escalado y gestión de
aplicaciones contenedorizadas. Fue creado en 2014 por Google haciendo uso del
lenguaje Go y posteriormente donado a Cloud Native Computing Foundation [32].
Antes de profundizar es necesario introducir una serie de conceptos:
Espacio de nombres, namespace en inglés es un término creado con el
fin de proporcionar aislamiento entre zonas, de forma que los
elementos y objetos que pertenezcan a un espacio de nombres son
independientes e invisibles por los demás. Es una característica que
resulta realmente útil sobre todo cuando varios proyectos o equipos
distintos se están ejecutando sobre el mismo clúster. Por defecto
existen tres espacios de nombres:
o Kube-system: espacio de nombres que almacena todos los
objetos que ha creado el sistema
o Kube-public: espacio de nombres usable por el clúster para
hacer públicos unos determinados objetos. Es configurable por
el administrador.
o Default: espacio de nombres general del clúster. Normalmente
usado para la gestión privada de objetos.
Pod: mínima entidad que se puede desplegar en Kubernetes. Puede
estar compuesto por uno o más contenedores, aunque normalmente
se despliega un contenedor por cada pod. Los contenedores que se
ejecutan dentro de un pod comparten el contexto, parámetros de red,
espacio de nombres, volúmenes y todo el entorno de ejecución.
Los pods son entendidos como unidades temporales que pueden ser
volatilizadas en cualquier momento por el administrador o por el
clúster en sí, y no tienen que implementar mecanismos para ser
recuperados ya que de dichas tareas se encarga Kuberenetes.
Despliegue, deployment en inglés: es la mejor forma de desplegar y
gestionar una aplicación en Kubernetes. Ofrece los mecanismos
necesarios para desplegar, actualizar y escalar por completo la
aplicación.
Servicios: son entendidos como una capa de abstracción para el
enrutado de tráfico hacia un determinado conjunto de pods. Haciendo
uso de los servicios no es necesario encaminar el tráfico a la dirección
IP de cada pod, sino que se utilizan selectores y etiquetas que permiten
hacerlo de forma automática. Por tanto, permite el desacoplamiento y
hace posible la comunicación entre microservicios, soportando TCP y
UDP. Hay cuatro tipos de servicios:
o ClusterIP: el servicio se hace público a través de una IP interna
dentro del clúster.
o NodePort: Kubernetes asigna un puerto en cada nodo y todo el
tráfico que vaya a ese puerto será enrutado al puerto del
servicio.
- 25 -
o LoadBalancer: disponible solo cuando se usan proveedores de
cloud como AWS. Kubernetes provisiona un balanceador de
carga haciendo uso del balanceador de carga del proveedor
cloud.
o ExternalName: proporciona mecanismos basados en CNAME
para hacer accesible un servicio interno del clúster.
Replication set y replication controller: como se ha comentado antes
el ni el pod ni el administrador han de encargarse de la gestión ni del
ciclo de vida de los pods, puesto que Kubernetes dispone de los
recursos necesarios para ello. Se trata de RS (Replication Set) y RC
(Replication Controller): unos mecanismos encargados de escalar y
replicar los componentes para cumplir con el estado definido en el
fichero de despliegue.
Stateful sets: entendidos como controladores de pods que se encargan
de garantizar el orden y unicidad de los mismos.
Daemon sets: garantiza que cada uno de los nodos del clúster ejecutan
una serie de pods. Por ejemplo cuando un nodo se añade al clúster ha
de ejecutar una serie de demonios6 que desempeñan funciones como
gestión de logs, gestión de almacenamiento… Dichos demonios son
eliminados cuando un nodo abandona el clúster.
Trabajos, jobs: el flujo de trabajo en Kubernetes se gestiona en base a
trabajos. Se espera que cada contenedor realice una serie de tareas y
las acabe después de un determinado periodo de tiempo. Los jobs son
útiles si se necesita procesamiento único o por lotes en lugar de
ejecutar tareas de ejecución continua. Además existe la posibilidad de
programar y planificar esos trabajos haciendo uso del demonio cron7
convencional.
Volúmenes: entendidos como los discos de los contenedores.
Etiquetas: en formato de ‘clave:valor’ que permiten referenciar de
diferentes modos a los objetos.
Nodo maestro: nodo encargado de controlar el clúster de Kubernetes
y realizar la asignación de tareas a los nodos trabajadores.
Nodo trabajador o esclavo: máquina encargada de realizar las tareas
requeridas y asignadas por el nodo maestro.
Kubelet: es el principal punto de contacto entre los nodos y el clúster.
Se trata de un servicio que se ejecuta en los nodos y se encarga de leer
los manifiestos del contenedor, garantizando que los contenedores
definidos se encuentren listos y ejecutándose.
Kubectl: herramienta de configuración CLI de Kubernetes.
Kubeadm: es un complemento para el aprovisionamiento de clúster de
forma segura y extensible.
Kube-proxy: proxy que se ejecuta en cada uno de los nodos del clúster
con el fin de gestionar el direccionamiento y hacer accesibles los
servicios a los demás componentes. No se trata de un simple
reencaminador de tráfico, sino que también desempeña funciones
como balanceador de carga y pequeñas nociones de alta
disponibilidad.
Kube-scheduler: planificador. Es un componente que reside en el nodo
maestro y se encarga de asignar un nodo en el que ejecutar los pods
recientemente creados.
Etcd: es un proveedor de almacenamiento persistente, muy ligero
desarrollado por CoreOS que proporciona el almacenamiento seguro
de todos los datos del clúster en cualquier instante de tiempo.
Servidor API: proporciona una interfaz interna y externa de
Kubernetes haciendo uso de JSON (JavaScript Object Notation) sobre
HTTP/HTTPS a través de servicios REST (Representational State
Transfer). Es un componente primordial para el establecimiento de
comunicación y además es el único que establece comunicación
directa con etcd. Véase el ejemplo de la figura 23:
- 27 -
Figura 24: arquitectura Kubernetes
8Se entiende por manifest un fichero que se usa para definir datos relativos a la aplicación y
en concreto a los pods de red.
9 Docker Compose es un complemento para la definición de aplicaciones multi contenedor
con Docker.
- 29 -
Descubrimiento de servicios: no se necesitan mecanismos externos
para descubrir nuevos servicios puesto que Kubernetes asigna las
direcciones IP a los contenedores y un nombre DNS único para ellos.
Balanceo de carga: distribuye el flujo de trabajo y/o de información
entre una serie de dispositivos con el fin de incrementar la capacidad
y disponibilidad de las aplicaciones.
Auto reparación: si un contenedor falla o se elimina, Kubernetes tiene
capacidad de reemplazarlo automáticamente.
Despliegues y cambios de versiones automáticos: existe la posibilidad
de actualizar y revertir la versión de los contenedores de forma
automática, progresiva y acorde al estado de la aplicación en cada
momento.
Planificación: capacidad de decidir y asignar qué contenedores han de
ejecutarse en cada nodo de acuerdo a los recursos requeridos y otro
tipo de restricciones añadidas.
Gestión de información sensible: dispone de un mecanismo de
almacenamiento de información privilegiada –típicamente
contraseñas, claves ssh…– que se gestionan de forma independiente a
los contenedores.
Orquestación del almacenamiento: es capaz de gestionar distintos
tipos de almacenamiento para sus contenedores. Entre ellos destacan
algunos proveedores de nube pública como GCP (Google Cloud
Computing) y AWS y otros sistemas de almacenamiento en red como
NFS (Network File System), GlusterFS, Ceph, Cinder o Flocker.
Ejecución de trabajos por lotes: a parte de los servicios, permite
gestionar cargas de trabajo por lotes reemplazando los contenedores
que fallen.
Versatilidad: se trata de una plataforma muy versátil que abarca un
amplio abanico de posibilidades ya que puede ser desplegado:
o en máquinas físicas sobre distintos sistemas operativos como
Fedora, CentOS, Ubuntu…
o on-premise 10 con máquinas virtuales haciendo uso de
tecnologías como Vagrant, CloudStack, Vmware, OpenStack,
Fedora…
o en entornos cloud y plataformas PaaS como Google Container
Engine, Openshift, Azure y Deis, entre otras.
Cuenta con el apoyo de grandes empresas como Amazon, Amadeus,
Huawei, Ebay o Philips entre otras.
A continuación en la figura 26 se muestra una captura de la interfaz gráfica
de Kubernetes:
10 En el ámbito del software se entiende que las aplicaciones on-premise son aquellas que
2.3. NFV
2.3.1. Introducción
Típicamente, las redes de telecomunicaciones están compuestas de una
inmensa cantidad de dispositivos diferentes diseñados cada uno de ellos para
cumplir con una determinada función. Normalmente para lanzar un nuevo servicio
de red es necesaria la incorporación de otro dispositivo hardware en la
infraestructura, conllevando una serie de inconvenientes como: el coste del
dispositivo y su instalación, la vida útil –relativamente corta– de los equipos
hardware de hoy en día, inversión en infraestructuras, procesos de integración
complejos… Todas estas restricciones han llevado a cambiar el sistema de red
tradicional por un sistema de virtualización de funciones de red (NFV).
Las tecnologías NFV hacen uso de la virtualización: una técnica que permite
la creación de recursos hardware y software ficticios. Esta técnica que fue
introducida en allá por los años 60 por IBM [34] permite gestionar de forma muy
escalable y granular los recursos hardware de una máquina, permitiendo así un gran
aumento en el rendimiento de los servidores ya que antes sólo se utilizaba entre el 5
y el 15% de los mismos.
El concepto de NFV surgió cuando las empresas proveedoras de servicios de
telecomunicación se unieron con el objetivo de acelerar el proceso de despliegue de
servicios de red, aumentar su alcance y disminuir sus costes formando el ETSI11, una
- 32 -
ANTECEDENTES Y MARCO TECNOLÓGICO
- 33 -
cumplir con una determinada normativa. Por ejemplo, existen ciertas alternativas
que permiten desplegar VNF cumpliendo con la especificación de ETSI NFV MANO
como OpenBaton que será analizada a continuación.
Por otro lado, existen otras alternativas, como TOSCA (Topology and
Orchestration Specification for Cloud Applications) [38] un estándar que define un
modelo de datos gestionado por el grupo industrial OASIS12 que puede ser utilizado
para orquestar servicios NFV en la nube. Funciona haciendo uso de una serie de
modelos de datos y plantillas y es perfectamente compatible con soluciones que
cumplan con ETSI MANO.
2.3.3. Soluciones
A continuación se recogen una serie de soluciones e implementaciones de la
norma que permiten el despliegue de NFV.
OpenBaton
OpenBaton es una plataforma de código abierto que proporciona una
implementación completa de la especificación ETSI NFV MANO [39]. Surgió tras
una serie de procesos de diseño que tenían como objetivo la creación de un
framework personalizable capaz de orquestar servicios de red a través de
infraestructuras NFV, véase figura 28.
Onap
Onap es una plataforma para la orquestación y automatización de funciones
de red físicas y virtuales que permite a los proveedores de redes, cloud y software
desplegar y automatizar nuevos servicios en tiempo real haciendo uso de
infraestructuras como EC2 (Elastic Compute Cloud) y OpenStack [40].
Cloudify
Cloudify es una plataforma de código abierto para la orquestación de
aplicaciones y servicios de red en plataformas cloud. Está pensado para automatizar
el despliegue y configuración de aplicaciones en entornos de cloud [41].
Utiliza un enfoque declarativo centrado en la especificación TOSCA en el que
los usuarios definen el estado deseado de la aplicación a través de variables y
plantillas sencillas escritas en yaml y Cloudify se encarga de alcanzar y mantener
dicho estado, al mismo tiempo que lleva a cabo tareas de monitorización con el fin
de asegurar que la aplicación funciona correctamente y cumple con los SLA (Service
Level Agreement) deseados.
Presenta múltiples modos de instalación entre los que destacan: a través de
ficheros RPM (Red Hat Package Manager), imágenes Docker, AWS y OpenStack y a
través de comandos.
Como se ha mencionado antes, Cloudify no es un mero orquestador de
servicios en la web, sino que se trata de un orquestador completo de aplicaciones y
servicios cloud. Por tanto, como se observa en la figura 32, Cloudify presenta un gran
alcance englobando la aplicación al completo: infraestructura, middleware, código
de la aplicación, contenedores, componentes de red, bases de datos y alarmas.
- 36 -
ANTECEDENTES Y MARCO TECNOLÓGICO
Uno de los casos de uso más comunes de Cloudify, relacionado con el ámbito
y las tecnologías de este proyecto, pasa por la gestión completa de un clúster de
Kubernetes que reside en un entorno de cloud -en concreto haciendo uso de alguno
de los proveedores de IaaS como Openstack, Azure o AWS-. Véase figura 33.
- 37 -
Figura 34: red tradicional VS SDN
- 38 -
ANTECEDENTES Y MARCO TECNOLÓGICO
2.4. OPENSTACK
2.4.1. Introducción
OpenStack es una plataforma de código abierto que utiliza una serie de
recursos informáticos para construir y gestionar nubes públicas y privadas.
Se trata de un gran proyecto respaldado por más de 82 000 miembros y más
de 200 empresas del sector repartidas por 187 países alrededor del mundo. Es
administrado por OpenStack Foundation 14 , organización sin ánimo de lucro
encargada de gestionar el desarrollo y la comunidad que giran en torno al proyecto.
OpenStack está pensado para proporcionar una infraestructura como servicio
(IaaS), es decir, ofrece a los usuarios la capacidad de gestionar el hardware por
completo. Si bien es cierto que existen algunos complementos –como magnum–
que permiten la distribución de contenedores a través de OpenStack.
Su comportamiento es ideal en aquellos entornos que requieren de alta
escalabilidad, dinámicos y cambiantes.
Aunque el alcance de OpenStack es tan grande que podría abarcar el proyecto
al completo, a continuación se proporcionan una serie de detalles en lo que a
arquitectura y funcionalidad se refiere que pretenden servir de base para entender
qué papel juega en el despliegue de microservicios y VNF.
2.4.2. Componentes
La versión general de OpenStack ofrece una infraestructura como servicio a
través de una amplia gama de servicios independientes. Cada uno de esos servicios
ofrece una API que lo hace accesible y facilita su integración con el resto.
Como mínimo necesitaremos los siguientes servicios para hacer un
despliegue básico:
Keystone: servicio de identidad, encargado de autenticar y autorizar
los servicios de OpenStack entre sí.
Glance: servicio de imágenes. Se encarga de obtener y almacenar las
imágenes de disco de las máquinas virtuales.
Nova: servicio de computación. Ofrece una forma de aprovisionar
instancias de computación, también conocidas como servidores
virtuales. Soporta crear máquinas virtuales, hacer uso de servidores
físicos…
Neutron: servicio de networking. Ofrece provisionamiento de red en
los entornos virtuales basado en SDN. Algunas funciones disponibles
son DNS, DHCP, grupos de seguridad y balanceamiento de carga
entre otros.
Otros servicios de OpenStack son [46]:
Aodh: servicio de alarmas.
Barbican: gestión de claves.
aplicaciones del hardware físico subyacente. Se trata de un concepto clave en la virtualización que
permite maximizar el uso de recursos como memoria y disco.
- 41 -
Figura 37: interfaz gráfica Devstack
Por otro lado, la versión Red Hat Enterprise Linux OpenStack Platform
presenta una arquitectura más compleja y recomendada para entornos en
producción en la que se recomienda disponer de 10 nodos, repartidos: 3 x controller,
3 x compute, 3 x storage y 1 x director.
De acuerdo a los componentes listados en el apartado anterior, la
arquitectura de OpenStack puede ser más o menos compleja. En la figura 77 del
anexo F, se encuentra representada la arquitectura lógica de una de las versiones
más básicas y reducidas de OpenStack. En ella se muestran los servicios principales,
introducidos anteriormente, y la comunicación entre ambos.
- 43 -
- 44 -
CONSIDERACIONES DE DISEÑO
3. CONSIDERACIONES DE DISEÑO
3.1. ESPECIFICACIONES Y RESTRICCIONES DE DISEÑO
A continuación se listan una serie de especificaciones y restricciones de
diseño que han condicionado el desarrollo del proyecto:
1. Con el fin de disponer un entorno lo más semejante a la realidad
posible, se ha decidido realizar el análisis y diseño en un conjunto de
nodos distintos en el que todos o parte de ellos se encuentren
físicamente separados.
2. Normalmente cuando se trata de desplegar aplicaciones y funciones
de red, se dispone de un conjunto de recursos hardware muy
diferentes entre sí que pueden disponer de pocos recursos hardware.
Considerando las características de los nodos, el alcance del proyecto
engloba diferentes situaciones posibles, de modo que se han analizado
y considerado escenarios con las siguientes peculiaridades que le
proporcionan una dificultad añadida. Son:
Diversidad de arquitecturas entre nodos
Despliegue y extensión del trabajo a ordenadores de placa
reducida, como Raspberry Pi.
3. Las VNF y los microservicios desplegados han de garantizar el
cumplimiento de los principios filosóficos de las tecnologías, es decir:
agilidad, aislamiento, ligereza, escalabilidad…
3.2. DECISIONES DE DISEÑO
Como se ha mencionado anteriormente, existen tecnologías como Cloudify
que están pensadas para la orquestación de aplicaciones y servicios de red en
plataformas cloud. Para su uso requieren de un entorno cloud que típicamente se
consigue haciendo uso de infraestructuras creadas con OpenStack o que son
proporcionadas a través de proveedores como Azure o Amazon Web Services. Por
tanto, un entorno para el despliegue y orquestación de microservicios y funciones
de red podría estar compuesto por Cloudify y OpenStack.
Los principios filosóficos de los microservicios están muy relacionados con la
ligereza, y agilidad de los servicios y de los entornos. Esto unido con el deseo de
hacer válido este trabajo en entornos considerablemente ligeros y reducidos ha
hecho que tecnologías que requieren de ciertas cantidades de recursos como
OpenStack y Cloudify hayan quedado apartadas de las implementaciones
principales. En concreto, en OpenStack se pueden desplegar microservicios, y
durante el desarrollo de este proyecto se ha hecho, la peculiaridad es que por las
características del producto, el entorno sobre el que se instala OpenStack no puede
ser precisamente ligero, y una de las decisiones de diseño tomadas ha sido: la
valoración de otras tecnologías que permitan el despliegue de microservicios y
funciones de red en entornos reducidos.
Las tecnologías con las que se ha decidido trabajar han sido: Docker,
Kubernetes y OpenBaton principalmente. Sin embargo, si se dispone del hardware
necesario, queda pendiente para el futuro del estudio, análisis y despliegue de
- 45 -
microservicios y funciones de red haciendo uso de tecnologías como OpenStack y
Cloudify.
- 46 -
IMPLEMENTACIÓN Y RESULTADOS
4. IMPLEMENTACIÓN Y RESULTADOS
4.1. Introducción al entorno
La prueba de concepto se ha basado en el despliegue de microservicios en la
red a través de contenedores valorando y estudiando todas las tecnologías tratadas
en el segundo capítulo.
Atendiendo a las características, requisitos y funcionalidad se han definido
principalmente tres escenarios diferentes que se analizan en el siguiente orden:
1. Despliegue de microservicios mediante contenedores en un clúster
Docker formado por un conjunto de nodos monoarquitectura.
2. Despliegue de microservicios mediante contenedores en un clúster
Docker formado por un conjunto de nodos multiarquitectura.
3. Despliegue de microservicios mediante contenedores en un clúster
Kubernetes formado por un conjunto de nodos monoarquitectura.
En cada uno de los escenarios se han realizado una serie de despliegues y
pruebas de rendimiento que permiten evaluar y estudiar cada tecnología en función
de varios factores y condicionantes de despliegue.
Además, de forma adicional y con el fin de desplegar una función de red real
y aplicable a las redes de hoy en día se ha creado y desplegado un firewall en un
contenedor según se recoge en el anexo E.
El primer escenario está formado por un conjunto de nodos agrupados en un
clúster monoarquitectura que son gestionados y orquestados con Docker Swarm. El
clúster está formado por los nodos que se muestran en la tabla 3:
Tabla 3: nodos primer escenario
El segundo escenario está constituido por los mismos nodos que el primero
con la salvedad de que se ha añadido una Raspberry Pi 3, con arquitectura arm, con
el objetivo de probar la funcionalidad multiarquitectura de las tecnologías. Sus datos
se recogen en la tabla 4.
- 47 -
Tabla 4: nodos segundo escenario
- 48 -
IMPLEMENTACIÓN Y RESULTADOS
10
6
y = 0,067x + 3,0389
4 R² = 0,9794
0
0 20 40 60 80 100 120
Número de réplicas
- 49 -
Analizando las medidas de tiempo y de rendimiento obtenidas tras los
despliegues, se concluye el número de réplicas de una imagen es inversamente
proporcional al tiempo que cuesta desplegar cada una de las réplicas; de modo que
cuantas más réplicas de una imagen se lancen, menos tiempo por réplica costará
hacerlo. Dicha relación está definida por una función exponencial decreciente que a
medida que aumenta el número de réplicas, eje de abscisas en nuestro caso, se
aproxima más a cero. Estos datos se muestran en la figura 41:
3
2,5
y = 2,6435e-0,225x
2 R² = 0,949
1,5
1
0,5
0
1 2 3 4 5 6 7 8 9 10 15 20 50 100
Número de réplicas
- 50 -
IMPLEMENTACIÓN Y RESULTADOS
0
1 2 3 4 5 6 7 8 9 10 15 20 50 100
Número de réplicas
120
100
80
60 y = 1,1589x + 4,826
R² = 0,9684
40
20
0
0 20 40 60 80 100 120
Número de réplicas
- 52 -
IMPLEMENTACIÓN Y RESULTADOS
Tiempo/réplica (s)
4 y = 2,8792e-0,063x
R² = 0,429
3
0
1 2 3 4 5 6 7 8 9 10 15 20 50 100
Número de réplicas
Reparto de contenedores
17% 16%
17% 17%
17% 16%
- 54 -
IMPLEMENTACIÓN Y RESULTADOS
y = 1,7998x - 3,8422
100
R² = 0,9863
50
0
0 20 40 60 80 100 120
-50
Número de réplicas
Sin embargo, cabe destacar que pese a que los nodos del clúster son los
mismos que en el primer escenario, los tiempos de despliegue de este son bastante
superiores a los anteriores. Esto es debido a que al instalar una plataforma que
gestiona Docker como es Kubernetes las labores de gestión y administración del
clúster se multiplican y como consecuencia el tiempo que se necesita para realizar
operaciones en el entorno aumenta. Del mismo modo, como se muestra en la figura
49, los tiempos de despliegue por réplica no tienden a cero a medida que se aumenta
el número de réplicas por servicio, como ocurría en el primer escenario y ahora la
función que mejor define el modelo de datos es una función logarítmica con un
coeficiente de correlación de tan sólo 0,2881.
No obstante, normalmente merece la pena asumir ese incremento del tiempo
por las prestaciones y mejoras, incluidas en el marco tecnológico, que ofrece la
plataforma a la hora de orquestar y gestionar microservicios con respecto al
orquestador de Docker Swarm.
4,5
4
3,5
3
y = -0,405ln(x) + 2,5449
2,5 R² = 0,2881
2
1,5
1
0,5
0
0 20 40 60 80 100 120
Número de réplicas
- 56 -
PRESUPUESTO
5. PRESUPUESTO
Para la realización de este proyecto se han hecho uso de unos recursos
hardware y humanos específicos, por lo que se ha incurrido en un coste que se
analiza de manera detallada a continuación:
En cuanto a mano de obra, siguiendo los precios definidos en el documento
para un técnico de telecomunicaciones [48], el gasto en personal considerado se
recoge en la tabla 5.
Tabla 5: costes mano de obra
Teniendo en cuenta que los recursos hardware no han sido comprados para
la ocasión y por lo tanto no suponen un coste directo para el proyecto, el
presupuesto total del proyecto es 9.254,40€.
Sin embargo, en este presupuesto también se van a valorar diferentes
opciones a la hora de asumir los costes del equipamiento. Tradicionalmente los
recursos se compraban y se usaban, pero hoy en día existe cierta tendencia a alquilar
determinados componentes hardware como ordenadores y servidores, por lo que en
este presupuesto se van a contemplar ambas opciones.
En primer lugar, considerando la opción de compra, a la cantidad de
9.254,40€ obtenida en el cálculo anterior se le deben sumar los gastos de material
que se incluyen en la tabla 6.
Tabla 6: coste compra de hardware
Precio ud.
Concepto Unidades Total (€)
(€)
Pack completo
1 79,99 79,99
Raspberry pi 3
Servidor físico 2 1.000 2.000
- 57 -
Tabla 7: coste alquiler hardware
Precio
Número
Concepto Unidades ud/mes Total (€)
meses
(€)
Alquiler
2 72,51 36 5.220,72
servidor físico
COMPARATIVA PRESUPUESTO
Mano de obra Recursos
€5.220,72
€2.000,00
€9.254,40 €9.254,40
COMPRA ALQUILER
Nota: todos los precios aquí mencionados han sido tomados a fecha 25 de
junio de 2018.
- 58 -
CONCLUSIONES Y TRABAJOS FUTUROS
- 59 -
- 60 -
REFERENCIAS
7. REFERENCIAS
E.
[ Forbes, «Microservices in Java,» [En línea]. Available:
1] https://codeburst.io/microservices-in-java-never-a7f3a2540dbb. [Último
acceso: 25 junio 2018].
R.
[ Velasco, «IaaS, PaaS, CaaS, SaaS – ¿Qué significan estos conceptos de
2] Cloud Computing?,» 17 07 2016. [En línea]. Available:
https://www.redeszone.net/2016/07/17/iaas-paas-caas-saas-significan-
estos-conceptos-cloud-computing/. [Último acceso: 25 junio 2018].
Cisco,
[ «Fog Computing and the Internet of Things: Extend,» 04 2015. [En
3] línea]. Available:
https://www.cisco.com/c/dam/en_us/solutions/trends/iot/docs/computin
g-overview.pdf. [Último acceso: 25 junio 2018].
G.
[ Gonzalez, «Qué es el “Fog Computing” o computación en la niebla,» 22
4] 04 2014. [En línea]. Available:
https://hipertextual.com/archivo/2014/04/fog-computing/. [Último
acceso: 25 junio 2018].
Azure,
[ «¿Qué es la informática en la nube?,» [En línea]. Available:
5] https://azure.microsoft.com/es-es/overview/what-is-cloud-computing/.
[Último acceso: 25 junio 2018].
«Microservices
[ vs Monolithic Architecture,» [En línea]. Available:
6] https://www.mulesoft.com/resources/api/microservices-vs-monolithic.
[Último acceso: 25 junio 2018].
A.
[ Schroeder, «Microservice Architectures,» [En línea]. Available:
7] https://pdfs.semanticscholar.org/presentation/324e/9c16a30d388a219497
7243a077c1499083f1.pdf. [Último acceso: 25 junio 2018].
IEEE,
[ IEEE- Std 1471-2000 IEEE Recommended Practice for Architectural
8] Description of Software-Intensive Systems, New York, 2000.
M.
[ Endrei, J. Ang, A. Arsanjani, S. Chua, P. Comte, P. Krogdahi, M. Luo y T.
9] Newling, Patterns: ServiceOriented Architecture and Web Services, 2004.
G.
[ Chun Lin, K. Eng Tat Desmond, N. Tayza Htoon y N. Van Thuat , Service
10] Oriented Architecture.
OMG,
[ «Corba,» [En línea]. Available: http://www.corba.org/. [Último
11] acceso: 25 junio 2018].
M.
[ Fowler, «Microservices,» 25 March 2014. [En línea]. Available:
12] https://www.martinfowler.com/articles/microservices.html. [Último
acceso: 25 junio 2018].
- 61 -
M.
[ McIlroy, E. N. Pinson y B. A. Tague, The Bell System Technical Journal,
13] p. 388, July-August 1978.
«The
[ Bell System Technical Journal,» July-August 1978. [En línea].
14] Available: http://emulator.pdp-11.org.ru/misc/1978.07_-
_Bell_System_Technical_Journal.pdf. [Último acceso: 25 junio 2018].
M.
[ Conway, «Conways Law,» 1968. [En línea]. Available:
15] http://www.melconway.com/Home/Conways_Law.html. [Último acceso:
25 junio 2018].
E.
[ Mueller, «What Is DevOps?,» 2 August 2010. [En línea]. Available:
16] https://theagileadmin.com/what-is-devops/. [Último acceso: 25 junio
2018].
«What
[ is an ESB?,» [En línea]. Available:
17] https://www.mulesoft.com/resources/esb/what-esb. [Último acceso: 25
junio 2018].
«RabbitMQ,»
[ [En línea]. Available: https://www.rabbitmq.com/. [Último
18] acceso: 25 junio 2018].
N.
[ Peck, «Microservice Principles: Decentralized Governance,» 5
19] September 2017. [En línea]. Available:
https://medium.com/@nathankpeck/microservice-principles-
decentralized-governance-4cdbde2ff6ca. [Último acceso: 25 junio 2018].
S.
[ Daya, N. Van Duy, K. Eati, C. M Ferreira, D. Glozic , V. Gucer, M. Gupta ,
20] S. Joshi, V. Lampkin, M. Martins, S. Narain y R. Vennam, Microservices
from Theory to Practice. Creating Applications in IBM Bluemix Using the
Microservices Approach, Redbooks, 2015.
M.
[ Fowler, «Microservices Resource Guide,» [En línea]. Available:
21] https://martinfowler.com/microservices/. [Último acceso: 25 junio 2018].
Amazon,
[ «¿Qué son los contenedores?,» [En línea]. Available:
22] https://aws.amazon.com/es/what-are-containers/. [Último acceso: 25
junio 2018].
T.
[ H. II, Advanced Microservices. A Hands-on Approach to Microservice
23] Infrastructure and Tooling, San Francisco, 2017.
«Docker
[ vs LXC,» [En línea]. Available:
24] https://www.upguard.com/articles/docker-vs-lxc. [Último acceso: 25 junio
2018].
R.
[ McKendrick y S. Gallagher, Mastering Docker, Birmingham: Packt, 2017.
25]
- 62 -
REFERENCIAS
Docker,
[ «What is a container,» [En línea]. Available:
26] https://www.docker.com/what-container. [Último acceso: 25 junio 2018].
K.
[ Casey, 13 September 2017. [En línea]. Available:
27] https://enterprisersproject.com/article/2017/9/microservices-and-
containers-6-things-know-start-time. [Último acceso: 25 junio 2018].
Docker,
[ «How nodes work,» [En línea]. Available:
28] https://docs.docker.com/engine/swarm/how-swarm-mode-
works/nodes/#manager-nodes. [Último acceso: 25 junio 2018].
F5,
[ «Load balancer,» [En línea]. Available: https://f5.com/glossary/load-
29] balancer. [Último acceso: 25 junio 2018].
Docker,
[ «Scale your service,» [En línea]. Available:
30] https://docs.docker.com/docker-cloud/apps/service-scaling/. [Último
acceso: 25 junio 2018].
Docker,
[ «Docker Swarm,» [En línea]. Available:
31] https://docs.docker.com/engine/swarm/key-concepts/. [Último acceso: 25
junio 2018].
H.
[ Saito, H.-C. Chloe Lee y C.-Y. Wu, DevOps with Kubernetes,
32] Birmingham: Packt, 2017.
Google
[ Trends, «Interés a lo largo del tiempo: Kubernetes, Docker
33] Compose, Docker Swarm,» [En línea]. Available:
https://trends.google.com/trends/explore?date=today%2012-
m,today%2012-m,today%2012-
m&geo=,,&q=Kubernetes,Docker%20Compose,Docker%20Swarm. [Último
acceso: 25 junio 2018].
Oracle,
[ «Brief History of Virtualization,» [En línea]. Available:
34] https://docs.oracle.com/cd/E26996_01/E18549/html/VMUSG1010.html.
[Último acceso: 25 junio 2018].
«What
[ is NFV – Network Functions Virtualization – Definition?,» [En
35] línea]. Available: https://www.sdxcentral.com/nfv/definitions/whats-
network-functions-virtualization-nfv/. [Último acceso: 25 junio 2018].
ETSI,
[ «Network Functions Virtualisation (NFV); Management and
36] Orchestration,» 2014. [En línea]. Available:
http://www.etsi.org/deliver/etsi_gs/NFV-
MAN/001_099/001/01.01.01_60/gs_NFV-MAN001v010101p.pdf. [Último
acceso: 25 junio 2018].
F.
[ Zarrar Yousaf, P. Loureiro, F. Zdarsky y M. Liebsh, « ETSI NFV
37] management and orchestration (MANO) framework overview,» [En línea].
- 63 -
Available: https://www.researchgate.net/figure/ETSI-NFV-management-
and-orchestration-MANO-framework-overview-1_fig1_291019215.
«Why
[ is TOSCA Relevant to NFV? Explanation,» [En línea]. Available:
38] https://www.sdxcentral.com/nfv/definitions/tosca-nfv-explanation/.
[Último acceso: 25 junio 2018].
Openbaton,
[ [En línea]. Available: https://openbaton.github.io/. [Último
39] acceso: 25 junio 2018].
ONAP,
[ [En línea]. Available: https://www.onap.org/. [Último acceso: 25
40] junio 2018].
Cloudify,
[ [En línea]. Available: https://cloudify.co/. [Último acceso: 25
41] junio 2018].
ONF:
[ Open Networking Foundation, «Software-Defined Networking: The
42] New Norm for Networks,» [En línea]. Available:
http://www.ramonmillan.com/documentos/bibliografia/SDNTheNewNor
mForNetworks_ONF.pdf. [Último acceso: 25 junio 2018].
A.
[ Maleki, M. Moahimenul Hossain, J. Georges, E. Rondeau y T. Divoux,
43] «An SDN Perspective to Mitigate the Energy Consumption of Core
Networks – GEANT2,» 225 06 2018. [En línea]. Available:
https://www.researchgate.net/figure/Traditional-Network-versus-
SDN_fig1_319876305. [Último acceso: 25 junio 2018].
opennetworking,
[ «Software-Defined Networking (SDN) Definition,» [En
44] línea]. Available: https://www.opennetworking.org/sdn-definition/.
[Último acceso: 25 junio 2018].
opennetworking,
[ «OpenFlow Switch Specification,» [En línea]. Available:
45] https://www.opennetworking.org/wp-content/uploads/2014/10/openflow-
switch-v1.5.1.pdf. [Último acceso: 25 junio 2018].
Openstack,
[ «Openstack projects,» [En línea]. Available:
46] https://www.openstack.org/software/project-navigator. [Último acceso: 25
junio 2018].
OpenStack,
[ «Feature Support Matrix,» [En línea]. Available:
47] https://docs.openstack.org/nova/latest/user/support-matrix.html. [Último
acceso: 25 junio 2018].
Tragsa,
[ «Tarifas 2015 para encomiendas sujetas a impuestos,» [En línea].
48] Available: http://www.tragsa.es/es/grupo-tragsa/regimen-
juridico/Documents/ACTUALIZACI%C3%93N%20TARIFAS%20AGOSTO/
Tarifas%202015%20para%20encomiendas%20sujetas%20a%20impuestos.
pdf. [Último acceso: 25 junio 2018].
- 64 -
REFERENCIAS
Skrenting,
[ «Alquiler de recursos hardware,» [En línea]. Available:
49] http://www.skrenting.com. [Último acceso: 25 junio 2018].
Golang,
[ «Download the Go distribution,» [En línea]. Available:
50] https://golang.org/doc/install. [Último acceso: 25 junio 2018].
OpenBaton,
[ «VIM Driver for Docker,» [En línea]. Available:
51] https://github.com/openbaton/go-docker-driver. [Último acceso: 25 junio
2018].
K.
[ R, «Multiplatform (amd64 and arm) Kubernetes cluster setup,» 01 2018.
52] [En línea]. Available:
https://gist.github.com/squidpickles/dda268d9a444c600418da5e1641239
af. [Último acceso: 25 junio 2018].
E.
[ Knorr, «What is cloud computing? Everything you need to know now,»
53] 10 07 2017. [En línea]. Available:
https://www.infoworld.com/article/2683784/cloud-computing/what-is-
cloud-computing.html. [Último acceso: 25 junio 2018].
- 65 -
- 66 -
ANEXOS
ANEXOS
- 67 -
- 68 -
ENTORNO DISPONIBLE
A. ENTORNO DISPONIBLE
El hardware utilizado para el desarrollo de este proyecto se recoge en la tabla
8.
Tabla 8: características entorno
- 69 -
- 70 -
DOCKER
B. DOCKER
Instalación
Docker en Ubuntu
Requisitos:
Versión de 64 bits de alguna de las siguientes distribuciones de
Ubuntu:
o Artful 17.10 (Docker CE 17.11 Edge y superiores)
o Xenial 16.04 (LTS)
o Trusty 14.04 (LTS)
Arquitecturas:
o x86_64
o armhf
o s390x (IBM z)
o ppc64le (IBM power)
La versión utilizada de Ubuntu es “Ubuntu Xenial”, en concreto Ubuntu
16.04.4 LTS, de forma que si se ejecuta el comando “lsb_release -a” la salida
obtenida es:
Distributor ID: Ubuntu
Description: Ubuntu 16.04.4 LTS
Release: 16.04
Codename: xenial
- 71 -
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 4096K
NUMA node0 CPU(s): 0
Flags: fpu vme de pse tsc msr pae mce cx8
apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse
sse2 syscall nx rdtscp lm constant_tsc rep_good nopl
xtopology nonstop_tsc pni pclmulqdq monitor ssse3 cx16
sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand
hypervisor lahf_lm abm 3dnowprefetch retpoline kaiser avx2
rdseed clflushopt
2. Instalar una serie de complementos que nos permitan hacer uso de apt
sobre HTTPS. Es posible que estos paquetes ya estén instalados
sudo apt-get install apt-transport-https \
ca-certificates curl software-properties-common
- 72 -
DOCKER
Server:
Engine:
Version: 18.03.1-ce
API version: 1.37 (minimum version 1.12)
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:15:30 2018
OS/Arch: linux/amd64
Experimental: false
NOTA: Por defecto para hacer uso de Docker es necesario ser el usuario
administrador. Si se desea que un determinado usuario pueda hacer uso sin ser
administrador, basta con añadirlo al grupo docker:
sudo usermod -aG docker <NOMBRE-USUARIO>
- 73 -
Docker en Debian
Requisitos:
Versión de 64 bits de alguna de las siguientes distribuciones de Debian
o Raspbian:
o Buster 10 (Docker CE 17.11 Edge only)
o Stretch 9 (stable) / Raspbian Stretch
o Jessie 8 (LTS) / Raspbian Jessie
o Wheezy 7.7 (LTS)
Arquitecturas:
o x86_64
o armhf
La versión utilizada de Raspbian es “Raspbian stretch”, en concreto Raspbian
9.4, de forma que si se ejecuta el comando “lsb_release -a” la salida obtenida
es:
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.4 (stretch)
Release: 9.4
Codename: stretch
2. Instalar una serie de complementos que nos permitan hacer uso de apt
sobre HTTPS. Es posible que estos paquetes ya estén instalados
sudo apt-get install \
- 74 -
DOCKER
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common
Server:
Engine:
Version: 18.03.1-ce
API version: 1.37 (minimum version 1.12)
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:21:09 2018
OS/Arch: linux/arm
Experimental: false
NOTA: Por defecto para hacer uso de Docker es necesario ser el usuario
administrador. Si se desea que un determinado usuario pueda hacer uso sin ser
administrador, basta con añadirlo al grupo docker:
sudo usermod -aG docker <NOMBRE-USUARIO>
Instalación genérica
Existe otra alternativa que en algunas ocasiones resulta más eficaz y exitosa,
sobre todo si se experimentan problemas con la instalación y los repositorios, que
pasa por hacer uso del script que se aloja en la siguiente url: https://get.docker.com/
Para instalarlo basta con ejecutar el siguiente comando:
curl -sSL https://get.docker.com | sh
- 76 -
DOCKER
Manejo
Nociones básicas
A continuación se recogen una serie de comandos de manejo básico de
Docker.
En primer lugar, el estado de ejecución del servicio Docker se puede consultar
y modificar con:
service docker status
service docker stop
service docker start
service docker restart
- 77 -
Para lanzar un contenedor se utiliza el comando “docker run
[OPCIONES]”. De forma que para poner en ejecución el contenedor de httpd, un
servidor web muy básico bastaría con ejecutar “docker run httpd:latest”.
Sin embargo, está escuchando por el puerto 80 del contenedor, no del host en el que
se ejecuta, así que si queremos publicar el puerto entre el contenedor y el host será
necesario añadir el parámetro –p 80:80 que indica que el puerto 80 del host ha de
ser publicado. Por tanto, para ejecutar el mismo contenedor haciendo público el
puerto 80, y además ejecutándolo en segundo plano (opción –d), el comando es:
“docker run -d -p 80:80 httpd:latest”. Además, otra de las
características de los contenedores estudiadas en el capítulo 2, es su aislamiento, de
forma que un contenedor por defecto no tiene acceso al sistema de ficheros del nodo
en el que se lanza. Para compartir un sistema de ficheros entre el host y el
contenedor hay que añadir el parámetro –v <PATH HOST>:<PATH CONTENEDOR>
al comando docker run. Ejemplo: “docker run -d -p 80:80 –v
/var/www:/var/www httpd:latest”
Para conseguir que un contenedor se inicie automáticamente con el inicio del
nodo anfitrión se utilizar el parámetro “—restart”, que admite tres valores:
- 78 -
DOCKER
Comando Función
ADD Copia un fichero del sistema de ficheros del host al
contenedor
CMD Es el punto de ejecución del contenedor. Sólo puede haber
una instrucción de tipo CMD en el fichero
ENV Añade una variable de entorno al contenedor
EXPOSE Abre un puerto en el contenedor
FROM Indica la imagen que sirve de base para la creación del
contenedor. Es obligatorio y debe ser la primera instrucción
MAINTAINER Valor opcional con los datos del desarrollador
ONBUILD Sirve para ejecutar instrucciones a posteriori, cuando la
imagen se utiliza como base para otras
RUN Ejecuta un comando y guarda el resultado como una nueva
capa
USER Designa el usuario dentro del contenedor
VOLUME Sirve para crear volúmenes compartidos entre el contenedor
y el host
WORKDIR Asigna el directorio de trabajo del contenedor
Se ejecutará con:
docker run -d -p 80:80 repo1/apache01:v1.2
- 79 -
Existen varias formas de distribuir las imágenes. La más extendida es
haciendo uso de repositorios, a los que se pueden subir las imágenes con “docker
push <REPOSITORIO>/<IMAGEN>:<VERSIÓN>” y descargarlas con “docker
pull <REPOSITORIO>/<IMAGEN>:<VERSIÓN>”.
Otra forma de distribuir las imágenes es haciendo uso de ficheros. Una
imagen puede ser guardada en un fichero con el siguiente comando:
docker save –o <nombre-fichero> <nombre-imagen>
Clúster Docker
A continuación se recogen los pasos necesarios para la puesta en marcha del
clúster definido en el apartado 4.2.2, formado por los nodos de la siguiente tabla:
Tabla 10: nodos clúster Docker
Nodo Rol
GREDOS Master
Leon Worker
ubuntu001 Worker
ubuntu001 Worker
ubuntu001 Worker
raspberrypi01 Worker
- 80 -
DOCKER
En este momento el clúster está constituido por los 5 nodos. Los nodos del
clúster y su estado pueden ser consultados a través del comando “docker node
ls” como se muestra en la figura 51.
- 81 -
A modo de ejemplo, se va a desplegar un servicio con 8 réplicas basadas en
httpd, un servidor web básico comúnmente conocido como Apache. Al tratarse de
un servicio web es deseable publicar un puerto para hacerlo accesible, por eso se
ha añadido al comando el parámetro -p 80:80. El comando para desplegar el
servicio es el siguiente:
docker service create --name servicioHTTPD --replicas 8 -p 80:80
httpd
- 82 -
OPENBATON
C. OPENBATON
Existen varias alternativas a la hora de instalar OpenBaton: sobre Linux,
sobre MacOS, a través de un contenedor Docker y haciendo uso del instalador
Vagrant.
Según el alcance de este proyecto, se ha optado por la versión de OpenBaton
que permite la creación y gestión de VNF sobre el motor de Docker sin hacer uso de
infraestructuras de nube pública como OpenStack o Azure.
Aunque durante el desarrollo de este proyecto se han probado tanto la
instalación manual sobre Linux como la instalación haciendo uso de contenedores
Docker, aquí se recogerá la segunda de ellas por la sencillez y rapidez de instalación
que la caracterizan.
Los componentes principales que se necesitan son:
OpenBaton: se trata del framework principal que gestionará el
despliegue de VNF. Requiere de RabbitMQ para su funcionamiento.
RabbitMQ: mecanismo de mensajería ligero que proporciona un
sistema de comunicación asíncrono basado en una cola.
Docker VNFM para OpenBaton: es el responsable de la gestión del
ciclo de vida de las instancias VNF. Junto con el driver VIM de Docker
permite a OpenBaton desplegar contenedores en forma de VNF sobre
Docker Engine. Requiere de:
o Compilador Go
o RabbitMQ
Docker VIM Driver: junto con Docker VNFM permite el despliegue de
servicios de red (NS) sobre Docker. También requiere la instalación de
Go.
a. Instalación Go
La instalación del compilador Go se recoge suficientemente detallada en la
página oficial [50].
b. Instalación VIM Driver para Docker
A continuación se recogen los pasos necesarios para la descarga y puesta en
marcha del driver VIM para Docker [51]:
1. Descargar el repositorio albergado en github
git clone git@github.com:openbaton/go-docker-driver.git
3. Compilar el código
go build -o docker-driver
- 83 -
4. Ejecutar el driver con:
./docker-driver -conf config.toml -level DEBUG
3. Ejecutar el driver
./docker-vnfm -conf config.toml
allocate = true
workers = 1
description = "The Vnfm description"
username = "openbaton-manager-user"
password = "adminGredos2018"
logLevel = "INFO"
brokerIp = "localhost"
brokerPort = 5672
d. Instalación OpenBaton
Como se ha mencionado anteriormente, en este apartado se recoge la puesta
en marcha de OpenBaton en su versión contenedorizada.
Los pasos son:
1. Descargar la imagen del repositorio
docker pull openbaton/standalone
- 85 -
Figura 57: inicio sesión OpenBaton
- 86 -
OPENBATON
- 87 -
Figura 61: PoP añadido y funcionando en OpenBaton
Nota: si todo esto está funcionando correctamente, cada vez que se entre en
el PoP de Docker y se pulse sobre refrescar en la consola del VIM driver en ejecución
deben aparecer mensajes de depuración indicando que está recibiendo y
contestando peticiones. Véase la figura 63.
- 88 -
OPENBATON
g. Despliegue de VNF
Una vez se disponga de los paquetes en la plataforma OpenBaton, su creación
es inmediata. Es suficiente con navegar por “NS Descriptors On Board NSD
Compose NSD” para crear y desplegar una VNF. Véase figuras 64 y 65.
- 90 -
OPENBATON
- 91 -
- 92 -
KUBERNETES
D. KUBERNETES
Instalación
Requisitos:
Al menos una máquina con:
o Ubuntu 16.04+
o Debian 9
o CentOS 7
o RHEL 7
o Fedora 25/26 (best-effort)
o HypriotOS v1.0.1+
o Container Linux (comprobado con 1576.4.0)
Al menos 2 GB de RAM por máquina. Puede funcionar con menos,
pero el funcionamiento se verá afectado y ralentizado.
Al menos 2 CPUs por máquina.
Conectividad completa entre las máquinas del clúster.
Deshabilitar el swap en los nodos para conseguir un buen
funcionamiento de kubelet. Los pasos para deshabilitarlo se recogen
en el último apartado de este anexo.
El proceso de instalación aquí recogido es válido en Ubuntu, Debian y
HypriotOS.
Kubernetes es usado como orquestador de Docker, así que será necesario
tener instalado Docker previamente. Las instrucciones de instalación se encuentran
recogidas en el anexo B.
Los pasos son:
1. Actualizar la lista de paquetes
sudo apt-get update
2. Instalar una serie de complementos que nos permitan hacer uso de apt
sobre HTTPS y curl para la transferencia de URL. Es posible que estos
paquetes ya estén instalados
sudo apt-get install apt-transport-https curl
- 93 -
5. Actualizar la lista de paquetes
sudo apt-get update
Manejo
Nociones básicas
A continuación se recogen una serie de comandos de manejo básico de
Kubernetes.
- 94 -
KUBERNETES
- 96 -
KUBERNETES
Clúster Kubernetes
A continuación se recogen los pasos necesarios para la puesta en marcha del
clúster definido en el apartado 4.2.3, formado por los nodos de la tabla 11:
Tabla 11: nodos clúster Kubernetes
Nodo Rol
GREDOS Master
Leon Worker
ubuntu001 Worker
ubuntu002 Worker
ubuntu003 Worker
2. Como sugiere el mensaje obtenido tras ejecutar el comando del primer paso, con
el fin de poder gestionar el clúster sin necesidad de ser el usuario administrador
ejecutar los siguientes comandos:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 97 -
En este punto deben estar en ejecución una serie de pods en el nodo
master, son: etcd (almacenamiento), administración y api (apiserver y
controller), dns, proxy, scheduler (planificador) y el componente de red
instalado en los pasos 3 y 4. Véase figura 66.
5.3. Se crea el recurso haciendo uso del fichero del paso 5.2:
kubectl create -f dashboard-admin.yaml
5.4. Por último es necesario lanzar un proxy en forma de pod que escuche en
nuestra dirección IP y en el puerto 443 y nos permita acceder a la consola
gráfica:
sudo nohup kubectl proxy --address="138.100.49.16" -p 443 -
-accept-hosts='^*$' &
En este punto ya está lista la interfaz gráfica. Aparte de los pods que se
muestran en la figura 65, debe aparecer uno nuevo en ejecución del dashboard.
- 98 -
KUBERNETES
Una vez se han añadido los nodos, se puede comprobar el estado del clúster
con “kubectl get nodes” como se muestra en las figuras 68 y 69.
- 99 -
Figura 68: listado de nodos gráfico Kubernetes
- 100 -
KUBERNETES
…
El fichero, con las dos líneas añadidas, debe guardarse con el nombre
“daemonset-arm.yaml”. Por ejemplo, si se edita con el editor vi y se
desea guardar en “/home/Daniel/daemonset-arm.yaml” el
- 101 -
comando de guardado será “:x /home/Daniel/daemonset-
arm.yaml”
2. Ahora será necesario editar el fichero “daemonset-arm.yaml” con el
fin de adaptarlo a la arquitectura arm. Con el fin de hacer más fácil la
edición del fichero a continuación se plasmará el contenido completo del
mismo, indicando las líneas que se añaden con el carácter ‘’ y las que se
eliminan con el carácter ‘’.
# Please edit the object below. Lines beginning with a '#'
will be ignored,
# and an empty file will abort the edit. If an error occurs
while saving this file will be
# reopened with the relevant failures.
#
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
creationTimestamp: 2018-06-14T18:34:07Z
generation: 1
labels:
k8s-app: kube-proxy
name: kube-proxy
name: kube-proxy-arm
namespace: kube-system
resourceVersion: "339"
selfLink: /apis/.../.../.../
uid: 85bb52a1-7001-11e8-a165-309c23228a8c
spec:
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kube-proxy
template:
metadata:
creationTimestamp: null
labels:
k8s-app: kube-proxy
spec:
containers:
- command:
- /usr/local/bin/kube-proxy
- --config=/var/lib/kube-proxy/config.conf
image: k8s.gcr.io/kube-proxy-amd64:v1.10.4
image: k8s.gcr.io/kube-proxy-arm:v1.10.4
imagePullPolicy: IfNotPresent
name: kube-proxy
resources: {}
securityContext:
privileged: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
- 102 -
KUBERNETES
volumeMounts:
- mountPath: /var/lib/kube-proxy
name: kube-proxy
- mountPath: /run/xtables.lock
name: xtables-lock
- mountPath: /lib/modules
name: lib-modules
readOnly: true
dnsPolicy: ClusterFirst
hostNetwork: true
nodeSelector:
beta.kubernetes.io/arch: amd64
beta.kubernetes.io/arch: arm
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: kube-proxy
serviceAccountName: kube-proxy
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
- effect: NoSchedule
key: node.../uninitialized
value: "true"
volumes:
- configMap:
defaultMode: 420
name: kube-proxy
name: kube-proxy
- hostPath:
path: /run/xtables.lock
type: FileOrCreate
name: xtables-lock
- hostPath:
path: /lib/modules
type: ""
name: lib-modules
templateGeneration: 1
updateStrategy:
rollingUpdate:
maxUnavailable: 1
type: RollingUpdate
status:
currentNumberScheduled: 1
desiredNumberScheduled: 1
numberAvailable: 1
numberMisscheduled: 0
numberReady: 1
observedGeneration: 1
updatedNumberScheduled: 1
- 103 -
3. Por último, es necesario aplicar los cambios establecidos en el fichero con
el comando:
kubectl create -f daemonset-arm.yaml
Una vez se han añadido los nodos, se puede comprobar el estado del
clúster con “kubectl get nodes” como se muestra en la figura 57.
- 104 -
KUBERNETES
Desactivar swap
Uno de los requisitos de Kubernetes es desactivar el swap en todos los nodos.
Antes de comenzar con los pasos de desactivación conviene hacer una pequeña
introducción sobre qué es el swap y qué aporta.
Uno de los componentes hardware de un ordenador es la memoria RAM, una
memoria de acceso aleatorio que permite almacenar los datos y el código máquina
de los programas y procesos en ejecución. Se trata de una memoria volátil y limitada
que permite lectura y escritura de forma generalmente muy rápida.
El swap o espacio de intercambio se utiliza cuando la cantidad de memoria
RAM está llena. Si el sistema operativo necesita más recursos de memoria y la RAM
está ocupada al completo, las páginas de memoria inactivas serán movidas al espacio
de intercambio. Aunque el espacio swap puede ser muy útil para aquellos equipos
que disponen de muy poca memoria RAM, no debe ser considerado como un
reemplazo de la misma ya que el espacio de intercambio reside en los discos duros
y tiene un tiempo de lectura y escritura mucho mayor que el de la memoria RAM.
Tradicionalmente, se considera que el espacio de las particiones de swap debe
ser el doble de la memoria física en aquellos sistemas que tienen hasta 2 GB de RAM,
y el tamaño de la memoria física para aquellos sistemas con más de 2 GB de RAM.
En los sistemas Linux se puede comprobar el espacio de swap asignado y
usado con el comando free.
daniel@GREDOS:~$ free -h
total used free shared buff/cache available
Mem: 31G 7,1G 10G 110M 13G 23G
Swap: 31G 0B 31G
- 105 -
- 106 -
CREACIÓN Y DESPLIEGUE DE UN FIREWALL
en base a tablas.
- 107 -
En la figura 58 se muestra un listado de todas las interfaces de red del firewall
en modo tabla. Si se hace clic en alguna de las filas se mostrará el tráfico que se ha
recibido y enviado por esa interfaz.
Las reglas pueden ser creadas de forma muy sencilla, como se muestra en la
figura 61.
- 109 -
Por último, como se muestra en la figura 62, existe la posibilidad de hacer
nateo de puertos y redireccionar el tráfico.
- 110 -
ARQUITECTURA OPENSTACK
F. ARQUITECTURA OPENSTACK
G. INSTALACIÓN DEVSTACK
A continuación se recogen los pasos de instalación de DevStack, una versión
pensada de OpenStack para desarrolladores que se instala a través de un conjunto
de scripts de forma rápida y sencilla.
Pasos:
1. Crear el usuario stack con el que se instalará y gestionará la plataforma
sudo useradd -s /bin/bash -d /opt/stack -m stack
4. Descargar DevStack
git clone https://git.openstack.org/openstack-
dev/devstack
- 114 -
INSTALACIÓN DEVSTACK
- 115 -