
V tomto článku se budeme zabývat principem fungování , a také zde bude praktická část s jejich připojením k Dockeru.
O obecných problémech s Dockerem a variantách jejich řešení již , dnes stručně popíšu implementaci založenou na Kata Containers. Kata Containers je bezpečné prostředí pro spuštění kontejnerů založené na lehkých virtuálních strojích. Práce s nimi probíhá stejně jako s jinými kontejnery, ale navíc je zde poskytována spolehlivější izolace pomocí technologie virtualizace hardwaru. Projekt začal v roce 2017, když stejnojmenné společenství dokončilo sloučení nejlepších myšlenek z Intel Clear Containers a Hyper.sh RunV, poté pokračovalo v podpoře různých architektur, včetně AMD64, ARM, IBM p- a z-series. Dále je podporována práce uvnitř hypervizorů QEMU, Firecracker, a také je zde integrace s containerd. Kód je dostupný na je licencován pod MIT licencí.
Hlavní funkce
- Práce s odděleným jádrem, tímto způsobem je zajištěna izolace sítě, paměti a operací vstupu a výstupu, je zde možnost vynuceného použití hardwarové izolace na základě rozšíření virtualizace
- Podpora průmyslových standardů, včetně OCI (formát kontejnerů), Kubernetes CRI
- Stabilní výkon běžných kontejnerů Linuxu, zvýšení izolace bez režijních nákladů, které by ovlivnily výkon běžných virtuálních strojů
- Odstranění potřeby spouštět kontejnery uvnitř plnohodnotných virtuálních strojů, standardizované rozhraní usnadňuje integraci a spuštění
Instalace
Existuje variant instalace, podívám se na instalaci z repozitářů, na základě operačního systému Centos 7.
Je důležité: práce s Kata Containers je podporována pouze na hardwaru, prohoz virtualizace nefunguje vždy, také je potřebná podpora sse4.1 od procesoru.
Instalace Kata Containers je poměrně jednoduchá:
Instalujeme utility pro práci s repozitáři:
# yum -y install yum-utilsZakazujeme Selinux (správněji — nastavit, ale pro zjednodušení ho zakazuji):
# setenforce 0
# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/configPřipojujeme repozitář a provádíme instalaci
# 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-shimNastavení
Budu provádět nastavení pro práci s Dockerem, jeho instalace je standardní, nebudu ji popisovat podrobněji:
# 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 369ce74a3cProvádíme úpravy v daemon.json:
# cat <<EOF > /etc/docker/daemon.json
{
"default-runtime": "kata-runtime",
"runtimes": {
"kata-runtime": {
"path": "/usr/bin/kata-runtime"
}
}
}
EOFRestartujeme docker:
# service docker restartKontrola stavu
Pokud spustíte kontejner před restartem dockeru — můžete vidět, že uname vrátí verzi jádra spuštěného na základním systému:
# 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/LinuxPo restartu — verze jádra vypadá takto:
# 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/LinuxJeště příkazy!
# 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.050sRychlé zátěžové testování
Pro vyhodnocení ztrát způsobených virtualizací spouštím sysbench, jako hlavní příklady .
Spuštění sysbench s použitím Docker+containerd
Test procesoru
sysbench 1.0: vícerozměrný systémový hodnotící benchmark
Spuštění testu s následujícími možnostmi:
Počet vláken: 1
Inicializace generátoru náhodných čísel z aktuálního času
Limit prvočísel: 20000
Inicializace pracovních vláken...
Vlákna byla spuštěna!
Obecné statistiky:
celkový čas: 36.7335s
celkový počet událostí: 10000
celkový čas strávený vykonáním události: 36.7173s
doba odezvy:
min: 3.43ms
avg: 3.67ms
max: 8.34ms
přibližně 95. percentil: 3.79ms
Spravedlnost vláken:
události (avg/stddev): 10000.0000/0.00
doba vykonání (avg/stddev): 36.7173/0.00Test operační paměti
sysbench 1.0: vícerozměrný systémový hodnotící benchmark
Spuštění testu s následujícími možnostmi:
Počet vláken: 1
Inicializace generátoru náhodných čísel z aktuálního času
Inicializace pracovních vláken...
Vlákna byla spuštěna!
Provedené operace: 104857600 (2172673.64 ops/sec)
102400.00 MiB přeneseno (2121.75 MiB/sec)
Obecné statistiky:
celkový čas: 48.2620s
celkový počet událostí: 104857600
celkový čas strávený vykonáním události: 17.4161s
doba odezvy:
min: 0.00ms
avg: 0.00ms
max: 0.17ms
přibližně 95. percentil: 0.00ms
Spravedlnost vláken:
události (avg/stddev): 104857600.0000/0.00
doba vykonání (avg/stddev): 17.4161/0.00Spuštění sysbench s použitím Docker+Kata Containers
Test procesoru
sysbench 1.0: vícerozměrný systémový hodnotící benchmark
Spuštění testu s následujícími možnostmi:
Počet vláken: 1
Inicializace generátoru náhodných čísel z aktuálního času
Limit prvočísel: 20000
Inicializace pracovních vláken...
Vlákna byla spuštěna!
Obecné statistiky:
celkový čas: 36.5747s
celkový počet událostí: 10000
celkový čas strávený vykonáním události: 36.5594s
doba odezvy:
min: 3.43ms
avg: 3.66ms
max: 4.93ms
přibližně 95. percentil: 3.77ms
Spravedlnost vláken:
události (avg/stddev): 10000.0000/0.00
doba vykonání (avg/stddev): 36.5594/0.00Test operační paměti
sysbench 1.0: vícerozměrný systémový hodnotící benchmark
Spuštění testu s následujícími možnostmi:
Počet vláken: 1
Inicializace generátoru náhodných čísel z aktuálního času
Inicializace pracovních vláken...
Vlákna byla spuštěna!
Provedené operace: 104857600 (2450366.94 ops/sec)
102400.00 MiB přeneseno (2392.94 MiB/sec)
Obecné statistiky:
celkový čas: 42.7926s
celkový počet událostí: 104857600
celkový čas strávený vykonáním události: 16.1512s
doba odezvy:
min: 0.00ms
avg: 0.00ms
max: 0.43ms
přibližně 95. percentil: 0.00ms
Spravedlnost vláken:
události (avg/stddev): 104857600.0000/0.00
doba vykonání (avg/stddev): 16.1512/0.00V zásadě je situace už jasná, ale optimálnější je spouštět testy několikrát, odstraňovat výkyvy a průměrovat výsledky, takže zatím nedělám víc testů.
Závěry
I když spuštění takových kontejnerů trvá zhruba pět až desetkrát déle (typický čas spuštění podobných příkazů při použití containerd — méně než třetina sekundy) — stále fungují dost rychle, pokud vezmeme absolutní čas spuštění (výše jsou příklady, příkazy se průměrně vykonávají za tři sekundy). A výsledky rychlého testu CPU a RAM ukazují prakticky stejné výsledky, což nemůže než těšit, zvlášť vzhledem k tomu, že izolace je zajištěna tak dobře zavedeným mechanismem, jako je kvm.
Oznámení
Článek je přehledný, ale dává možnost seznámit se s alternativním runtime. Mnoho oblastí použití není pokryto, například na stránkách je popsána možnost spuštění Kubernetes nad Kata Containers. Dále lze provést řadu testů zaměřených na hledání bezpečnostních problémů, nastavení omezení a další zajímavé věci.
Žádám všechny, kdo dočetli nebo přetáhli sem, aby se zúčastnili ankety, od které budou záviset budoucí publikace na toto téma.
Pouze registrovaní uživatelé se mohou účastnit ankety. , prosím.
Měly by se dál publikovat články o Kata Containers?
80,0%Ano, piš ještě!
20,0%Ne, nemělo by se...
Hlasovalo 35 uživatelů. Zdrželo se 7 uživatelů.
Zdroj: habr.com
