Krátký přehled a nastavení Kata Containers

Krátký přehled a nastavení Kata Containers
V tomto článku se budeme zabývat principem fungování Kata Containers, 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ž bylo napsáno, 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 GitHub 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 objevilo mnoho 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-utils

Zakazujeme Selinux (správněji — nastavit, ale pro zjednodušení ho zakazuji):

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

Př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-shim

Nastavení

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 369ce74a3c

Provádíme úpravy v daemon.json:

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

Restartujeme docker:

# service docker restart

Kontrola 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/Linux

Po 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/Linux

Ješ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.050s

Rychlé zátěžové testování

Pro vyhodnocení ztrát způsobených virtualizací spouštím sysbench, jako hlavní příklady beru tuto variantu.

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.00

Test 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.00

Spuš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.00

Test 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.00

V 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. Přihlaste se, 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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster