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