Resumen y configuración de Kata Containers

Resumen y configuración de Kata Containers
En este artículo se abordará el principio de funcionamiento Kata Containers, así como también habrá una parte práctica con su conexión a Docker.

Sobre los problemas generales con Docker y sus posibles soluciones ya se ha escrito, hoy describiré brevemente la implementación de Kata Containers. Kata Containers es un entorno seguro de ejecución (runtime) de contenedores basado en máquinas virtuales ligeras. El trabajo con ellos se realiza de la misma manera que con otros contenedores, pero se ofrece una mayor aislamiento utilizando tecnología de virtualización de hardware. El proyecto comenzó en 2017, cuando la comunidad del mismo nombre completó la fusión de las mejores ideas de Intel Clear Containers y Hyper.sh RunV, después de lo cual el trabajo continuó para admitir diversas arquitecturas, incluyendo AMD64, ARM, IBM p- y z-series. Además, se admite la operación dentro de hipervisores como QEMU, Firecracker, y también hay integración con containerd. El código está disponible en GitHub bajo licencia MIT.

Principales características

  • El trabajo con un núcleo separado garantiza así el aislamiento de red, memoria y operaciones de entrada/salida, hay posibilidad de forzar el uso de aislamiento hardware basado en extensiones de virtualización
  • Soporte de normas industriales, incluyendo OCI (formato de contenedores), Kubernetes CRI
  • Rendimiento estable de contenedores Linux comunes, aumento del aislamiento sin sobrecargas que afecten el rendimiento de las máquinas virtuales convencionales
  • Eliminación de la necesidad de ejecutar contenedores dentro de máquinas virtuales completas, las interfaces estándar simplifican la integración y el lanzamiento

Instalación

Hay una gran cantidad Para las opciones de instalación, revisaré la instalación desde los repositorios, basado en el sistema operativo Centos 7.
Importante: el funcionamiento de Kata Containers solo se admite en hardware, el paso de virtualización no siempre funciona, además se requiere soporte sse4.1 del procesador.

La instalación de Kata Containers es bastante simple:

Instalamos las utilidades para trabajar con repositorios:

# yum -y install yum-utils

Desactivamos Selinux (lo correcto sería configurarlo, pero por simplicidad lo desactivaré):

# setenforce 0
# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

Conectamos el repositorio y procedemos con la instalación

# source /etc/os-release
# ARCH=$(arch)
# BRANCH="${BRANCH:-stable-1.10}"
# yum-config-manager --add-repo "http://download.opensuse.org/repositories/home:/katacontainers:/releases:/${ARCH}:/${BRANCH}/CentOS_${VERSION_ID}/home:katacontainers:releases:${ARCH}:${BRANCH}.repo"
# yum -y install kata-runtime kata-proxy kata-shim

Configuración

Realizaré la configuración para trabajar con Docker, su instalación es estándar, no la detallaré más:

# rpm -qa | grep docker
docker-ce-cli-19.03.6-3.el7.x86_64
docker-ce-19.03.6-3.el7.x86_64
# docker -v
Docker version 19.03.6, build 369ce74a3c

Realizamos cambios en daemon.json:

# cat <<EOF > /etc/docker/daemon.json
{
  "default-runtime": "kata-runtime",
  "runtimes": {
    "kata-runtime": {
      "path": "/usr/bin/kata-runtime"
    }
  }
}
EOF

Reiniciamos Docker:

# service docker restart

Verificación de funcionamiento

Si se inicia un contenedor antes de reiniciar Docker, se puede ver que uname presenta la versión del núcleo en ejecución en el sistema principal:

# docker run busybox uname -a
Linux 19efd7188d06 3.10.0-1062.12.1.el7.x86_64 #1 SMP Tue Feb 4 23:02:59 UTC 2020 x86_64 GNU/Linux

Después del reinicio, la versión del núcleo se ve así:

# docker run busybox uname -a
Linux 9dd1f30fe9d4 4.19.86-5.container #1 SMP Sat Feb 22 01:53:14 UTC 2020 x86_64 GNU/Linux

¡Más comandos!

# time docker run busybox mount
kataShared on / type 9p (rw,dirsync,nodev,relatime,mmap,access=client,trans=virtio)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev type tmpfs (rw,nosuid,size=65536k,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,relatime,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (ro,nosuid,nodev,noexec,relatime,xattr,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/blkio type cgroup (ro,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (ro,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/perf_event type cgroup (ro,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (ro,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/freezer type cgroup (ro,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/pids type cgroup (ro,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
kataShared on /etc/resolv.conf type 9p (rw,dirsync,nodev,relatime,mmap,access=client,trans=virtio)
kataShared on /etc/hostname type 9p (rw,dirsync,nodev,relatime,mmap,access=client,trans=virtio)
kataShared on /etc/hosts type 9p (rw,dirsync,nodev,relatime,mmap,access=client,trans=virtio)
proc on /proc/bus type proc (ro,relatime)
proc on /proc/fs type proc (ro,relatime)
proc on /proc/irq type proc (ro,relatime)
proc on /proc/sys type proc (ro,relatime)
tmpfs on /proc/acpi type tmpfs (ro,relatime)
tmpfs on /proc/timer_list type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /sys/firmware type tmpfs (ro,relatime)

real    0m2.381s
user    0m0.066s
sys 0m0.039s

# time docker run busybox free -m
              total        used        free      shared  buff/cache   available
Mem:           1993          30        1962           0           1        1946
Swap:             0           0           0

real    0m3.297s
user    0m0.086s
sys 0m0.050s

Pruebas de carga rápidas

Para evaluar las pérdidas por virtualización, ejecuto sysbench, como ejemplos principales elijo esta opción.

Ejecución de sysbench utilizando Docker+containerd

Prueba del procesador

sysbench 1.0:  evaluación de sistemas en múltiples hilos

Ejecutando la prueba con las siguientes opciones:
Número de hilos: 1
Inicializando el generador de números aleatorios desde el tiempo actual

Límite de números primos: 20000

Inicializando hilos trabajadores...

¡Hilos iniciados!

Estadísticas generales:
    tiempo total:                          36.7335s
    número total de eventos:              10000
    tiempo total tomado por ejecución de eventos: 36.7173s
    tiempo de respuesta:
         mínimo:                                  3.43ms
         promedio:                                  3.67ms
         máximo:                                  8.34ms
         aproximadamente  95 percentil:               3.79ms

Equidad entre hilos:
    eventos (promedio/desviación estándar):           10000.0000/0.00
    tiempo de ejecución (promedio/desviación estándar):   36.7173/0.00

Prueba de la memoria RAM

sysbench 1.0:  evaluación de sistemas en múltiples hilos

Ejecutando la prueba con las siguientes opciones:
Número de hilos: 1
Inicializando el generador de números aleatorios desde el tiempo actual

Inicializando hilos trabajadores...

¡Hilos iniciados!

Operaciones realizadas: 104857600 (2172673.64 ops/seg)

102400.00 MiB transferidos (2121.75 MiB/seg)

Estadísticas generales:
    tiempo total:                          48.2620s
    número total de eventos:              104857600
    tiempo total tomado por ejecución de eventos: 17.4161s
    tiempo de respuesta:
         mínimo:                                  0.00ms
         promedio:                                  0.00ms
         máximo:                                  0.17ms
         aproximadamente  95 percentil:               0.00ms

Equidad entre hilos:
    eventos (promedio/desviación estándar):           104857600.0000/0.00
    tiempo de ejecución (promedio/desviación estándar):   17.4161/0.00

Ejecución de sysbench utilizando Docker+Kata Containers

Prueba del procesador

sysbench 1.0:  evaluación de sistemas en múltiples hilos

Ejecutando la prueba con las siguientes opciones:
Número de hilos: 1
Inicializando el generador de números aleatorios desde el tiempo actual

Límite de números primos: 20000

Inicializando hilos trabajadores...

¡Hilos iniciados!

Estadísticas generales:
    tiempo total:                          36.5747s
    número total de eventos:              10000
    tiempo total tomado por ejecución de eventos: 36.5594s
    tiempo de respuesta:
         mínimo:                                  3.43ms
         promedio:                                  3.66ms
         máximo:                                  4.93ms
         aproximadamente  95 percentil:               3.77ms

Equidad entre hilos:
    eventos (promedio/desviación estándar):           10000.0000/0.00
    tiempo de ejecución (promedio/desviación estándar):   36.5594/0.00

Prueba de la memoria RAM

sysbench 1.0:  evaluación de sistemas en múltiples hilos

Ejecutando la prueba con las siguientes opciones:
Número de hilos: 1
Inicializando el generador de números aleatorios desde el tiempo actual

Inicializando hilos trabajadores...

¡Hilos iniciados!

Operaciones realizadas: 104857600 (2450366.94 ops/seg)

102400.00 MiB transferidos (2392.94 MiB/seg)

Estadísticas generales:
    tiempo total:                          42.7926s
    número total de eventos:              104857600
    tiempo total tomado por ejecución de eventos: 16.1512s
    tiempo de respuesta:
         mínimo:                                  0.00ms
         promedio:                                  0.00ms
         máximo:                                  0.43ms
         aproximadamente  95 percentil:               0.00ms

Equidad entre hilos:
    eventos (promedio/desviación estándar):           104857600.0000/0.00
    tiempo de ejecución (promedio/desviación estándar):   16.1512/0.00

En principio, la situación ya está clara, pero es más óptimo ejecutar las pruebas varias veces, eliminando los valores atípicos y promediando los resultados; por lo tanto, no haré más pruebas por ahora.

Conclusiones

A pesar de que ejecutar estos contenedores toma aproximadamente de cinco a diez veces más tiempo (el tiempo típico de inicio de comandos similares al usar containerd es menos de un tercio de segundo) — aún funcionan bastante rápido, si consideramos el tiempo absoluto de inicio (más arriba hay ejemplos, los comandos se ejecutan en promedio en tres segundos). Y los resultados de la prueba rápida de CPU y RAM muestran resultados prácticamente idénticos, lo cual es alentador, especialmente dado que el aislamiento se logra con un mecanismo tan bien probado como kvm.

Anuncio

El artículo es un resumen, pero permite explorar un runtime alternativo. No se cubren muchas áreas de aplicación, por ejemplo, en el sitio se describe la posibilidad de ejecutar Kubernetes sobre Kata Containers. También se pueden realizar varias pruebas orientadas a la búsqueda de problemas de seguridad, establecer restricciones y otros aspectos interesantes.

Pido a todos los que han leído o saltado aquí que participen en la encuesta, de la que dependerán las futuras publicaciones sobre este tema.

Solo los usuarios registrados pueden participar en la encuesta. Inicie sesión, por favor.

¿Deberíamos seguir publicando artículos sobre Kata Containers?

  • 80,0%¡Sí, escribe más!28

  • 20,0%No, no es necesario…7

Votaron 35 usuarios. Se abstuvieron 7 usuarios.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster