Sie sind auf Seite 1von 55

UNIVERSIDAD MAYOR DE SAN SIMON

FACULTAD DE CIENCIAS Y TECNOLOGIA


DIRECCIÓN DE POSGRADO

CONTENEDORES LINUX Y SU RAPIDA


IMPLEMENTACION EN APLICACIONES WEB

TRABAJO FINAL PRESENTADO PARA OBTENER EL CERTIFICADO


DE DIPLOMADO EXPERTO EN DESARROLLO DE APLICACIONES
EMPRESARIALES VERSIÓN I
.

POSTULANTE : Rudy Salvatierra Rodríguez


TUTOR : Msc. Richard Félix López Fulguera

Cochabamba – Bolivia
2018
Dedicatoria

A mis padres, hermanos, a mi querida

esposa, a mis hijas y a quienes siempre me

apoyaron de manera incondicional para

completar este paso en mi vida.


4
Tabla de Contenido
1. Generalidades……………………………………………………………………………... 11
1.1. Antecedentes Generales...………………………………………………………….…….....….. 12
1.2. Antecedentes Específicos……………………………………………………………................. 10
2. Metodología………………………………………………………………………….......... 14
2.1. Método Bibliográfico……………………………………………………………........................ 14
2.2. Método Analítico……………………………………………………………………………….. 14
2.3. Método Empírico o de campo…………………………………………………………………... 14
3. Marco Teórico…………………………………………………………………………….. 15
3.1. Servicio Web………………………………………………………………………………….... 15
3.2. Escalabilidad…………………………………………………………………………………… 17
3.2.1. Escalabilidad Vertical…..……………………………………………………………….. 17
3.2.2. Escalabilidad Horizontal………………………………………………………………… 18
3.3. Computo en la Nube…………………………………………………………………………….. 19
3.3.1. IaaS (Infraestructura como servicio)…………………………………………………….. 20
3.3.2. PaaS (Plataforma como servicio)………………………………….…………………….. 20
3.3.3. SaaS (Software como servicio)………………………………………………………….. 20
3.4. Administración de la configuración del software………………………………………………. 21
3.4.1. Control de Versiones……………………………………………………………………. 22
3.4.2. Herramientas de Administración de software…………………………………………... 22
3.5. Administración de configuraciones de computo en la nube…………………………………… 23
3.5.1. Hypervisor………………………………………………………………………………. 25
3.5.2. Máquinas Virtuales………………………………………………………..……………. 27
3.5.3. Open Stack………………………………………………………………...……………. 28
3.5.4. Administración de grandes redes………………………………………….……………. 30
3.5.5. Contenedores Linux……………………………………………………….……………. 32
3.5.6. Docker……………………………………………………………………..……………. 33
3.5.7. Apache Mesos……………………………………………………………..……………. 35
3.5.8. Kubernetes……………………………………………………………………………… 37
4. Implementación en el Proyecto………………………………………………………….. 40
4.1. Alcance…………………………………………………………………………………………. 40
4.2. Escenario……………………………………………………………………………………….. 40
4.2.1. Configuración y preparación de ambiente de trabajo …………………………………… 41
5. Conclusiones ……………………………………………………………………………… 53
6. Bibliografía………………………………………………………………………………... 54

5
6
Tabla de Cuadros, Gráficos y Figuras

Figura 1: Estándares de los Servicios Web………………………………………………. 16


Figura 2: Servicios Web en Funcionamiento.……………………………………………. 16
Figura 3: Escalamiento Vertical.…………………………………………………………. 18
Figura 4: Escalamiento Horizontal.……………………………………………………… 18
Figura 5: Arquitectura de Cloud Computing.…………………………………………… 19
Figura 6: Pirámide de tipos de Servicio en la Nube…………………………………….. 20
Figura 7: Pírame de aplicaciones que proveen servicios en la nube…………………… 21
Figura 8: Proceso Check-in, Check out………………………………………………….. 23
Figura 9: Clasificación de nubes...…………………………………………….……...….. 24
Figura 10: Arquitectura de un Hypervisor.………………………………………..……. 25
Figura 11: Arquitectura de Hypervisor Tipo 1………………………………………...... 26
Figura 12: Arquitectura de Hypervisor Tipo 2………………………………………...... 27
Figura 13: Arquitectura de una Máquina Virtual ……………………………………… 28
Figura 14: Arquitectura Open Stack…………..………………………………………… 29
Figura 15: Arquitectura de Red…………………..……………………………………… 31
Figura 16: Arquitectura de un contenedor………………………………………………. 32
Figura 17: Virtualización Vs Contenedores……………………………………………… 33
Figura 18: Arquitectura de Docker……….……………………………………………… 34
Figura 19: Arquitectura y funcionamiento de Docker...………………………………… 34
Figura 20: Arquitectura de Apache Mesos……….……………………………………… 36
Figura 21: Kubernetes integración se servicios.…………………………………………. 37
Figura 22: Arquitectura de Kubernetes………..………………………………………… 38
Figura 23: Arquitectura de kubernetes para implementar...…………………………… 40
Figura 24: Archivo fstab con el punto de montaje del swap comentado.………………. 43
Figura 25: Servicio de docker con su estado en activo y corriendo...…………………… 45
Figura 26: Servicio de kubelet con su estado en activo y corriendo …...…………….. 46
Figura 27: Nodos esclavos enlazados al nodo master..…………………………………... 49
Figura 28: Pods de kubernetes corriendo.…………………...……………………….…. 49
Figura 29: Pods nginx corriendo ……………………………………………….……... 50
Figura 30: Servicio nginx corriendo …………………………………………….……. 51
Figura 31: Servicio nginx corriendo en el nodo slave2………………………….…… 51
Figura 32: Servicio nginx corriendo en el nodo slave2 visualizado en una aplicación web 52

7
8
Resumen

en la actualidad las empresas que ofrecen servicios de desarrollo de aplicaciones web buscan formas más
eficientes y rápidas de poder realizar el despliegue de sus aplicaciones que están en proceso de desarrollo;
para poder revisar, corregir y lanzar al mercado de manera rápida dicho software, por ello los gerentes
comerciales buscan nuevas aplicaciones con características que se puedan implementar de forma más rápida,
por tal motivo los administradores buscan utilizar los recursos de manera eficaz sin descuidar la seguridad
cumpliendo con las normativas y los enfoques mejorados a un menor costo, para ello la colaboración de la
tecnología dio lugar a ciclos de vida de software más rápidos como son los contenedores docker y su
orquestación con kubernetes en sistemas operativos Linux de los cuales la implementación es rápida y a un
menor costo.

Palabras clave: Contenedores Docker y Kubernetes en Linux, arquitectura, diseño, herramientas e

implementación.

9
Introducción

La evolución constante de la tecnología y su demanda cada vez más alta de servicios web que respondan de
manera rápida a los requerimientos de las empresas, la cual crece de forma exponencial; Las formas
tradicionales para desarrollar y desplegar las aplicaciones en muchos casos llegan a ser insuficientes para
cubrir la demanda de clientes que requieren la visualización del software de manera más rápida, así es como
nació la creación de nuevas tecnologías y opciones para el despliegue de aplicaciones web, para ello nació
el concepto de lo que hoy en día llamamos contenedores.
Las plataformas de aplicaciones en contenedores, una nueva categoría de software empresarial, pueden
ayudar a las empresas a obtener beneficios de estos avances. Sin embargo, para aprovechar estas nuevas
tecnologías, debemos tener en cuenta que existen una gran variedad de actividades, equipos y procesos que
en conjunto, conforman una cultura de DevOps.
El objetivo de esta investigación es mostrar lo ventajoso de desplegar servicios a través de contenedores en
Linux, las cuales son tecnologías de virtualización relativamente nuevas. Por tal motivo realizaremos el
despliegue de aplicaciones web en contenedores docker implementados en un sistema operativo Linux.
Al margen de los resultados buscaremos generar una guía para las empresas, instituciones y/o cualquier
entidad que al momento de tomar algún tipo de decisión en la implementación de estas nuevas tecnologías
sea la adecuada al momento de iniciar sus servicio, y con esto evitarse contratiempos como son la pérdida
de tiempo, de recursos, ya sean económicos o alguna migración innecesaria o la adquisición de hardware.

10
1 Generalidades

1.1 Antecedentes Generales

El entorno actual de vida y el avance de la tecnología nos proporcionan una gran variedad de herramientas
tecnológicas que nos permiten mostrar y administrar todo tipo de información, cada una de estas
herramientas permite mostrar, organizar y manejar la información en tiempo real, como también la
herramienta puede ser utilizada y aplicada a diferentes tipos de actividades dentro de entidades u
organizaciones.
El primer antecedente del uso de una técnica para intentar ejecutar un proceso aislado dentro de un sistema
operativo se remonta a 1979 y fue cuando el chroot se introdujo como un concepto en desarrollo para
sistemas Unix que permitía aislar dentro una ruta un proceso y sus hijos de modo que, para ellos, esa ruta
pareciese ser el directorio raíz.
Más adelante en el año fue en 1982, Bill Joy, uno de los arquitectos del Unix de BSD y fundador de Sun
Microsystems, creó la llamada al sistema chroot para auxiliarse en el desarrollo de Unix. Dado que
desarrollaba en la misma computadora donde hacía sus pruebas, quería poder mantener aislado su entorno
de desarrollo y construcción del entorno de pruebas.
En los manuales de sistema es común encontrar advertencias de seguridad chroot no está pensado para
proveer aislamiento, es únicamente conveniencia por lo cual un proceso puede escapar de esta jaula (jail),
además de que su funcionamiento se limita a restringir la vista del sistema de archivos, sin proteger otros
aspectos del sistema como las interfaces de red, la lista de procesos, o el acceso a dispositivos.
En 1991 es utilizado por William Cheswick, un programador e investigador en seguridad de red, para
implementar una honeypot y monitorizar comportamientos maliciosos.
Estas investigaciones iniciales fueron el inicio de los primeros pasos de lo que se acabaría consolidando
como virtualización de sistemas con la aparición de hypervisores, el cual es un software que permite la
ejecución virtual de sistemas completos emulando tanto el hardware como el sistema operativo, luego de
ello partiendo de la idea de chroot aparece el concepto de contenedor, el cual extiende la forma de conseguir
ejecutar entornos aislados del sistema, el cual no es lo mismo que virtualizar el sistema operativo sino que
está manteniendo en un espacio aislado (namespace) los procesos y ficheros necesarios mientras se reutiliza
el kernel del sistema anfitrión .
El primer sistema operativo en ofrecer lo que hoy conocemos como contenedores (bajo el nombre de jaulas)
fue la versión 4 de FreeBSD, liberada en el año 2000. Poco después, esta funcionalidad apareció en Solaris,
Linux e incluso para Windows; en los dos últimos casos, esto fue inicialmente mediante productos de
terceros (Parallels Virtuozzo Containers para Windows, Vserver y OpenVZ para Linux, OpenVZ siendo

11
una rama libre de Virtuozzo). Varios años después de la introducción de esta funcionalidad por medio de
terceros, tanto en el caso de Linux (con LXC desde 2009).
Linux con LXC (Linux Containers) provee soporte al kernel para los namespaces. Los namespaces
constituyen el elemento base de los contendores y es una funcionalidad del kernel que proporcionan
facilidades para crear una abstracción del sistema de modo que, todo lo que sucede fuera del espacio del
contenedor sea invisible al interior.
En los últimos años, los contenedores se han vuelto populares porque ya no tienen únicamente como una
herramienta del administrador un sistemas particiones, lógicamente la carga de trabajo de servidores provee
una infraestructura de cómputo con acceso privilegiado a distintos usuarios manteniendo no solo las
garantías de seguridad, sino también como mecanismo de distribución de software, instalado y
preconfigurado.
Por tal motivo la tecnología de contenedores es una muy buena herramienta con la que contamos en la
actualidad, el cual ha cambiado de raíz la manera en que se despliegan los servicios.

1.2 Antecedentes Específicos

Con la aparición de la tecnología de contenedores hacen que de forma muy rápida, cada vez combinan más
tecnologías para hacer que este enfoque aislado sea una realidad. Los grupos de control (cgroups) son una
función del kernel que controla y limita el uso de recursos para un proceso o grupo de procesos. Además,
los cgroups utilizan systemd, un sistema de inicialización que configura el espacio de usuario y gestiona
sus procesos, para proporcionar un mayor control de estos procesos aislados. Ambas tecnologías, que
añaden más control a Linux, también fueron el marco para determinar si los entornos fueron exitosos al
permanecer separados.
Los avances realizados con los espacios de nombres (namespaces) proporcionaron el próximo paso para la
aparición de los hoy llamados contenedores. Los espacios de nombres de usuarios "permiten asignaciones
por espacio de nombre de usuario y grupos de id. En el contexto de los contenedores, esto significa que los
usuarios y los grupos pueden tener privilegios para ciertas operaciones dentro del contenedor sin tener esos
privilegios fuera del contenedor". Esto es similar al concepto de una jaula (jail), pero con la seguridad
agregada de mayor aislamiento de los procesos, en lugar del concepto de jaula de un entorno modificado.

El año 2009 con la aparición del proyecto de contenedores de Linux (LXC) se añadió algunas de las
herramientas, plantillas, bibliotecas y enlaces entre lenguajes necesarios para estos avances, lo que mejora
la experiencia del usuario al usar contenedores.
Por regla general, en los sistemas Linux, la virtualización a nivel del sistema operativo se basa en una
implementación ampliada de mecanismos Chroot nativos. A esto se añade que contenedores como Docker,
12
rkt, LXC, LXD, Linux-VServer, OpenVZ/Virtuozzo y runC utilizan funcionalidades del núcleo de Linux
(Kernel) con el fin de gestionar los recursos para implementar entornos de ejecución aislados para
aplicaciones o para un sistema operativo completo.

13
2 Metodología

Para el presente proyecto de investigación se utilizarán los siguientes métodos de investigación:

a) Método Bibliográfico, debido a que se realizará la lectura y compilación de libros relacionados al


tema de estudio.
b) Método Analítico, debido a que se procederá a revisar y analizar ordenadamente documentos
relacionados al tema de estudio, para la redacción del Plan de Emergencia.
c) Método Empírico o de campo, debido a que se utilizaran ejemplos de la aplicación observadas en el
caso de estudio para la creación e implementación de los servicios de contenedores.

14
3 Marco Teórico

3.1 Servicio Web


Podemos definir un servicio web como un sistema de software diseñado para admitir la interacción
interoperable de máquina a máquina a través de una red. Tiene una interfaz descrita en un formato
procesable por máquina (específicamente WSDL). Otros sistemas interactúan con el servicio web de una
manera prescripta por su descripción utilizando mensajes SOAP, normalmente transmitidos utilizando
HTTP con una serialización XML junto con otros estándares relacionados con la web. [1]. En otras palabras,
podemos decir que los servicios web son un conjunto de aplicaciones o tecnologías que se encuentran
conectadas entre sí dentro de la web, en donde los llamados proveedores ofrecen sus servicios como
proveedores remotos y los usuarios solicitan un servicio llamando a estos usuarios.
También existen muchas definiciones respecto a que es un servicio web ya que cada compañía involucrada
en el desarrollo de infraestructura de un servicio web da su propia definición.
Desde un punto de vista general, un servicio web es una componente de software independiente de
plataforma e implementación, que lleva a cabo un servicio concreto y que puede integrarse con otros
servicios web para dar un servicio diferente.
Esta componente de software podrá ser:
a) Descrita usando un lenguaje de descripción de servicio.
b) Publicada en un registro de servicios.
c) Descubierta a través de un mecanismo estándar.
d) Invocada a través de un API declarado (usualmente sobre una red).
e) Compuesta con otros servicios.

El concepto de servicio web se apoya en los estándares HTML y XML. El desarrollador puede crear
programas accesibles desde cualquier dispositivo que soporte estos estándares, aprovechando la
conectividad de Internet. Se pueden crear servicios accesibles desde Internet que realmente proporcionen
una utilidad real [2].
En resumen también podemos definir a un servicio Web XML como un servicio de software expuesto
en la Web mediante SOAP, descrito con un archivo WSDL y registrado en UDDI [3], en la Figura 1
podemos ver los estándares y definición de un servicio web .

15
Figura 1: Estándares de los Servicios Web
(Fuente: users.dsic.upv.es/asignaturas/facultad/lsi/trabajos/272002.doc, 2002)

En la Figura 2 se puede observar cómo interactúa un conjunto de Servicios Web:

Figura 2: Servicios Web en Funcionamiento


(Fuente: Elaboración propia)

Según la Figura 2, un usuario (cliente del servicio Web), a través de una aplicación, solicita información
sobre un viaje que desea realizar haciendo una petición a una agencia de viajes que ofrece sus servicios a
través de Internet; Luego la agencia de viajes ofrecerá al cliente (usuario) la información requerida, para

16
proporcionar al cliente la información que necesita, esta agencia de viajes solicita a su vez información a
otros recursos (otros Servicios Web), como ser hotel y línea aérea. Después de hacer las consultas la agencia
de viajes obtiene la información de estos recursos, lo que la convierte a su vez en cliente de esos otros
Servicios Web que le van a proporcionar la información solicitada sobre el hotel y la línea aérea.
Por último, el usuario realizará el pago del viaje a través de la agencia de viajes que servirá de intermediario
entre el usuario y el servicio Web que gestionará.

3.2 Escalabilidad

La escalabilidad es la capacidad de un sistema informático para adaptarse a las necesidades de rendimiento


a medida que el número de usuarios crece, las transacciones aumentan y la base de datos empieza a sufrir
degradamiento del performance por las cargas crecientes [4], también podemos entender como la habilidad
de poder adaptarse a los cambios manteniendo siempre la mejor calidad en los servicios ofrecidos [5].

Al momento de implementar escalabilidad podrían existir muchas formas de hacer que el software sea

escalable ya que podemos combinar técnicas de software y hardware e incluso arquitecturas de RED, pero

los más utilizados son la escalabilidad horizontal y vertical, esto sin duda es una de las características más

importantes para los sistemas de alta demanda o uso crítico.

3.2.1 Escalabilidad Vertical

Es definido como incrementar los recursos del servidor o uno de un nodo, es decir aumentar el hardware
por uno más potente tal como se muestra en la Figura 3, podríamos realizar el cambio del disco duro,
memoria, procesador, etc. Pero también puede ser la migración completa del hardware por uno más potente.
El esfuerzo de este crecimiento es mínimo, pues no tiene repercusiones en el software, ya que solo será
respaldar y migrar los sistemas al nuevo hardware.
Si bien esta metodología parece ser la más conveniente, recordar está ligado al Hardware por tal motivo
llega un punto en el que los recursos ya no pueden aumentarse por ser ya obsoletos.

17
Figura 3: Escalamiento Vertical
(Fuente: https://www.oscarblancarteblog.com/2017/03/07/escalabilidad-horizontal-y-vertical)

3.2.2 Escalabilidad Horizontal

Es definido como agregar más servers o nodos al sistema para que el rendimiento de éste mejore. En la
Figura 4 se puede apreciar que se añadió 2 nuevos servers (nodos) al cluster, a un sistema que balancee la
carga entre la antigua y la nueva puede mejorar el rendimiento de todo el sistema.

El escalamiento horizontal es sin duda la más potente, pero también el más complicado. Este modelo implica
tener varios servidores (conocidos como Nodos) trabajando como un todo. Se crea una red de servidores
conocida como Clúster, con la finalidad de repartirse el trabajo entre todos nodos, cuando el performance
este se ve afectada con el incremento de usuarios, se añaden nuevos nodos al clúster o, según demanda.

Figura 4: Escalamiento Horizontal


(Fuente: https://www.oscarblancarteblog.com/2017/03/07/escalabilidad-horizontal-y-vertical)

18
3.3 Computo en la Nube

La computación en la nube es un término general que viene de la provisión de servicios de hospedaje a


través de Internet [6]. La nube no es un lugar, sino un método de gestión de recursos de TI que reemplaza
las máquinas locales y los centros de datos privados con infraestructura virtual [7]. En este modelo, los
usuarios acceden a los recursos virtuales de computación, red y almacenamiento que están disponibles en
línea a través de un proveedor remoto. Estos recursos se pueden aprovisionar de manera instantánea, lo que
es particularmente útil para las empresas que necesitan escalar verticalmente su infraestructura o reducirla
rápidamente en respuesta a una demanda fluctuante.
Podemos resumir definiendo a la nube como la entrega de recursos de TI virtualizados a través de Internet
así como se ve en la Figura 5, que dichos recursos son servicios entregados bajo demanda, a través de una
plataforma de servicios en la nube.

Figura 5: Arquitectura de Cloud Computing


(Fuente: http://www.tecnoent.com/878-cloud-computing-computacion-n-nube, 2015)

Estos servicios se dividen en tres grandes categorías como ser: Infraestructura como servicio (IaaS),
plataforma como servicio (PaaS) y software como servicio (SaaS) como se ve en la Figura 6. El nombre de
computación en la nube fue inspirado por el símbolo de nube que se utiliza a menudo para representar a
Internet en imágenes y diagramas de flujos.

19
Figura 6: Pirámide de tipos de Servicio en la Nube
(Fuente: https://openwebinars.net/blog/cloud-computing-tutorial-conceptos-basicos, 2014)

3.3.1 IaaS (Infraestructura como servicio)

Este tipo de servicio brinda a los usuarios acceso a conceptos básicos de infraestructura tales como espacio
en servidor, almacenamiento de datos y redes, que pueden aprovisionarse a través de una API. Por eso se
dice que es lo más parecido a la replicación de la funcionalidad de un centro de datos tradicional en un
entorno hospedado, en la figura 7 podemos ver que en IaaS entre los proveedores de este tipo de servicio
están Amazon Webservices y Rockspace.

3.3.2 PaaS (Plataforma como servicio)

Este tipo de servicio brinda un entorno de desarrollo completo, eliminando la necesidad de que los
desarrolladores se ocupen directamente de la capa de infraestructura al implementar o actualizar
aplicaciones, en la figura 7 podemos ver que en PaaS entre los proveedores de este tipo de servicio están
Microsoft Azure y Cloudbee.

3.3.3 SaaS (software como servicio )

Este tipo de servicio está diseñadas para usuarios finales, y mantienen detrás de escena todo el desarrollo y
el aprovisionamiento de infraestructura. Entre algunas funcionalidades están desde aplicaciones
empresariales, como programas de procesamiento de texto y hojas de cálculo, hasta CRM, conjuntos de
edición de fotografías y plataformas de hospedaje de vídeos, en la Figura 7 podemos ver que en SaaS entre
los proveedores de este tipo de servicio esta Mailchimp y SalesForce.

20
Figura 7: Pírame de aplicaciones que proveen servicios en la nube
(Fuente: http://yelom.myphonecompany.co/saas-paas-iaas)

3.4 Administración de la configuración de software

Es definido como el proceso de controlar y supervisar el cambio de los servicios de software [8], una vez
que se haya definido la línea base, la administración de la configuración de software minimiza los riesgos
asociados con los cambios definiendo un proceso formal de aprobación y seguimiento de los cambios; Por
ejemplo podemos referirnos a la configuración de una máquina, el cómo hacer funcionar cierto software en
alguna computadora, o modificar ciertos parámetros del sistema operativo.
La administración y configuración de software podemos dividirla en 2 partes como son:

a) Elemento de configuración de Software (ESC)

Es la información creada como parte del proceso de ingeniería de software, el cual es un componente
simple que es una unidad en sí mismo, el cual puede definirse y controlarse de forma separada,
volviéndose en un estado estable en el proceso de desarrollo y por tanto se inserta dentro del control de
configuración [9].

b) Gestión de configuración de software (GSC)

Es la integridad de un producto de software que depende de la acción combinada de tres tipos de


disciplinas: desarrollo, gestión y control. Dentro de la disciplina de control se encuentra la GCS, cuyo
objetivo es mantener la integridad de los componentes del producto software, evaluar y controlar los
cambios sobre ellos, y facilitar la visibilidad del producto. La meta es maximizar la productividad
minimizando los errores [9].

21
3.4.1 Control de Versiones

En el desarrollo de proyectos pequeños, es común pensar que se puede tener el control sobre todos los
productos, sin necesidad de llevar un control de versiones. Sin embargo, la realidad es que los sistemas son
cada vez más complejos, y con mayor número de componentes que interactúan entre sí. Si no tenemos un
control de versiones adecuado, no podemos saber cuáles son los productos modificados en cierto punto y
cuáles son las últimas versiones, lo cual puede provocar que trabajemos utilizando versiones inadecuadas,
generando así un doble trabajo.
La administración de la configuración nos provee de un nivel de servicio, control y soporte para la
organización o para el equipo de trabajo los cuales están definidos de la siguiente manera.

a) Servicio

Es un servicio que se ofrece a aquellos que están relacionados con el desarrollo de software para dar
soporte a las personas y la información que se deba de controlar dentro de un proyecto.

b) Control

Es donde se llevan a cabo actividades de control sobre los productos de trabajo: información,
documentos, especificaciones, versiones, requerimientos, herramientas. Es decir, sobre todo los
artefactos que se vayan necesitando para realizar y administrar el desarrollo del software.

c) Soporte

Este ayuda a los desarrolladores, ingenieros y a las personas que están relacionadas con el ciclo de

desarrollo de software en la administración de sus productos de trabajo.

3.4.2 Herramientas de administración de software

Existen diversas herramientas de administración software que facilitan y automatizan la administración de


la configuración, donde se pueden ver: el estado de los productos, ya sea check-in (proceso de revisión,
aprobación y estado en un ambiente controlado) o check-out (proceso para modificación de productos y
autorización previa de los productos antes de ser implantados); en la Figura 8 podemos ver el flujo del
proceso de control de cambios de los que es de check-in y check-out , en esta fase del ciclo de vida del
desarrollo del software se encuentran e interpretan de manera más fácil la nomenclatura que se está
utilizando.

22
Figura 8: Proceso Check-in, Check out
(Fuente: https://sg.com.mx/content/view/412, 2012)

a) CMMI

En el modelo de CMMI, podemos encontrar a la administración de la configuración como un área de


proceso, donde su propósito es el establecer y mantener la integridad de los productos de trabajo
mediante la identificación, control, reporte y auditoria a la configuración. Donde se establecen las
líneas base (son las especificaciones o productos desde los cuales se partirá como base del ciclo de
desarrollo), se rastrean y controlan los cambios y se establece la integridad de los productos de software
[10].

3.5 Administración de configuraciones de computo en la nube

Cuando las empresas optan por migrar a la computación en nube, la administración de la configuración no
desaparece. De hecho, la gestión de la configuración se vuelve más importante en la nube, especialmente
cuando una organización utiliza varios proveedores de nube y esto porque ayuda a rastrear y controlar los
cambios en el software.
Por ello el modelo de computación en la nube puede tener diferentes configuraciones, según el tipo
de equipos que utilice, según los servicios de información que se desean incluir y según la ubicación
física del centro de datos. En la Figura 9 podemos ver las clasificaciones más comunes para estas
configuraciones como son nubes públicas, nubes privadas y nubes híbridas [11] [12]

23
Figura 9: Clasificación de nubes
(Fuente: https://aula128.wordpress.com/2014/03/29/computacion-en-la-nube-cloud-
computing/, 2012)

a) Nubes públicas

En este tipo de configuración, la totalidad de servicios es manejado por terceros, los cuales son
dueños o administradores de los centros de datos, donde los servidores, los sistemas de
almacenamiento y en general toda la infraestructura de cómputo es compartida entre los diferentes
clientes.
b) Nubes privadas

En este tipo de configuración, la infraestructura es propiedad del cliente y este es quien maneja y
controla todas las aplicaciones y los servicios. La configuración en la nube privada proporciona los
mismos beneficios que la nube pública, pero reduce los riesgos de seguridad y amenazas, debido
a que los servidores, aplicaciones y datos, se almacenan en la red propia de una
organización. Esto se logra en un entorno virtual, de gestión centralizada, donde un gran equipo físico
puede virtualizar todos los demás servidores que una organización necesita.

24
c) Nubes hibridas

Son las que combinan las configuraciones de los modelos de nube pública y privada, es decir,
se es propietario de una parte y se comparte otra. Es decir que las nubes híbridas combinan recursos
locales de una nube privada con la nube pública. La infraestructura privada se ve aumentada con los
servicios de computación en nube de la infraestructura pública; esto permite a una empresa mantener
el control de sus principales aplicaciones y aprovechar la computación en nube publica solamente
cuando resulte necesario.

3.5.1 Hypervisor

Está definido como un proceso que separa el sistema operativo de un ordenador y las aplicaciones del
hardware físico lógico [13], lo cual hace que la máquina física opere múltiples máquinas virtuales como
invitados para ayudar a maximizar el uso efectivo de los recursos informáticos, como la memoria, el ancho
de banda de la red y los ciclos de la CPU.
También son llamados monitor de máquina virtual (VMM), es el núcleo central de algunas de las tecnologías
de virtualización de hardware más populares y eficaces, entre las cuales se encuentran las de Microsoft:
Microsoft Virtual PC, Windows Virtual PC, Microsoft Windows Server e Hyper-V [14].
En la figura 10 podemos ver la Arquitectura de un Hypervisor en la cual se define como en el primer nivel
el Hardware Físico, en un segundo nivel el Hypervisor, en tercer nivel las particiones en las que se
almacenaran los sistemas operativos, las aplicaciones y servicios en un último nivel.

Figura 10: Arquitectura de un Hypervisor


(Fuente: Elaboración propia)

25
Existen tres tipos principales de hypervisores: son Hypervisor tipo 1, Hypervisor tipo 2 y Hypervisor
hibrido.

a) Hypervisor Tipo 1

También llamados nativos, en ellos el hypervisor se ejecuta directamente sobre el hardware físico; el
hypervisor se carga antes que ninguno de los sistemas operativos invitados, y todos los accesos directos
a hardware son controlados por él así como se ve en la Figura 11.
Los hypervisores modernos incluyen Xen, Oracle VM Server para SPARC, Oracle VM Server para
x86, Microsoft Hyper-V y VMware ESX / ESXi.

Figura 11: Arquitectura de Hypervisor Tipo 1


(Fuente: http://www.zeppelinux.es/conceptos-basicos-sobre-maquinas-virtuales, 2017)

b) Hypervisor Tipo 2

También llamados hosted, en ellos el hipervisor se ejecuta en el contexto de un sistema operativo


completo, que se carga antes que el hipervisor. Las máquinas virtuales se ejecutan en un tercer nivel,
por encima del hipervisor. En la Figura 12 podemos ver la arquitectura de un hypervisor tipo 2 en la
que primero está el hardware físico, luego viene el sistema operativos y como aplicación recién se
encuentra el hypervisor, dentro del hypervisor se puede definir el hardware virtual, luego los sistemas
operativos. Entre los ejemplos de software de virtualización de tipo 2 tenemos a VMware Workstation,
VMware Player, Virtual Box y Parallels Desktop para Mac.

26
Figura 12: Arquitectura de Hypervisor Tipo 2
(Fuente: http://www.zeppelinux.es/conceptos-basicos-sobre-maquinas-virtuales, 2017)

3.5.2 Máquinas Virtuales

Es definida como un contenedor de software perfectamente aislado que puede ejecutar sus propios sistemas
operativos y aplicaciones como si fuera, exactamente igual que lo hace un computador físico y contiene sus
propios CPU, RAM, disco duro y tarjetas de interfaz de red virtuales [15], en la Figura 13 podemos apreciar
la arquitectura de una máquina virtual según la definición ya mencionada.
Este tipo de software empieza al ver la necesidad de contar con entornos para poder realizar pruebas de
programas o configuraciones, el problema radica en que corremos el riesgo de al realizar un mala
configuración podamos dejar en mal funcionamiento el sistema operativo provocando así la caída de este.
Una solución fue utilizar otro equipo, pero tanto el tiempo que llevaría levantar el entorno en otro equipo
con la configuración deseada como la inversión que representa el hacerse de otro equipo con las
características deseadas se tornan bastante costosas. Por ello apareció la siguiente solución, y fue la más
eficiente, que fue el de tener una herramienta o sistema que simule el funcionamiento de uno o varios
sistemas operativos dentro de un sistema operativo principal, siempre manteniendo independiente el entorno
anfitrión de los entornos virtuales, ósea, máquinas virtuales.

27
Figura 13: Arquitectura de una Máquina Virtual (Fuente:
https://redesencomputador.blogspot.com/2015/04/tutoria-en-fundamentos-de-virtualizacion.html, 2015)

3.5.3 Openstack

OpenStack una iniciativa de infraestructura de código abierto como servicio (IaaS) para la creación y gestión
de grandes grupos de servidores privados virtuales en un centro de datos [16].
También podríamos definir a OpenStack como una plataforma que combina el open source (denominadas
proyectos) que utilizan conjuntos de recursos virtuales para crear y gestionar nubes privadas y públicas. Seis
de estos proyectos gestionan los servicios principales del cloud computing también las conexiones en red,
el almacenamiento, la identidad y los servicios de imágenes [17].
En la Figura 14 podemos apreciar la arquitectura de openstack donde se diferencia todos los componentes
de un Open Stack en donde se muestra cómo es la interacción.

28
Figura 14: Arquitectura Open Stack
(Fuente: https://laboratoriosvirtuales.files.wordpress.com/2011/12/arquitectura_openstack.png)

Los objetivos de la iniciativa OpenStack son soportar la interoperabilidad entre los servicios en la nube y
permitirá a las empresas construir servicios en la nube tipo Amazon en sus propios centros de datos.
OpenStack, que está disponible gratuitamente bajo la licencia Apache 2.0, se refiere a menudo en los medios
de comunicación como "el Linux de la nube" y se compara con Eucalyptus y el proyecto Apache
CloudStack, otras dos iniciativas de nube de código abierto.
OpenStack tiene una arquitectura modular que cuenta actualmente con once componentes como se muestra
en la Figura 14, a continuación los definiremos:
a) Nova
Este componente proporciona máquinas virtuales según demanda.
b) Swift
Este componente proporciona un sistema de almacenamiento escalable que soporta almacenamiento de
objetos.

29
c) Cinder
Este componente proporciona almacenamiento de bloques persistente para alojamiento de máquinas
virtuales.
d) Glance
Este componente ofrece un catálogo y repositorio de imágenes de disco virtuales.
e) Keystone
Es componente proporciona autenticación y autorización de todos los servicios de OpenStack.
f) Horizon
Este componente proporciona una interfaz modular basada en la web de usuario (UI).
g) Neutron
Este componente proporciona conectividad de red como servicio entre dispositivos de interfaz que
gestionan los servicios de OpenStack.
h) Ceilometer
Este componente proporciona un único punto de contacto para los sistemas de facturación.
i) Heat
Este componente proporciona servicios de orquestación para múltiples aplicaciones en la nube de
material compuesto.
j) Trove
Este componente proporciona aprovisionamiento de base de datos como servicio para los motores de
bases de datos relacionales y no relacionales.
k) Sahara
Este componente ofrece servicios de procesamiento de datos para los recursos gestionados por
OpenStack.

3.5.4 Administración de grandes redes

Cuando hablamos de la administración de redes informáticas podemos definir como las diversas tareas que
desarrollan los profesionales de tecnologías de información en una red informática con el objetivo de brindar
de forma eficiente numerosos servicios de red, garantizando la disponibilidad y la calidad de dicho servicio
[18]. En la administración se involucra personas, software y hardware. Las personas involucradas son los
profesionales de tecnologías de información que garantizan el servicio utilizando herramientas de gestión
de redes, como ser software que sirve para realizar las tareas de administración del hardware que se
relaciona con los dispositivos de red.
Entre las funciones de la administración de redes podemos identificar algunas funciones como son los
siguientes:
30
a) Diseño, modificación y ampliación de la red.
b) Configuración de sistemas operativos y aplicaciones.
c) Configuración de dispositivos del usuario final, de redes y los servidores.
d) Garantizar el uso eficiente de los recursos y la seguridad de la red.
e) Garantizar la disponibilidad, la integridad y la confiabilidad de la información.
f) Proporcionar servicio de soporte técnico, solucionar problemas de la red.

En la Figura 15 podemos observar la arquitectura de red en la que se muestra la interacción de los equipos
de red, entre los cuales existen equipos que proveen servicios, equipos de comunicación, equipos de
seguridad y equipos clientes, los cuales son administrados por un equipo administrador de la red que se
encuentra en el sector IT de tecnologías de información.

Figura 15: Arquitectura de Red


(Fuente: https://govnpt.com/wp-content/uploads/2017/10/gioi-thieu-mang-cuc-bo-va-mang-dien-rong-4-
768x576.jpg, 2017)

31
3.5.5 Contenedores en Linux

Los contenedores son tecnologías que permiten empaquetar y aislar aplicación con todo su entorno de
tiempo de ejecución en los que están incluidos los archivos necesarios para ejecutarse, por ello es posible
mover dichas aplicaciones contenidas a otros entornos (desarrollo, prueba, producción, etc.), conservando
toda su funcionalidad [19].
También podemos decir que es una nueva forma de virtualización. A diferencia de las máquinas virtuales,
los contenedores comparten los mismos recursos del sistema operativo host, por lo que no necesita tener su
propio sistema operativo. Los contenedores se despliegan encima el sistema operativo de un servidor host,
así como se muestra en la Figura 16.

Figura 16: Arquitectura de un contenedor


(Fuente: https://www.redhat.com/es/topics/containers/whats-a-linux-container)

En la Figura 17 podemos ver la diferencia entre una máquina virtual y un contenedor en el que se observa
que un contenedor comparte el kernel del sistema operativo anfitrión y con ello sus archivos binarios e
incluidos sus bibliotecas. Si bien los contenedores comparten el sistema operativo host, cada uno tendrá su
propio sistema de archivos e interfaces de red, por ello cada contenedor también tendrá su propia capa de
red y procesos. Mientras que la virtualización permite que varios sistemas operativos se ejecuten
simultáneamente en un solo sistema, lo cual significa que múltiples sistemas operativos estén ejecutándose
en un hypervisor el cual ya se definió anteriormente.

32
Figura 17: Virtualización Vs Contenedores
(Fuente: https://www.redhat.com/es/topics/containers/whats-a-linux-container)

Por las diferencias mencionadas podemos definir que los contenedores son más ligeros que la virtualización,
por tal motivo si se cuenta con recursos limitados podemos implementar la tecnología de contenedores.
Los contenedores permiten al administrador tener los medios para escalar vertical y horizontalmente.
Entre las ventajas de los contenedores podemos remarcas las siguientes: Los contenedores son ligeros, fácil
de iniciar, por eso se los realiza en unos minutos, se realiza menos mantenimiento del sistema operativo y
es más eficiente.
En cuanto a su desventaja, la más clara es que no podemos ejecutar un contenedor con un sistema operativo
específico.
Entre los contenedores más conocidos tenemos a los siguientes contenedores como ser: el más utilizado a
Docker, como el mayor competidor de docker a Rkt (rocket), también tenemos a LXC (Linux Containers),
LXD de canonical, Linux V-server y OpenVZ-Virtuozzo7, etc.

3.5.6 Docker

Docker es una plataforma abierta para desarrollar, enviar y ejecutar aplicaciones dentro de contenedores. El
cual nos permite crear contenedores ligeros y portables que puedan ejecutarse en cualquier máquina que
tenga instalado Docker, independientemente del sistema operativo que la albergue, facilitando también los
despliegues [20].
En la Figura 18 podemos observar la arquitectura de docker en la que se muestra que docker se implementa
sobre un sistema operativo y que docker alberga un conjunto de aplicaciones con sus librerías y procesos.

33
Figura 18: Arquitectura de Docker
(Fuente: https://www.redhat.com/es/topics/containers/what-is-docker)

En un comienzo, la tecnología Docker se desarrolló sobre la base de la tecnología LXC (Linux Containers),
por tal motivo muchas personas asocian a los contenedores de Linux. La tecnología Docker es un servicio
que ejecuta contenedores, como también facilita el proceso de crear y desarrollar contenedores, enviar y
versionar imágenes (entre otras cosas).
Las herramientas de docker, ofrecen un modelo de implementación basado en imágenes. Los cuales
permiten desplegar en contenedores para poder compartir una aplicación o un conjunto de servicios, con
todas sus dependencias en varios entornos. También automatiza la implementación de la aplicación (o
conjuntos combinados de procesos que conforman una aplicación) dentro del entorno del contenedor así
como se ve en la Figura 19.

Figura 19: Arquitectura y funcionamiento de Docker


(Fuente: https://jsitech1.gitbooks.io/meet-docker/content/arquitectura_de_docker.html)

34
En la Figura 19 se observa que docker usa una arquitectura cliente-servidor. En la que el cliente de Docker
habla con el daemon de Docker que hace el trabajo de crear, correr y distribuir los contenedores. Tanto el
cliente como el Daemon pueden ejecutarse en el mismo Sistema, o puede conectar un cliente remoto a un
daemon de docker mediante su interfaz que acepta comandos de usuario.
Para entender cómo funciona docker internamente vamos a conocer tres componentes.

a) Imágenes de Docker (Docker Images)

Las imágenes de Docker son plantillas de solo lectura, es decir, una imagen puede contener el Sistema
operativo Ubuntu con apache instalado, pero esto solo nos permitirá crear los contenedores basados en
esta configuración. Si hacemos cambios en el contenedor ya lanzado, al detenerlo esto no se verá
reflejado en la imagen.

b) Registros de Docker (Docker Registries)

Los registros de Docker guardan las imágenes, estos son repos públicos o privados donde podemos subir
o descargar imágenes. El registro público lo provee el Hub de Docker que sirve una colección de
imágenes para nuestro uso. Los registros de dockers básicamente son el componente de Distribución de
Docker.

c) Contenedores Docker (Docker Containers)

El contenedor de docker aloja todo lo necesario para ejecutar una aplicación. Cada contenedor es creado
de una imagen de docker. Cada contenedor es una plataforma aislada.

3.5.7 Apache Mesos

Es un sistema de gestión de clúster open-source cuya finalidad es la asignación y control de recursos de un


grupo de máquinas. Pero no podemos confundir con un sistema GRD que permite distribuir la carga de un
proceso contra varios nodos [21].
Lo que hace Mesos es administrar todos los recursos (CPU, memoria, almacenamiento, etc.) de las máquinas
que están en un datacenter para habilitar sistemas distribuidos, elásticos y tolerantes a fallos, de modo que
reduzcan los gastos de operación [21].
También podemos decir que Mesos está construido usando los mismos principios que el kernel de Linux,
solo que en un nivel diferente de abstracción. El Mesos Kernel se ejecuta en todas las máquinas y

35
proporciona aplicaciones (por ejemplo, Hadoop, Spark, Kafka, Elasticsearch) con API para gestión de
recursos y programación en todo el centro de datos y entornos de nube.
En la figura 20 podemos observar la estructura básica para tener un cluster de mesos, donde tendremos: Tres
Mesos master, uno en activo y dos en Standby, Tres Zookeepers, Tres Mesos Slave.

Figura 20: Arquitectura de Apache Mesos


(Fuente: https://maauso.com/category/entrada/apache-mesos)

Se explicara cual es la función de los componentes que están en la Arquitectura básica de apache mesos que
se muestra en la figura 20.

a) Nodos masters
Dentro de un cluster de Mesos tendremos los nodos Master, de todos los que podamos tener solo uno
será el que este en activo, los demás estarán en una posición pasiva, a la espera de que el nodo activo
pueda fallar y entonces asumir el role de master activo, este flujo de trabajo se realiza a través de
zookeeper, que es el punto de unión de los nodos Master, a través del cual todos saben el estado del
resto de nodos master.

b) Nodos slaves
Los nodos slaves son los encargados de correr las tareas de los Frameworks, estos reportan su estado
directamente al nodo master activo, ya que saben cuál es a través de zookeeper.

36
c) Frameworks
Los Frameworks son instalados en los nodos master, y a través de ellos trabajaremos con los recursos
de los slaves.

3.5.8 Kubernetes

Es definido como una plataforma de código abierto muy útil que sirve para automatizar el despliegue, la
escala y las operaciones en las aplicaciones de contenedores proporcionando una infraestructura centralizada
de los contenedores y sus aplicaciones [23]
Al momento de implementar varios contenedores docker debemos pensar en varios hosts de servidores,
para ello Kubernetes le ofrece las capacidades de orquestación y gestión que se necesitan para implementar
contenedores a escala para estas cargas de trabajo. La orquestación de Kubernetes le permite crear servicios
de aplicaciones que abarcan varios contenedores, programar esos contenedores en un clúster, escalarlos y
administrar el estado de esos contenedores en el tiempo.
Kubernetes también debe integrarse a las conexiones en red, el almacenamiento, la seguridad, la telemetría
y otros servicios para proporcionar una infraestructura completa de contenedores. Así como se muestra en
la figura 21.

Figura 21: Kubernetes integración se servicios


(Fuente: https://www.redhat.com/es/topics/containers/what-is-kubernetes)

37
En otras palabras, puede crear un clúster de grupos de hosts que ejecutan contenedores de Linux, y
Kubernetes lo ayuda a administrar con facilidad y eficacia esos clústeres. Estos clústeres pueden comprender
hosts en nubes públicas, privadas o híbridas [24].
Kubernetes fue desarrollado y diseñado originalmente por ingenieros de Google, Google reconoció el
potencial de la imagen de Docker desde el principio y trató de ofrecer la organización de contenedor "as-a-
service" en Google Cloud Platform. Google tenía una gran experiencia con los contenedores (introdujeron
cgroups en Linux) pero los contenedores internos existentes y las herramientas de computación distribuida
como Borg estaban directamente acopladas a su infraestructura. Entonces, en lugar de usar cualquier código
de sus sistemas existentes, Google diseñó Kubernetes desde cero para organizar los contenedores Docker.
Kubernetes fue lanzado en febrero de 2015 [25].

Figura 22: Arquitectura de Kubernetes


(Fuente: https://mesosphere.com/blog/docker-vs-kubernetes-vs-apache-mesos)

En la figura 22 podemos observar cómo funciona los Kubernetes el cual se ejecuta al principio de un sistema
operativo e interactúa con pods de contenedores que se ejecutan en los nodos. El master de Kubernetes toma
los comandos de un administrador y transmite esas instrucciones a los nodos que dependen de él. La
interacción funciona con una gran cantidad de servicios para decidir automáticamente qué nodo es el más
apto para realizar la tarea. Luego asigna los recursos a los pods en ese nodo para que puedan cumplir con la
tarea asignada.
Para conocer más sobre lo que son los kubernetes vamos a ver algunos términos comunes y son las
siguientes:

38
a) Master
La máquina que controla los nodos Kubernetes. Aquí es donde se originan todas las asignaciones de
tareas [24].

b) Nodo
Estas máquinas realizan las tareas requeridas y asignadas, son controladas por master de Kubernetes
[24].

c) Pod
Un grupo de uno o más contenedores implementados en un nodo único. Todos los contenedores de un
pod comparten la dirección IP, la IPC, el nombre del host y otros recursos. Los pods reconocen la red y
el almacenamiento del contenedor subyacente. Esto le permite mover los contenedores por el clúster
con mayor facilidad [24].

d) Controlador de replicación
Controla cuántas copias idénticas de un pod deben ejecutarse en algún lugar del clúster [24].

e) Servicio
Separa las definiciones de tareas de los pods. Los proxies de servicios de Kubernetes envían
automáticamente las solicitudes de servicio al pod correspondiente, sin importar adónde se traslada en
el clúster, o incluso si está siendo reemplazado [24].

f) Kubelet
Este servicio se ejecuta en los nodos y lee los manifiestos del contenedor, y garantiza que los
contenedores definidos estén iniciados y ejecutándose [24].

g) kubectl
Es la herramienta de configuración de la línea de comandos de Kubernetes [24].

39
4 Implementación en el proyecto

4.1 Alcance

Para mostrar de manera fácil y rápida la implementación y escalabilidad de servicios mediante el uso de
Docker vamos a crear un clúster de contenedores que expondrán un servicio. Para la orquestación del clúster
utilizaremos kubernetes, por su fácil y sencilla forma de implementar, porque es un sistema de orquestación
para contenedores como Docker gestionado por encima de kubernetes que permiten realizar acciones como
programar el despliegue, escalado y la monitorización de nuestros contenedores entre diversas
funcionalidades más.

4.2 Escenario 1

Para la implementación de este escenario nos basamos en el tutorial de instalación (Instalación de kubernetes
en Linux con Kubeadm) [26]. En nuestro caso práctico de instalación y configuración de Kubeadm
tendremos el siguiente escenario que se compone por tres nodos, de los cuales uno de ellos es el master y
los otros dos nodos que sirven al master como se muestra en la Figura 23.

Figura 23: Arquitectura de kubernetes para implementar


(Fuente: Elaboración propia)

Antes de la implementación tenemos que tener claro que si kubernetes gestiona contenedores docker,
tendremos que tener instalado docker en nuestro sistema. Para ello vamos a realizar una breve explicación
de la instalación de docker. Si bien la instalación de Docker dentro de nuestros entornos no es tan fácil como
menciona en este tutorial, se tuvo que recurrir a otros tutoriales, Para esta prueba se pueden utilizar maquinas
40
físicas, máquinas virtuales, instancias de Amazon EC2 u hospedadas de alguna otra forma, pero utilizaremos
máquinas virtuales hospedadas en VMware Workstation equipadas con Centos 7, ya que en el diplomado
“Experto en Aplicaciones Empresariales” obtuvimos el conocimiento básico y las herramientas para poner
configurar Docker en este sistema operativo.

Para este escenario necesitamos:

a) Tres Hosts Linux que puedan comunicarse a través de una red, en nuestro caso, máquinas virtuales
con Centos 7.
b) Docker Engine, en específico la versión 18.06.1-ce.
c) Kubernetes versión: v1.10.0.

4.2.1 Configuración y preparación del ambiente de trabajo

a) Creación de máquinas Hosts en red con Linux

Creamos tres máquinas virtuales, una se llamara master el cual será el nodo master y las otras dos se
llamarán slave1 y slave2 los cuales serán los nodos que servirán al nodo master. Según la documentación
oficial de Docker, para poder instalarlo en Linux, se necesita la versión de 64 bits de Centos que tiene
las siguientes características:

 Actualización del núcleo del sistema: Kernel 3.10.0.


 Soporte para contenedores docker.
 Inclusión de VMware Tools y controladores de gráficos 3D.
 OpenJDK-7 como JDK por defecto.
 Contempla actualización de CentOS 6.5 a CentOS 7.0.
 Cambio a systemd, firewalld y GRUB2.

Para la implementación se utilizara la versión 7 de Centos server.

b) Configuración inicial del servidor master y los servidores esclavos

Antes de comenzar, tenemos que configurar el archivo de host y el nombre de host en cada servidor,
de modo que cada servidor pueda comunicarse entre sí utilizando el nombre de host, seguiremos el
tutorial presentado en nuestra bibliografía [26].

41
• Paso 1: Primero tenemos abrir el archivo /etc/hosts en el primer servidor master, para ello
colocamos el siguiente comando.
Nano /etc/hosts
Luego aañadimos las siguientes líneas dentro el archivo hosts.

192.168.137.101 master
192.168.137.102 slave1
192.168.137.103 slave2
Luego debemos guardar y cerrar el archivo hosts, luego procedemos a configurar el nombre de
host ejecutando el siguiente comando:
hostnamectl set-hostname master

• Paso 2: Luego tenemos abrir el archivo /etc/hosts del segundo servidor esclavo 1, para ello
colocamos el siguiente comando.
nano /etc/hosts

Luego añadimos las siguientes líneas dentro el archivo hosts.

192.168.137.101 master
192.168.137.102 slave1
192.168.137.103 slave2

Luego debemos guardar y cerrar el archivo hosts, luego procedemos a configurar el nombre de
host ejecutando el siguiente comando:

hostnamectl set-hostname slave1

• Paso 3: Luego tenemos abrir el archivo /etc/hosts del servidor esclavo 2, para ello colocamos
el siguiente comando.
nano /etc/hosts

Luego añadimos las siguientes líneas dentro el archivo hosts.

192.168.137.101 master
192.168.137.102 slave1
192.168.137.103 slave2

42
Luego debemos guardar y cerrar el archivo hosts, luego procedemos a configurar el nombre de
host ejecutando el siguiente comando:

hostnamectl set-hostname slave2


exec bash

• Paso 4: A continuación, deberá deshabilitar la memoria de intercambio en cada servidor.


Porque los kubelets no son compatibles con la memoria de intercambio y no funcionarán si el
intercambio está activo o incluso presente en su archivo /etc/fstab.
Para deshabilitar el uso de la memoria de intercambio utilizamos el siguiente comando:

swapoff –a

Luego para poder deshabilitar el punto de montaje permanente de la memoria de intercambio


en el archivo fstab lo comentamos de la siguiente manera.
Abrimos el archivo /etc/fstab con el siguiente comando
nano /etc/fstab

Luego comentamos la línea del punto de montaje como se muestra en la figura 24.

Figura 24: Archivo fstab con el punto de montaje del swap comentado
(Fuente: Elaboración propia)

Luego guardamos y cerramos el archivo, para terminar colocamos el siguiente comando para
que el sistema pueda volver a leer el archivo fstab.
mount -a

Realizamos los mismos pasos para poder deshabilitar la memoria de intercambio en los dos
servidores esclavos.

43
 Paso 5: Deshabilitar Selinux, para ello hay que iniciar sesión en el nodo master y
desactivar selinux usando los siguientes comandos.
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g'
/etc/sysconfig/selinux

 Paso 6: Configurar las reglas de Firewall para ello hay que iniciar sesión en el nodo master
y ejecutar los siguientes comandos.
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd –reload

 Paso 7: Habilitar el módulo de netFilter

modprobe br_netfilter
echo '1'> / proc / sys / net / bridge / bridge-nf-call-iptables

 Paso 8: Habilitar y añadir módulos de trafico ipvs

modprobe –v ip_vs
modprobe –v ip_vs_rr
modprobe –v ip_vs_wrr
modprobe –v ip_vs_sh

c) Instalación de Docker Engine 1.17 o posterior

Para la instalación de Docker seguimos los pasos del tutorial Instalación de kubernetes en Linux
con Kubeadm [26] [27], también aplicamos los conocimientos y herramientas adquiridos en el
diplomado “Experto en Aplicaciones Empresariales”, los cuales constan de los siguientes pasos:

 Paso 1: Instalaremos la última versión de Docker-ce desde el repositorio para ello instalaremos
las dependencias del paquete para docker-ce.

yum install -y yum-utils device-mapper-persistent-data lvm2

 Pasó 2: Agregar los repositorios de docker al sistema


yum-config-manager --add-repo
https://download.docker.com/linux/centos/docker-ce.repo

44
 Paso 3: Instalar Docker con el comando yum

yum install -y docker-ce

 Paso 4: Iniciamos el servicio de docker y luego habilitamos los enlaces para los niveles de
ejecución.

systemctl start docker


systemctl enable docker

 Paso 5: Verificamos que docker se instaló correctamente y ya está corriendo.

systemctl status docker


Al ejecutar el comando anterior debería mostrarnos algo parecido a la figura 25.

Figura 25: Servicio de docker con su estado en activo y corriendo


(Fuente: Elaboración propia)

• Paso 6: Verificar que los protocolos y puertos estén habilitados para el correcto funcionamiento
de docker esto se lo realiza con el siguiente comando:
netstat –nat

Una vez comprobado que ya esté instalado docker y ya estén habilitados los puertos en el nodo master,
procedemos a instalar docker en los dos nodos esclavos para que pueda usarse kubernetes en los tres
nodos.
Luego que ya tenemos instalado docker en todas las máquinas pues ya podemos proceder con la
instalación de Kubeadm.

45
d) Instalación y configuración de Kubeadm versión 1.10.0

• Paso 1: Agregamos el repositorio de kubernetes al sistema ejecutando el siguiente comando.


cat << EOF> /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name = Kubernetes
baseurl = https: //packages.cloud.google.com/yum/repos/kubernetes-
el7-x86_64
enabled = 1
gpgcheck = 1
repo_gpgcheck = 1
gpgkey = https: //packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.
gpg
EOF

• Pasó 2: Ahora instalaremos los paquetes kubernetes kubeadm, kubelet y kubectl usando el
siguiente comando.
yum install -y kubelet kubeadm kubectl

• Paso 3: Iniciamos el servicio de kubelet y luego habilitamos los enlaces para los niveles de
ejecución.
systemctl start kubelet
systemctl enable kubelet

• Paso 4: Verificamos que kubelet este corriendo con el siguiente comando:

systemctl status kubelet

Al ejecutar el comando anterior debería mostrarnos algo parecido a la figura 26.

Figura 26: Servicio de kubelet con su estado en activo y corriendo


(Fuente: Elaboración propia)
46
• Paso 5: Verificar y cambiamos el cgroup-driver

docker info | grep -i cgroup


sed -i 's / cgroup-driver = systemd / cgroup-driver = cgroupfs / g'
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

• Paso 6: Volvemos a cargar el sistema systemd y reiniciamos el servicio kubelet.

systemctl daemon-reload
systemctl restart kubelet

• Pasó 6: Luego de haber instalado los paquetes necesarios para poder administrar kubernetes y
después de realizar el paso 6 necesarios, procederemos a ejecutar kubeadm. Esta ejecución
solamente se realiza en el equipo master en nuestro caso el nodo 0 llamado master, para ello
ejecutamos el siguiente comando:
kubeadm init --pod-network-cidr=192.168.137.0/24 --apiserver-
advertise-address=192.168.137.101

El Token join generado luego iniciar kubeadm que nos aparece debemos guardarlo para más
adelante el token generado por nuestro server maestro es el siguiente:

kubeadm join 192.168.137.101:6443 --token ijdb85.3udmye2m7vgxxvli --


discovery-token-ca-cert-hash
sha256:1469d045d6f4f9ad588b10810bdbf440bbb36b71b2edfa0cec4c4a22d7df6
3d3

e) Configuración de Kubeadm (Entorno de usuario)

Para configurar el entorno de usuario vamos a realizar lo siguiente (lo que vamos a realizar a
continuación nos aparece al final del inicio del kubeadm ejecutado en el paso anterior ya que se
realiza en el master).

 Paso 1: Crear el siguiente directorio como usuario normal para comenzar a usar su clúster,
debemos ejecutar lo siguiente:
mkdir -p $HOME/.kube

 Paso 2: Vamos a configurar los archivos de configuración con el siguiente comando.

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

 Paso 3: Por último cambiaremos los permisos al directorio creado y con eso ya tendremos
configurado el entorno de usuario.
sudo chown $(id -u):$(id -g) $HOME/.kube/config
47
 Paso 4: En el momento en el que necesitemos resetear la configuración de kubeadm tendremos
que introducir el siguiente comando.
kubeadm reset

f) Instalación del Pod Network

Deberemos instalar un pod network para comunicar el nodo master (master) con los demás nodos
que en nuestro caso es para permitir la comunicación con los otros dos nodos. Existen diferentes
proyectos que proporcionan pod network para kubernetes, algunos de ellos también apoyan la
política de red, para nuestra implementación vamos a instalar “weave-net” y se realiza con el
siguiente comando (se introduce solo en el nodo master).

export kubever=$(kubectl version | base64 | tr -d '\n')


kubectl apply -f https://cloud.weave.works/k8s/net?k8s-version= $kubever

Luego de instalar el pod ejecutamos el siguiente comando para verificar que el nodo master está
corriendo de manera correcta.
kubectl get nodes

g) Union de Nodos

Para que los dos nodos puedan comunicarse con el master y viceversa tendremos que unir los
distintos nodos ya que si no, estarían los tres nodos aislados y de esa forma nose cumpliría su
cometido. Para ello vamos seguir los siguientes pasos.

 Paso 1: Introducir el siguiente comando generado cuando iniciamos el kubeadm en los dos
nodos esclavos.
Nodo slave1
kubeadm join 192.168.137.101:6443 --token ijdb85.3udmye2m7vgxxvli --
discovery-token-ca-cert-hash
sha256:1469d045d6f4f9ad588b10810bdbf440bbb36b71b2edfa0cec4c4a22d7df6
3d3

Nodo slave2

kubeadm join 192.168.137.101:6443 --token ijdb85.3udmye2m7vgxxvli --


discovery-token-ca-cert-hash
sha256:1469d045d6f4f9ad588b10810bdbf440bbb36b71b2edfa0cec4c4a22d7df6
3d3

48
Una vez introducido el join en ambos nodos, ya tendremos los dos nodos (slave1 y slave2) unidos
con el master (master).

h) Comprobación de la unión de los nodos esclavos con el nodo master

 Paso 1: Para finalizar luego de unos minutos, en el nodo master (master) introducimos el
siguiente comando que nos permitirá visualizar si la unión de los nodos ha sido exitosa.
kubectl get nodes

Luego de ejecutar el comando anterior debería mostrarnos la lista de los nodos enlazados como
se muestra en la figura 27.

Figura 27: Nodos esclavos enlazados al nodo master


(Fuente: Elaboración propia)

 Paso 2: Para verificar que todos los pods se estén ejecutando de manera correcta en el nodo
master, con el siguiente comando se obtendrá todos los pods necesarios para el clúster, incluido
el 'kube-flannel-ds' para el pod de la red configuración.
kubectl get pods --all-namespaces

Luego de ejecutar el comando tiene que mostrarnos todos los pods corriendo como se muestra
en la figura 28.

Figura 28: Pods de kubernetes corriendo


(Fuente: Elaboración propia)

49
i) Creando nuestro primer pod

 Paso 1: Creamos una implementación llamada nginx usando el siguiente comando.

kubectl create deployment nginx --image=nginx

 Paso 2: Verificar los detalles y especificaciones de la implementación 'nginx', para ello


ejecutamos el siguiente comando.
kubectl describe deployment nginx

 Paso 3: Exponemos el pod nginx para que pueda ser accesible a través de internet, para ello
necesitamos crear un nuevo servicio.
kubectl create service nodeport nginx --tcp=80:80

 Paso 4: Verificamos que el pod creado este corriendo sin errores para ello ejecutamos el
siguiente comando
kubectl get pods –o wide

Luego de ejecutar el comando anterior se puede observar el pod creado como se muestra en la
figura 29.

Figura 29: Pods nginx corriendo


(Fuente: Elaboración propia)

 Paso 5: Verificamos que el servicio creado este corriendo sin errores para ello ejecutamos el
siguiente comando
kubectl get svc

50
Luego de ejecutar el comando anterior se puede observar el pod creado como se muestra en la
figura 30.

Figura 30: Servicio nginx corriendo


(Fuente: Elaboración propia)

 Paso 6: Verificando el servicio vemos que el servicio nginx esta corriendo en el puerto 32694,
para poder verificar a que nodo a sido asignado ejecutamos el siguiente comando
kubectl get pods -o wide

En la figura 29 podemos observar que el servicio nginx fue asignado al nodo slave2:

 Paso 7: Luego de verificar que el servicio nginx a sido asignado al nodo slave2 verificamos en
dicho nodo si está corriendo con el siguiente comando.
curl slave2:32694

Luego de ejecutar el comando deberia mostrarnos el servicio nginx corriendo en el nodo slave2
tal como se muestra en la figura 31.

Figura 31: Servicio nginx corriendo en el nodo slave2


(Fuente: Elaboración propia)

51
 Paso 8: También podemos ver el servicio nginx corriendo en una aplicación web como se
muestra en la figura 32.

Figura 32: Servicio nginx corriendo en el nodo slave2 visualizado en una aplicación web
(Fuente: Elaboración propia)

52
5 Conclusiones

En la actualidad el termino de contenedores docker es muy utilizado, porque un gran conjunto de empresas
ya lo implementaron o están en proceso, por tal motivo es importante conocer cuáles son los conceptos y
las ventajas de su implementación, más aun en un sistema operativo Linux por su licencia libre y su continuo
soporte de actualizaciones; Por ello se realizó el estudio de la implementación de contenedores en Linux, y
se hizo un especial enfoque en contenedores docker y como orquestador kubeadm(kubernetes). Lo que
podemos rescatar del estudio realizado es que, a pesar de que son servicios relativamente nuevos para mí,
fue accesible y rápida la implementación de un servicio en un cluster de contenedores con docker y
kubeadm. Una de las cosas interesantes del caso de estudio fue que pude encontrar gran cantidad de
información sobre esta nueva tecnología en la web, con variedad de ejemplos y de fácil implementación.
En cuanto al resultado obtenido en la implementación, pude confirmar que la implementación de
contenedores docker sobre una plataforma Linux es rápida y sencilla., también pude verificar que son
potentes en cuanto a escalamiento se refiere. Por ello se llegó a la conclusión que para poder realizar una la
implementación, administración y escalamiento de contenedores al nivel superior tomaría más tiempo la
investigación, por tal motivo en un futuro continuare con la investigación para profundizar más a detalle la
implementación y manejo de contenedores docker en Linux.

53
6 Bibliografía

[1] Haasm H. & Brown, A. (2004). Web Services Glossary Sitio web: https://www.w3.org/TR/ws-
gloss
[2] Pablo Peris Soler y Noemí Belenguer Navarro, Servicios Web Facultad de Informática
Universidad Politécnica de Valencia Sitio web: users.dsic.upv.es/asignaturas/facultad/lsi/
trabajos/272002.doc
[3] Arquitectura de Servicios Web Sitio web: www.mad.es/serviciosadicionales/ficheros/est-
tema12.pdf
[4] Oscar Blancarte Marzo 7, 2017 Servicios web Escalabilidad Horizontal y vertical Sitio Web:
https://www.oscarblancarteblog.com/2017/03/07/escalabilidad-horizontal-y-vertical
[5] Mark Nottingham (2001). Web Service Scalability and Performance with Optimizing
Intermediaries. Agosto 5, 2018, de WC3 Sitio web: https://www.w3.org/2001/03/WSWS-
popa/paper33
[6] Margaret Rouse (diciembre, 2010). Computo en la nube Sitio Web: https://searchdatacenter
.techtarget.com/es/definicion/Computacion-en-la-nube
[7] Hewlett Packard, Que es la computación en la nube? Sitio Web: https://www.hpe.com/es/es
/what-is/cloud-computing.html#
[8] Administración de la configuración de software Sitio Web: http://www.icesi.edu.co
/departamentos/tecnologias_informacion_comunicaciones/cursos/09561/102/home/_media/unida
d1/cap_10.pdf
[9] Aimara Hernández Fernández, Configuración de Software Sitio Web: https://www.ecured.cu
/Configuraci%C3%B3n_de_Software
[10] 2012 Administración de la configuración de software Sitio Web: https://sg.com.mx/content/
view/412
[11] Subashini, S., & Kavitha, V. (2011). A survet on security issues in service delivery models of
cloud computing. Journal of Network and Computer Applications (34), 1-11
[12] Goodburn, M., & Hill, S. (2010). The cloud transforms business. Financial Executive, 34-9
[13] Dic, 2017 Que es un hypervisor Sitio Web: http://www.networkworld.es/m2m/que-es-un-
hipervisor
[14] ¿Que es un Hypervisor? Sitio Web: http://www.datakeeper.es/?p=716
[15] Máquinas Virtuales Sitio Web: https://www.ecured.cu/M%C3%A1quina_virtual
54
[16] Margaret Rouse, (2016). ¿Qué es Open Stack? Sitio Web: https://searchdatacenter.techtarget
.com/es /definicion/Que-es-OpenStack
[17] Agosto 25, 2018 ¿Qué es Open Stack? de Red Hat Sitio web: https://www.redhat.com/
es/topics/openstack
[18] Octubre 2016, ¿Cómo es la administración de redes informáticas? Sitio Web: http://www.
bits.com.mx /como-administración-de-redes-informáticas
[19] ¿Qué es un contenedor en Linux? Sitio Web: https://www.redhat.com/es/topics/containers
/whats-a-linux-container
[20] Docker Overview. Agosto6, 2018, de Docker Sitio web:
https://docs.docker.com/engine/docker-overview
[21] Josep Encora, 17 nov, 2015 Apache Mesos Sitio Web: https://www.ncora.com/blog/apache-
mesos-que-es
[22] ¿Qué es Apache Mesos? Sitio Web: https://maauso.com/category/entrada/apache-mesos
[23] José María Gonzales, 22 sep, 2016 ¿Qué es kubernetes y porque es importante en docker?
Sitio Web: https://www.josemariagonzalez.es/docker/que-es-kubernetes-y-por-que-es-
importante-en-docker.html
[24] Agosto 25, 2018 ¿Qué es Kubernetes? de Red Hat Sitio web:
https://www.redhat.com/es/topics/containers/what-is-docker
[25] docker-vs-kubernetes-vs-apache-mesos Sitio Web: https://mesosphere.com/blog/docker-vs-
kubernetes-vs-apache-mesos
[26] Pradeep Kumar, septiembre 04, 2017 Como instalar kubernetes (k8s) 1.7 en CentOS 7/RHEL
Sitio Web: https://www.linuxtechi.com/install-kubernetes-1-7-centos7-rhel7/
[27] Muhammad Aru, mayo 18, 2018, como instalar un cluster docker kubernetes en Centos 7 Sitio
Web: https://www.howtoforge.com/tutorial/centos-kubernetes-docker-cluster/

55

Das könnte Ihnen auch gefallen