Кратък преглед и настройка на Kata Containers

Кратък преглед и настройка на Kata Containers
В тази статия ще бъде разгледан принципът на работа Kata Containers, а също така ще има практическа част с тяхното свързване с Docker.

За общите проблеми с Docker и вариантите за решения вече беше написано, днес накратко ще опиша реализирането на Kata Containers. Kata Containers — безопасна среда за изпълнение (runtime) на контейнери на базата на облегчените виртуални машини. Работата с тях става по същия начин, както и с другите контейнери, но допълнително предлага по-надеждна изолация с помощта на технологията за виртуализация на хардуера. Проектът стартира през 2017 година, а едноименното общество тогава завърши сливанията на най-добрите идеи от Intel Clear Containers и Hyper.sh RunV, след което работата продължи с поддръжката на различни архитектури, включително AMD64, ARM, IBM p- и z-серии. Освен това се поддържа работа вътре в хипервизорите QEMU, Firecracker, а също така има интеграция с containerd. Кодът е наличен на GitHub под лиценз MIT.

Основни възможности

  • Работата с отделно ядро, по този начин се осигурява изолация на мрежата, паметта и операциите за вход-изход, има възможност за принудително използване на хардуерна изолация, основаваща се на разширенията за виртуализация
  • Поддръжка на индустриални стандарти, включително OCI (формат на контейнери), Kubernetes CRI
  • Стабилна производителност на обикновените контейнери на Linux, увеличаване на изолацията без разходи, влияещи на производителността на обикновените виртуални машини
  • Премахване на необходимостта от стартиране на контейнери вътре в пълноценни виртуални машини, стандартните интерфейси опростяват интеграцията и стартирането

Инсталиране на

Има множество варианти на инсталация, ще разгледам инсталацията от хранилищата, на базата на операционната система Centos 7.
Важно: работата на Kata Containers се поддържа само на хардуер, пробиването на виртуализация не работи винаги, също така е необходима поддръжка на sse4.1 от процесора.

Инсталацията на Kata Containers е доста проста:

Инсталираме утилитите за работа с хранилищата:

# yum -y install yum-utils

Отключваме Selinux (по-правилно — настройваме, но за простота го отключвам):

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

Свързваме хранилището и извършваме инсталацията

# 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

Настройка

Ще извърша настройка за работа с docker, инсталацията му е стандартна, няма да я описвам подробно:

# 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

Правим корекции в daemon.json:

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

Рестартираме docker:

# service docker restart

Проверка на работоспособността

Ако стартирате контейнер преди рестартиране на docker — можете да видите, че uname ще даде версията на ядрото, стартирано на основната система:

# 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

След рестартиране — версията на ядрото изглежда така:

# 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

Още команди!

# 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

Бързо натоварващо тестване

За оценка на загубите от виртуализация – стартирам sysbench, като основни примери избирам този вариант.

Стартиране на sysbench с Docker+containerd

Тест на процесора

sysbench 1.0: многонишков бенчмарк за оценка на системата

Стартиране на теста с以下 опции:
Брой нишки: 1
Инициализиране на генератора на случайни числа от текущото време

Граница на простите числа: 20000

Инициализиране на работните нишки...

Нишките стартираха!

Общи статистики:
    общо време:                          36.7335s
    общ брой събития:                   10000
    общо време за изпълнение на събитията: 36.7173s
    време за отговор:
         мин:                                  3.43ms
         средно:                               3.67ms
         макс:                                 8.34ms
         прибл.  95-ти процентил:              3.79ms

Справедливост на нишките:
    събития (средно/стандартно отклонение): 10000.0000/0.00
    време на изпълнение (средно/стандартно отклонение): 36.7173/0.00

Тест на оперативната памет

sysbench 1.0: многонишков бенчмарк за оценка на системата

Стартиране на теста с以下 опции:
Брой нишки: 1
Инициализиране на генератора на случайни числа от текущото време

Инициализиране на работните нишки...

Нишките стартираха!

Извършени операции: 104857600 (2172673.64 ops/sec)

102400.00 MiB прехвърлени (2121.75 MiB/sec)

Общи статистики:
    общо време:                          48.2620s
    общ брой събития:                   104857600
    общо време за изпълнение на събитията: 17.4161s
    време за отговор:
         мин:                                  0.00ms
         средно:                               0.00ms
         макс:                                 0.17ms
         прибл.  95-ти процентил:              0.00ms

Справедливост на нишките:
    събития (средно/стандартно отклонение): 104857600.0000/0.00
    време на изпълнение (средно/стандартно отклонение): 17.4161/0.00

Стартиране на sysbench с Docker+Kata Containers

Тест на процесора

sysbench 1.0: многонишков бенчмарк за оценка на системата

Стартиране на теста с以下 опции:
Брой нишки: 1
Инициализиране на генератора на случайни числа от текущото време

Граница на простите числа: 20000

Инициализиране на работните нишки...

Нишките стартираха!

Общи статистики:
    общо време:                          36.5747s
    общ брой събития:                   10000
    общо време за изпълнение на събитията: 36.5594s
    време за отговор:
         мин:                                  3.43ms
         средно:                               3.66ms
         макс:                                 4.93ms
         прибл.  95-ти процентил:              3.77ms

Справедливост на нишките:
    събития (средно/стандартно отклонение): 10000.0000/0.00
    време на изпълнение (средно/стандартно отклонение): 36.5594/0.00

Тест на оперативната памет

sysbench 1.0: многонишков бенчмарк за оценка на системата

Стартиране на теста с以下 опции:
Брой нишки: 1
Инициализиране на генератора на случайни числа от текущото време

Инициализиране на работните нишки...

Нишките стартираха!

Извършени операции: 104857600 (2450366.94 ops/sec)

102400.00 MiB прехвърлени (2392.94 MiB/sec)

Общи статистики:
    общо време:                          42.7926s
    общ брой събития:                   104857600
    общо време за изпълнение на събитията: 16.1512s
    време за отговор:
         мин:                                  0.00ms
         средно:                               0.00ms
         макс:                                 0.43ms
         прибл.  95-ти процентил:              0.00ms

Справедливост на нишките:
    събития (средно/стандартно отклонение): 104857600.0000/0.00
    време на изпълнение (средно/стандартно отклонение): 16.1512/0.00

В принципе ситуация вече е ясна, но е по-оптимално да се извършват тестовете няколко пъти, премахвайки отклоненията и средявайки резултатите, така че за момента няма да правя повече тестове.

Изводи

Въпреки че стартирането на такива контейнери отнема около пет до десет пъти повече време (типичното време за стартиране на аналогични команди с containerd е по-малко от една трета от секундата) — те все още работят достатъчно бързо, ако вземем абсолютното време за старт (по-горе има примери, командите се изпълняват средно за три секунди). Резултатите от бързия тест на CPU и RAM показват практически еднакви резултати, което не може да не радва, особено предвид факта, че изолацията се осигурява чрез добре отработения механизъм KVM.

Анонс

Статията е обзорна, но дава възможност да се опитат алтернативни runtime. Не са обхванати много области на приложение, например на сайта е описана възможността за стартиране на Kubernetes над Kata Containers. Освен това може да се проведе редица тестове, насочени към търсене на проблеми с безопасността, поставяне на ограничения и други интересни неща.

Моля всички, които четат или превъртат тук, да участват в анкетата, от която зависят бъдещите публикации по тази тема.

Само регистрирани потребители могат да участват в анкетата. Влезте, моля.

Стои ли въпросът за продължаване на публикацията на статии за Kata Containers?

  • 80,0%Да, пиши още!

  • 20,0%Не, не трябва...

Гласували 35 потребители. Въздържали се 7 потребители.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster