Академический Документы
Профессиональный Документы
Культура Документы
Cochabamba – Bolivia
2019
Agradecimientos
A Digital Harbor por abrir las puertas para poder realizar este
diplomado de doble titulación.
¡Muchas Gracias!
TABLA DE CONTENIDOS
RESUMEN 1
INTRODUCCIÓN 2
1 GENERALIDADES 3
1.1 Antecedentes Generales 3
1.2 Antecedentes Específicos 4
2 METODOLOGÍA 5
3 CONTENEDORES 5
3.1 Definición de Contenedores 6
3.2 Importancia de los Contenedores 6
3.3 Funcionamiento de los Contenedores 7
3.4 Gestión de los contenedores en las Empresas 8
4 ROCKET CONTAINER 9
4.1 Instalación de Rocket 11
4.1.1 Instalación en Arco 12
4.1.2 Instalación en CentOS 12
4.1.3 Instalación en Linux Container 12
4.1.4 Instalación en Debian 13
4.1.5 Instalación en Fedora 13
4.1.6 Instalación en Gentoo 14
4.1.7 Instalación en Nixos 14
4.1.8 Instalación en openSUSE 14
4.1.9 Instalación en Linux Ubuntu 15
4.2 Comandos Rocket 15
4.2.1 Descarga de Imágenes (ACIs) 15
4.2.2 Ejecutar Pods 16
4.2.3 Inspección y Administración de Pods 16
4.2.4 Interactuando con el Store de la imagen local 16
4.2.5 Servicio de metadatos 16
4.2.6 Servicio API 17
4.2.7 Opciones Globales 17
4.3 Primeros pasos con Rocket Container 18
4.3.1 Crea una aplicación hello.go 19
4.3.2 Construye un binario Go enlazado estáticamente 19
4.3.3 Crea la imagen 20
4.3.4 Ejecutar la Imagen de aplicación local 20
4.3.5 Probamos con curl 20
4.4 Ejecutando imágenes Docker con Rocket 21
4.5 Diferencias entre Rocket y Docker 22
4.5.1 Seguridad de la imagen del contenedor 23
4.5.2 Prevenir los ataques de escala de privilegios “raíz” 24
4.5.3 Flexibilidad en publicar o compartir imágenes 25
4.5.4 Tamaño del código base 25
4.5.5 Portabilidad a otros sistemas de contenedores 26
4.5.6 Diferencia de Arquitectura 26
4.5.7 ¿Cuál debería elegir? 27
6 CONCLUSIONES 33
7 GLOSARIO 34
8 BIBLIOGRAFÍA 37
TABLA DE FIGURAS
RESUMEN
Por otro lado mostraremos ejemplos claros y sencillos además de la puesta en marcha del
contenedor Rocket Container con distintos servicios y microservicios que corren paralelamente
en un mismo Sistema Operativo.
También se realizará un breve estudio sobre Rocket-Compose quien nos ayudará a orquestar
servicios y microservicios paralelamente comunicándolos entre sí, que gracias a ello podremos
sustentar nuestro objetivo “Brindando servicios con Rocket Container”.
Como Preámbulo podemos incentivar a nuestros lectores a inclinarse por esta tecnología,
tomando como punto de partida esta monografía, debido a que es un mundo relativamente nuevo
y que tiene todavía mucho que ofrecernos.
1
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
INTRODUCCIÓN
Para los proveedores de servicios web es muy importante el poder escalar rápidamente debido
a la competencia que existe, dado que su objetivo principal es mantener a sus clientes
satisfechos y poder minimizar los costes de manutención de servidores debido al uso innecesario
de recursos, es ahí donde hacen su ingreso la tecnología de contenedores dando solución a este
problema. (TERRAZAS, 2018)
Por otro lado también gracias al estudio que se realizará se busca guiar tanto a las empresas,
instituciones y/o personas al momento de tomar una decisión sobre que tecnología utilizar para
poder brindar sus servicios web y de esta manera poder evitarse la pérdida de tiempo en cambios
de migraciones, incompatibilidad de Sistemas Operativos, pérdida de recursos innecesarios de
hardware que conllevan perdidas económicas, etc.
2
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
1 GENERALIDADES
Cabe mencionar que antes de que los contenedores ganaran popularidad, un enfoque previo
eran las máquinas virtuales. Aquí, un servidor físico podía usarse para múltiples aplicaciones a
través de la tecnología de virtualización, también conocida como máquina virtual, donde cada
máquina virtual contiene el sistema operativo completo, así como la aplicación para ejecutar
según (RAMÍREZ, 2016)
El servidor físico que ejecuta varias máquinas virtuales, cada una con su propio sistema
operativo, con una única capa de emulación de hipervisor en la parte superior. Al ejecutar varios
sistemas operativos simultáneamente, hay una gran cantidad de gastos generales en el servidor
a medida que los recursos se utilizan, y el número de máquinas virtuales se limita a unos pocos
según (RAMÍREZ, 2016)
Debido al anterior antecedente los contenedores se están apoderando del mundo. Desde VPS
hasta aplicaciones de alojamiento, cada vez más compañías utilizan tecnologías de contenedor
como Docker, LXC, OpenVZ, Rocket (el cual abarcaremos más adelante), etc.
El primer antecedente mencionado por (hoplasoftware, 2018) 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.
En 2008, llega a Linux con LXC (Linux Containers) que da soporte al Kernel para los
namespaces.
3
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Los namespaces constituyen el elemento base de los contenedores 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. (hoplasoftware, 2018)
Finalmente sobre la base de LXC llega en 2013 Docker y como consecuencia de las debilidades
del ya mencionado nace Rocket Container de Core OS.
Luego apareció CoreOS, que fue uno de los principales patrocinadores de Docker hasta el 1 de
diciembre de 2014, cuando lanzó una bomba o podríamos decir un cohete y anunciar una
tecnología competitiva de virtualización de contenedores llamada Rocket. (Sudhi Seshachala,
2015)
El enfoque principal del equipo de CoreOs es la idea de un contenedor como una estructura
elemental de desarrollo de aplicaciones.
Todos los contenedores contribuyen con un “microservicio” que se puede combinar con otros
microservicios para formar aplicaciones distribuidas.
Docker es quizás la tecnología de virtualización ligera más popular utilizada por los
desarrolladores de aplicaciones.
Sin embargo, Docker ahora tiene un competidor - rkt (también conocido como cohete) que
ofrece algunas características únicas.
El proyecto rkt se inició en diciembre de 2014, cuando se descubrió que Docker tenía varios
problemas de seguridad. Rkt fue diseñado para ser una solución más segura, interoperable y
de contenedor abierto en comparación con Docker. (Sudhi Seshachala, 2015)
Desde entonces, Docker ha cubierto mucho terreno para abordar todos los problemas críticos
de seguridad. Sin embargo, vale la pena observar cómo estas dos plataformas difieren en sus
distintas capacidades, con el propósito de ofrecer la mejor explicación y entender los conceptos
de contenedores explicaremos ampliamente que es Rocket y cual su diferencia ante su principal
competidor Docker. (Sudhi Seshachala, 2015)
4
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
2 METODOLOGÍA
3 CONTENEDORES
Los contenedores son aplicaciones y servicios autónomos que encapsulan todas las
dependencias para que sean fácilmente implementables y actualizables. El beneficio del uso de
los contenedores es que gracias a su naturaleza aislada, un administrador no tiene que
preocuparse de que cada aplicación o servicio interfiera o se afecte entre sí, además de ser muy
rentables ya que eliminan el costo del hardware de la ecuación. Los contenedores están
configurados para funcionar realizando el trabajo en una arquitectura de múltiples contenedores
o clúster. En un clúster de contenedores, hay un único maestro, con los otros contenedores
relacionados designados como nodos donde las funciones del maestro es programar las cargas
de trabajo para los nodos, y también administrar su ciclo de vida y sus actualizaciones.
Su historia se remonta al año 1979 con Unix V7 según (hoplasoftware, 2018) hasta la aparición
de Docker en 2013, posteriormente en 2014 hace su aparición el competidor número uno de
Docker Core OS con Rocket el cual abordaremos en la presente monografía.
5
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Aquí una ilustración de las diferentes tecnologías de contenedores a lo largo del tiempo.
Los contenedores son aplicaciones y servicios autónomos que encapsulan todas las
dependencias para que sean fácilmente implementables y actualizables, en términos más
simples, los contenedores son aplicaciones independientes, empaquetadas con sus
dependencias, que TI puede implementar y actualizar fácilmente. (tecnologias-informacion,
2018)
Al igual que las máquinas virtuales, los contenedores eliminan la dependencia del hardware de
la ecuación. Los contenedores se distribuyen fácilmente a través de una plataforma virtual, y son
una forma en que su empresa o entidad puede ahorrar dinero, teniendo en cuenta que ahora
tiene la capacidad de implementar múltiples aplicaciones y micro-servicios que no tienen sus
propios requisitos de hardware. (tecnologias-informacion, 2018)
Los principales proveedores de computación en la nube pública, incluidos Amazon Web Services,
Microsoft Azure y Google Cloud Platform han adoptado la tecnología de contenedores, con
software de contenedor que tiene nombres que incluyen las opciones populares de Docker,
Apache, ROCKET (pronunciado "cohete") y Kubernetes. (tecnologias-informacion, 2018)
Los contenedores hacen que sea mucho más fácil para los administradores implementar
aplicaciones y servicios y mantenerlos de manera efectiva.
6
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Los contenedores también son un excelente medio para implementar y escalar sitios web.
Imagine que su sitio web básico (servido en una máquina virtual) le permite agregar fácilmente
aplicaciones y/o servicios basados en la web para expandir sus ofertas. (tecnologias-informacion,
2018)
Estas aplicaciones o servicios podrían agregarse sin requerir que sus dependencias sean
satisfechas por la computadora anfitriona.
Con esto listo, ya no tendrá que preocuparse de que la instalación de una nueva aplicación
interfiera con la computadora host o la máquina virtual anfitriona, ya que el contenedor es una
aplicación autónoma. (tecnologias-informacion, 2018)
La importancia de los contenedores comienza en el nivel del servidor. Imagínese que todo lo que
ejecuta en su servidor se realiza de manera tan eficiente que cada aplicación y servicio en
ejecución no compite por recursos de host preciosos o directamente afecta la ejecución de la
máquina host. (tecnologias-informacion, 2018)
Ahí es donde comienza el beneficio de los contenedores. Debido a la naturaleza aislada de los
contenedores, un administrador no tiene que preocuparse de que cada aplicación o servicio
interfiera o se afecte entre sí, además de ser muy rentables ya que eliminan el costo del hardware
de la ecuación. (tecnologias-informacion, 2018)
Los contenedores están configurados para realizar el trabajo en una arquitectura de múltiples
contenedores, lo que se denomina un clúster de contenedores. En un clúster de contenedores
Kubernetes, hay un único maestro de clúster, con los otros contenedores relacionados
designados como nodos, que son las máquinas de varios trabajadores. Las funciones del
maestro de clústeres es programar las cargas de trabajo para los nodos, y también administrar
su ciclo de vida y sus actualizaciones. (tecnologias-informacion, 2018)
7
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Con tanto software que se ejecuta como contenedores, la administración de los contenedores
ahora se ha convertido en un requisito, y es imposible realizar esta tarea de forma manual.
Se requiere software especializado para la gestión de contenedores, y una solución popular de
código abierto es Kubernetes, que tiene varias distribuciones, incluida Red Hat OpenShift.
El software de administración de contenedores facilita el despliegue de contenedores y funciona
bien con las estrategias de despliegue rápido de la filosofía de DevOps. (campusMVP, 2018)
Otra gran característica de la tecnología de contenedores es su flexibilidad. Con una máquina
virtual, se requieren varios minutos para iniciarse, al igual que la PC de su escritorio se inicia al
comienzo del día. Más bien, con la tecnología de contenedor, como el sistema operativo ya se
está ejecutando en el servidor, un contenedor puede iniciarse en unos pocos segundos. Esto
permite que los contenedores se inicien y detengan según sea necesario, que se flexionen hacia
arriba en un momento de máxima demanda y que se flexionen hacia abajo cuando no se
necesitan. (campusMVP, 2018)
Además, si un contenedor se bloquea, se puede reiniciar rápidamente para que pueda volver a
la tarea. Este tipo de administración se conoce como orquestación de contenedores, y un
software como Docker Swarm puede controlar este tipo de orquestación y distribuir las tareas
entre el clúster de contenedores. (campusMVP, 2018)
Dado que varios contenedores comparten el mismo sistema operativo, existe la preocupación de
que la tecnología de contenedores es menos segura que una máquina virtual. Esto se debe a
que si hay una falla de seguridad en el núcleo del host, esto afectará a múltiples contenedores. Se
han hecho esfuerzos para hacer los contenedores más seguros. Un enfoque incluye a Docker
que requiere una infraestructura de firma para evitar que los contenedores no autorizados se
inicien. También hay un software de seguridad de contenedor, como Twistlock que perfila el
comportamiento de un contenedor y luego cierra un contenedor que cae fuera del perfil esperado.
(campusMVP, 2018)
8
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
4 ROCKET CONTAINER
Rkt es una alternativa de contenedor ligera y segura a Docker que se construye en base a un
estándar de contenedor abierto conocido como “Contenedor de aplicaciones” o especificación
“appc” el cual permite que las imágenes de rkt se puedan transportar a través de muchos
sistemas de contenedores como Kurma, JetPack. Rocket no involucra a un demonio exterior,
siempre que llame a rkt para ejecutar un contenedor, lo hará sin demora dentro del rango de su
propio árbol de procesos y cgroup, su unidad de ejecución principal de rkt es el pod, una
colección de una o más aplicaciones que se ejecutan en un contexto compartido. RKT permite
a los usuarios aplicar diferentes configuraciones tanto a nivel de pod como a nivel más granular
por aplicación, su arquitectura significa que cada pod se ejecuta directamente en el modelo de
proceso clásico de Unix.
Rkt es un sistema de contenedor desarrollado por CoreOS como una alternativa ligera y segura
a Docker. Se construye en base a un estándar de contenedor abierto conocido como
“Contenedor de aplicaciones” o especificación “appc”. Esto permite que las imágenes de rkt
se puedan transportar a través de muchos sistemas de contenedores (como Kurma, JetPack,
etc.) que siguen el formato abierto “appc”. (Sudhi Seshachala, 2015)
Rocket es otra posibilidad o elección para la ejecución Docker, también está diseñado para
entornos de servidores con los requisitos de seguridad, enlazamiento, velocidad y de producción
más resueltos. El software se compone de dos elementos, cada uno de los cuales es una
herramienta de línea de comandos sencilla y autónoma. (Sudhi Seshachala, 2015)
1) Actool.- Es el primer componente que administra la construcción de
contenedores. Incluso maneja la validación y el descubrimiento de contenedores. (Sudhi
Seshachala, 2015)
9
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
2) Rkt.- Se llama así, ya que todos los comandos principales de UNIX utilizados en Rocket
son tres letras. Ayuda en el cuidado de la captura y ejecución de imágenes de contenedor.
CoreOS Rocket (rkt) es el primer rival creíble al dominio de Docker en el espacio del
contenedor. En pocas palabras, rkt es una tecnología de contenedor más segura, diseñada para
aliviar muchas de las fallas inherentes en el modelo de contenedor de Docker.
10
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
La unidad de ejecución principal de rkt es el pod, una colección de una o más aplicaciones que
se ejecutan en un contexto compartido (los pods de rkt son sinónimo del concepto en el sistema
de orquestación Kubernetes). (Sudhi Seshachala, 2015)
RKT está disponible para varias las siguientes distribuciones de Linux que mencionaremos a
continuación: (coreos, coreos, 2019)
• Arco
• CentOS
• Contenedor Linux por CoreOS
• Debian
• Fedora
• Gentoo
11
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
• Nixos
• openSUSE
• Ubuntu (Abarcaremos esta Instalación en la presente monografía)
rkt está disponible en CentOS Community Build Service para CentOS 7. Sin embargo,
esto todavía no está listo para el uso de producción debido a problemas pendientes de
actualización del sistema. (coreos, coreos, 2019)
Rkt es una parte integral de Linux Continer, instalado con el sistema operativo.
Si se requiere una versión de rkt diferente a la que se suministra con CoreOS Linux Container,
se puede usar una unidad de sistema de control remoto para descargar e instalar una versión
alternativa en el arranque.
La siguiente unidad utilizará curl para descargar rkt, su firma y la clave de firma de la aplicación
CoreOS. El rkt descargado se verifica con su firma y se extrae a / opt / rkt. (coreos, coreos,
2019)
12
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
rkt está actualmente empaquetado en Debian sid (inestable). (coreos, coreos, 2019)
Si no ejecuta sid, o desea una versión más nueva, puede instalarla manualmente.
Advertencia: SELinux: rkt no funciona con las políticas de SELinux que se envían actualmente
con las versiones 24 y 25 de Fedora. (coreos, coreos, 2019)
Advertencia: firewalld: Fedora usa firewalld para definir dinámicamente las zonas de firewall. rkt aún
no está completamente integrado con firewalld. Las reglas predeterminadas de firewalld pueden
interferir con la conectividad de red de los pods rkt. Para solucionar esto, agregue una regla firewalld
para permitir el tráfico de pod: (coreos, coreos, 2019)
13
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
rkt está empaquetado para gentoo y disponible a través de portage. (coreos, coreos, 2019)
rkt se puede instalar en NixOS usando el siguiente comando: (coreos, coreos, 2019)
14
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Paquetes mantenidos por rkt: Como parte del proceso de compilación rkt, se construyen los
paquetes rpm y deb. Si necesita usar la última versión de rkt, o su distribución no incluye rkt,
están disponibles. (coreos, coreos, 2019)
Actualmente, el proyecto rkt upstream no mantiene su propio repositorio, por lo que los usuarios
de estos paquetes deben actualizarse manualmente basado en rpm.
ACI se nombran con una estructura similar a la URL. Este esquema de denominación permite
un descubrimiento descentralizado de ACI, firmas relacionadas y claves públicas. rkt utiliza
estos consejos para ejecutar meta descubrimiento. (coreos, coreos, 2019)
• trust
• fetch
15
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
rkt puede ejecutar ACIs identificadas por nombre, hash, ruta de archivo local o URL. Si un ACI
no se ha almacenado en caché en el disco, rkt intentará encontrarlo y descargarlo. Para usar
el servicio de metadatos de rkt , habilite el registro con la --mds-registerbandera al invocarlo .
(coreos, coreos, 2019)
• run
• stop
• enter
• prepare
• run-prepared
rkt proporciona subcomandos para enumerar, obtener el estado y limpiar sus pods. (coreos,
coreos, 2019)
• list
• status
• export
• gc
• rm
• cat-manifest
• Image
El servicio de metadatos está diseñado para ayudar a ejecutar las aplicaciones en su entorno
de ejecución y afirmar su identidad de pod. En particular, el servicio de metadatos expone el
contenido del pod y los manifiestos de imagen, así como un método conveniente para buscar
16
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
El servicio API permite a los clientes listar e inspeccionar pods e imágenes que se ejecutan
bajo rkt. (coreos, coreos, 2019)
• api-service
Además de los indicadores utilizados por los rkt comandos individuales, rkt tiene un conjunto
de opciones globales que son aplicables a todos los comandos. (coreos, coreos, 2019)
17
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
En esta sección crearemos un ejemplo desde cero usando rocket y acbuild, posteriormente lo
desplegaremos usando el comando rkt run. Crear un servicio o microservicio y poderlo ejecutar
en cuestión de segundos es muy facil usando la tecnologia de contenedores como lo es rocket
container.
18
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
package main
import (
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
log.Printf("request from %v\n", r.RemoteAddr)
w.Write([]byte("Hello Digital Harbor\n"))
})
log.Fatal(http.ListenAndServe(":5000", nil))
}
19
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Para crear la imagen, podemos usar acbuild, que se puede descargar a través de uno de
los releases in te conteiner/budil repositorio.
Los siguientes comandos crearán un ACI que contiene nuestra aplicación y metadatos
importantes. (coreos, coreos, 2019)
En este punto, nuestra aplicación “hello” se está ejecutando y está lista para manejar solicitudes
HTTP. (coreos, coreos, 2019)
De forma predeterminada, rkt asignará una dirección IP al contenedor en ejecución. Utilice rkt
list para listar todos los contenedores: (coreos, coreos, 2019)
Entonces podemos hacer la petición con curl al IP: 172.16.28.2 puerto 5000:
20
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
RKT cuenta con soporte nativo para recuperar y ejecutar imágenes de contenedor Docker.
Para hacer referencia a una imagen de Docker, usar el prefijo para obtener o
ejecutar imágenes.
Tenga en cuenta que las imágenes de Docker no admiten la verificación de firmas y, por lo
tanto, es necesario usar: (coreos, coreos, 2019)
Como ejemplo simple, ejecutemos la última imagen del contenedor redis desde el registro de
Docker predeterminado:
Al igual que con Docker, se pueden usar registros alternativos especificando el registro como
parte de la referencia de la imagen. Por ejemplo, el siguiente comando buscará
una imagen nginx Docker alojada en quay.io : (coreos, coreos, 2019)
21
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Una vez que se ha recuperado la imagen, se puede ejecutar haciendo referencia a este hash:
Rkt la verificación de la firma la realiza de forma predeterminada entonces tan pronto como se
descarga una imagen del servidor, se verifica de forma cruzada con la firma del editor para ver
si se ha manipulado de alguna manera, ademas ejecuta contenedores como usuarios sin
privilegios, de modo que incluso si un usuario se rompe, no pueden afectar a otros
contenedores o tomar el control del servidor. rkt usa el protocolo HTTPS para descargar
imágenes y usa una meta descripción en el servidor web para señalar la ubicación, entonces,
ese es un servidor menos para mantener, y más fácil de acceder para su equipo de trabajo.
rkt, en contraste usa una arquitectura modular donde las características son desarrolladas
como binarios independientes por diferentes proveedores, el código base se mantiene lo más
pequeño posible para reducir el área de la superficie de ataque con el cual asegura que incluso
si un subcomponente como etcd está comprometido, el daño se limitaría a lo que el programa
puede acceder. rkt utiliza un formato de contenedor de código abierto conocido como "appc",
cualquier imagen del servidor creada con rkt se puede portar fácilmente a otro sistema de
contenedores siempre que siga el formato abierto "appc".
El proyecto rkt se inició en diciembre de 2014, cuando se descubrió que Docker tenía varios
problemas de seguridad. Rkt fue diseñado para ser una solución más segura, interoperable y
de contenedor abierto en comparación con Docker.
Desde entonces, Docker ha cubierto mucho terreno para abordar todos los problemas críticos
de seguridad. Sin embargo, vale la pena observar cómo estas dos plataformas difieren en sus
distintas capacidades. (UpGuard, 2018)
Aquí hay una lista de las principales diferencias:
22
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Una gran cosa acerca de Docker es que hay un registro público desde el cual cualquiera puede
descargar imágenes optimizadas del servidor de aplicaciones. Entonces, si quieres un servidor
Nginx optimizado para la aplicación web Magento, obtendrás uno del registro de Docker.
Sin embargo, hay un peligro oculto en esto. Es posible que un atacante reemplace una imagen
del servidor con otra infectada con malware. (Visakh, 2016)
Antes de la versión 1.8, Docker no tenía una manera de verificar la autenticidad de una imagen
de servidor. Pero en v1.8, se introdujo una nueva característica llamada Docker Content
Trust para firmar y verificar automáticamente la firma de un editor. (Visakh, 2016)
23
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Entonces, mientras esté ejecutando la última versión de Docker (v1.12) o Rkt (v1.3), estará a
salvo de este problema. (Visakh, 2016)
Docker se ejecuta con privilegios de super-usuario (también conocido como "raíz") y separa
nuevos contenedores como su subproceso. El problema con eso es que una vulnerabilidad en
un contenedor o una contención deficiente pueden dar a un atacante nivel de acceso de acceso
a todo el servidor. CVE-2014-9357 fue una de esas vulnerabilidades. (Visakh, 2016)
Claro, Docker siempre recomendó ejecutar contenedores dentro de SELinux o AppArmor, pero
muchos propietarios de servidores lo consideran demasiado complicado y omiten el paso.
(Visakh, 2016)
Rkt ideó una mejor solución donde los nuevos contenedores nunca se crean a partir de un
proceso con privilegios de raíz. De esta forma, incluso si ocurre una ruptura de contenedor, el
atacante no puede obtener privilegios de root. (Visakh, 2016)
Como una forma de contener esta amenaza, Docker carga los módulos de seguridad de
AppArmor de forma predeterminada. Esto evita que un usuario (contenedor) vea los archivos
o el contenido de la memoria de otro usuario. (Visakh, 2016)
Además, muchas características adicionales como espacios de nombre de usuario, ejecución
sin privilegios, etc. se pueden configurar para mantener seguros los contenedores de Docker.
En algunos sistemas, como Docker, si un usuario puede salir de un contenedor utilizando un
exploit del Kernel, el atacante puede controlar todo el servidor físico y cualquier almacén de
24
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
datos adjunto. Por supuesto, Docker puede protegerse para evitar que un usuario se escape,
pero eso es seguridad “adicional”, como lo mencionamos anteriormente. (Visakh, 2016)
En contraste, rkt ejecuta contenedores como usuarios sin privilegios, de modo que incluso si
un usuario se rompe, no pueden afectar a otros contenedores o tomar el control del servidor.
(Visakh, 2016)
Al desarrollar aplicaciones, podría ser necesario compartir imágenes de contenedor con sus
socios tecnológicos. Si desea compartir los contenedores de Docker, deberá configurar un
registro privado especial en sus servidores o alojarlo en una cuenta de pago de Docker para
compartirlo con su equipo de trabajo. (Visakh, 2016)
Para rkt, solo necesitas tu servidor web para ello. rkt usa el protocolo HTTPS para descargar
imágenes y usa una meta descripción en el servidor web para señalar la ubicación. Entonces,
ese es un servidor menos para mantener, y más fácil de acceder para su equipo de trabajo.
(Visakh, 2016)
HTTPS es solo una forma de distribuir archivos ACI. Usando el comando rkt torrent pull, las
imágenes se pueden descargar en torrents. (Visakh, 2016)
Docker agrega todas sus características a un solo archivo de programa monolítico, lo que
significa que la cantidad de líneas de código sigue aumentando a medida que sale cada nueva
versión. Y aquí radica un problema de seguridad. Una sola vulnerabilidad en cualquiera de las
miles de líneas de código puede comprometer todo el programa y, en esencia, otorgar acceso
de raíz a un atacante. (Visakh, 2016)
25
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
rkt, en contraste usa una arquitectura modular donde las características son desarrolladas
como binarios independientes por diferentes proveedores. El código base se mantiene lo más
pequeño posible para reducir el área de la superficie de ataque. Esto asegura que incluso si
un subcomponente como etcd está comprometido, el daño se limitaría a lo que el programa
puede acceder. (Visakh, 2016)
Nuevos sistemas de contenedores salen todo el tiempo. ¿Y si mañana hay una mejor
tecnología de contenedores? Con Docker, la migración a una nueva tecnología de contenedor
podría ser un problema, ya que utiliza un formato de imagen propietario.
En contraste, rkt utiliza un formato de contenedor de código abierto conocido como "appc". Por
lo tanto, cualquier imagen del servidor creada con rkt se puede portar fácilmente a otro sistema
de contenedores siempre que siga el formato abierto "appc". (Visakh, 2016)
Al adherirse a un estándar abierto, rkt no impone un bloqueo de proveedor. Esto ayuda a los
propietarios de sistemas a migrar sin problemas a otro sistema de contenedores que se adapte
mejor a sus requisitos. (Visakh, 2016)
A diferencia de Docker, si usa systemd para iniciar los contenedores rkt, en realidad está
monitoreando el proceso del contenedor en lugar de monitorear un proceso cliente que se
conecta a un demonio que a su vez (directa o indirectamente, dependiendo de su versión de
Docker) inicia el contenedor. La siguiente imagen lo ilustra. (Jonge, medium, 2016)
26
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Una herramienta para preparar y ejecutar rkt pods rápidamente. (trusch, 2017)
5.1.1 Características
27
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
28
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Como vimos en el ejemplo anterior pudimos levantar dos imágenes diferentes en un pod con id
“c0235601”, una con la imagen “quay.io/coreos/etcd” cuya imagen brinda el servicio de ser
un almacén de valor-clave confiable y distribuido para los datos más críticos de un sistema
distribuido, centrado en ser:
Simple: API bien definida, orientada al usuario (gRPC)
Seguro: TLS automático con autenticación cert opcional del cliente
Rápido: puntos de referencia de 10,000 escrituras / seg.
Confiable: distribuido correctamente utilizando Raft
Por otro lado también levantamos la imagen “debian” el cual podría ayudarnos para un testing,
ambas imágenes están conectadas a la red “my-net” que gracias a ello y rkt-compose están
comunicados entre sí, podemos observar con que facilitad pudimos comunicar dos servicios
alojados en diferentes host fácilmente.
29
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
5.2 Mysql
30
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
5.3 Apache
31
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
32
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
6 CONCLUSIONES
Los contenedores son aplicaciones y servicios autónomos que encapsulan todas las
dependencias para que sean fácilmente implementables y actualizables. El beneficio del uso de
los contenedores es que gracias a su naturaleza aislada, un administrador no tiene que
preocuparse de que cada aplicación o servicio interfiera o se afecte entre sí, además de ser muy
rentables ya que eliminan el costo del hardware de la ecuación. Los contenedores están
configurados para funcionar realizando el trabajo en una arquitectura de múltiples contenedores
o clúster. En un clúster de contenedores, hay un único maestro, con los otros contenedores
relacionados designados como nodos donde las funciones del maestro es programar las cargas
de trabajo para los nodos, y también administrar su ciclo de vida y sus actualizaciones.
Rkt es una alternativa de contenedor ligera y segura a Docker que se construye en base a un
estándar de contenedor abierto conocido como “Contenedor de aplicaciones” o especificación
“appc” el cual permite que las imágenes de rkt se puedan transportar a través de muchos
sistemas de contenedores como Kurma, JetPack. Rkt la verificación de la firma la realiza de
forma predeterminada entonces tan pronto como se descarga una imagen del servidor, se
verifica de forma cruzada con la firma del editor para ver si se ha manipulado de alguna manera,
ademas ejecuta contenedores como usuarios sin privilegios, de modo que incluso si un usuario
se rompe, no pueden afectar a otros contenedores o tomar el control del servidor.
Como pudimos observar en el apartado “Servicios con Rocket Container” brindar servicios a
través de Rocket Container es completamente fácil y rápido, pudimos levantar prácticamente
Mysql, Apache, y Wordpress los cuales están en diferentes host y corriendo sin depender una
de la otra gracias a los beneficios que ofrece esta hermosa herramienta, incluso podemos ir un
poco más lejos pudiendo orquestarlos con rkt-compose atravez de un archivo rkt-
compose.yaml.
Si bien en esta monografía pudimos ver la gran facilidad con la que se puede escalar un servicio
con contenedores web sin afectar la calidad del servicio prestado, todavía le falta mucho por
desarrollarse y mejorar.
33
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
7 GLOSARIO
Unix:
Docker:
CoreoOS:
Es un sistema operativo ligero de código abierto basado en el Kernel de Linux y diseñado para
proporcionar la infraestructura para los despliegues en clúster, mientras se centra en la
automatización, facilidad de despliegue de aplicaciones, seguridad, fiabilidad y escalabilidad.
Como sistema operativo, CoreOS ofrece sólo las funcionalidades mínimas necesarias para la
implementación de aplicaciones dentro de contenedores de software, junto con mecanismos
incorporados para el descubrimiento de servicios y el intercambio de configuración
Máquina Virtual:
Una característica esencial de las máquinas virtuales es que los procesos que ejecutan están
limitados por los recursos y abstracciones proporcionados por ellas. Estos procesos no pueden
escaparse de esta "computadora virtual".
Jail Chroot:
Chroot es un comando UNIX que permite ejecutar un proceso bajo un directorio raíz simulada,
de manera que el proceso no puede acceder a archivos fuera de ese directorio.
34
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
Servidor:
VPS:
Un servidor virtual privado (VPS, del inglés virtual private server) es un método de particionar
un servidor físico en varios servidores virtuales (máquinas virtuales con tareas de servidor) de tal
forma que todo funcione como si se estuviese ejecutando en una única máquina. Cada servidor
virtual es capaz de funcionar bajo su propio sistema operativo y además cada servidor puede ser
reiniciado de forma independiente.
LXC:
LXC (Linux Containers) Es una tecnología de virtualización en el nivel de sistema operativo (SO)
para Linux. LXCpermite que un servidor físico ejecute múltiples instancias de sistemas operativos
aislados, conocidos como Servidores Privados Virtuales (SPV o VPS en inglés) o Entornos
Virtuales (EV).
TI:
La tecnología de la información (TI) es la aplicación de ordenadores y equipos
de telecomunicación para almacenar, recuperar, transmitir y manipular datos, con frecuencia
utilizado en el contexto de los negocios u otras empresas. El término es utilizado como sinónimo
para los computadores, y las redes de computadoras, pero también abarca otras tecnologías de
distribución de información, tales como la televisión y los teléfonos.
35
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
OpenVz:
Es una tecnología de virtualización en el nivel de sistema operativo para Linux. OpenVZ permite
que un servidor físico ejecute múltiples instancias de sistemas operativos aislados, conocidos
como Servidores Privados Virtuales (SPV o VPS en inglés) o Entornos Virtuales (EV).
Microservicio:
Kubernetes:
Es un sistema de código libre para la automatización del despliegue, ajuste de escala y manejo
de aplicaciones en contenedores que fue originalmente diseñado por Google y donado a la Cloud
Native Computing Foundation (parte de la Linux Foundation). Soporta diferentes ambientes para
la ejecución de contenedores, incluido Docker.
Fundación OCI:
La Open Cloud Iniciative es una asociación que promueve la adopción de principios comunes de
servicios de nube abiertas para impulsar su estandarización y apertura real.
Host:
El término host o anfitrión se usa en informática para referirse a las computadoras u otros
dispositivos conectados a una red que proveen y utilizan servicios de ella. Los usuarios deben
utilizar anfitriones para tener acceso a la red. En general, los anfitriones son computadores
monousuario o multiusuario que ofrecen servicios de transferencia de archivos, conexión remota,
servidores de base de datos, servidores web, etc.
HTTP:
Hypervisor:
Un hipervisor (en inglés hypervisor) o monitor de máquina virtual (virtual machine monitor) es una
36
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
plataforma que permite aplicar diversas técnicas de control de virtualización para utilizar, al
mismo tiempo, diferentes sistemas operativos en una misma computadora.
Kernel:
Un núcleo o Kernel (de la raíz germánica Kern, núcleo, hueso) es un software que constituye una
parte fundamental del sistema operativo, y se define como la parte que se ejecuta en modo
privilegiado (conocido también como modo núcleo). Es el principal responsable de facilitar a los
distintos programas acceso seguro al hardware de la computadora o en forma básica, es el
encargado de gestionar recursos, a través de servicios de llamada al sistema.
Proyecto Debian:
Debian o Proyecto Debian es una comunidad conformada por desarrolladores y usuarios, que
mantiene un sistema operativo GNU basado en software libre. El sistema se encuentra pre-
compilado, empaquetado y en formato deb para múltiples arquitecturas de computador y para
varios núcleos.
TCP:
Protocolo de control de transmisión (en inglés Transmission Control Protocol o TCP), es uno de
los protocolos fundamentales en Internet. Muchos programas dentro de una red de datos
compuesta por redes de computadoras usan TCP para crear “conexiones” entre sí a través de
las cuales puede enviarse un flujo de datos. El protocolo garantiza que los datos serán
entregados en su destino sin errores y en el mismo orden en que se transmitieron.
Red Hat:
Red Hat, Inc. es una multinacional americana de software que provee software de código abierto
principalmente a empresas. Red Hat es conocida en gran medida por su sistema operativo
empresarial Red Hat Enterprise Linux y por la adquisición del proveedor de middleware
empresarial de código abierto JBoss. Red Hat también ofrece Red Hat Virtualization (RHV), un
producto de virtualización empresarial. Red Hat proporciona almacenamiento, plataformas de
sistemas 8 BIBLIOGRAFÍA
37
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
38
Brindando servicios con rocket container – Marco Antonio Carrillo Padilla
RADU, G., MATTHEW, H. L., & ROY , R. (2016). Elasticsearch in action. Manning
Publications Co.
39