Breve visão geral e configuração dos Kata Containers

Breve visão geral e configuração dos Kata Containers
Este artigo irá discutir como funciona Recipientes de Kata, e também haverá uma parte prática com a conexão deles com o Docker.

Sobre problemas comuns com o Docker e suas soluções já foi escrito, hoje vou descrever brevemente a implementação do Kata Containers. O Kata Containers é um tempo de execução de contêiner seguro baseado em máquinas virtuais leves. Trabalhar com eles é o mesmo que com outros contêineres, mas, além disso, há um isolamento mais confiável usando a tecnologia de virtualização de hardware. O projeto começou em 2017, quando a comunidade de mesmo nome concluiu a fusão das melhores ideias da Intel Clear Containers e Hyper.sh RunV, após o que o trabalho continuou no suporte para várias arquiteturas, incluindo AMD64, ARM, IBM p- e z -Series. Além disso, o trabalho é suportado dentro dos hipervisores QEMU, Firecracker e também há integração com containerd. O código está disponível em GitHub sob a licença do MIT.

Principais recursos

  • Trabalhando com um núcleo separado, proporcionando assim isolamento de rede, memória e I/O, é possível forçar o uso de isolamento de hardware baseado em extensões de virtualização
  • Suporte para padrões do setor, incluindo OCI (formato de contêiner), Kubernetes CRI
  • Desempenho consistente de contêineres Linux regulares, maior isolamento sem a sobrecarga de desempenho de VMs regulares
  • Elimine a necessidade de executar contêineres dentro de máquinas virtuais completas, as interfaces genéricas simplificam a integração e o lançamento

Instalação

Tem muitos opções de instalação, considerarei a instalação dos repositórios, com base no sistema operacional Centos 7.
É importante: O trabalho do Kata Containers é suportado apenas em hardware, o encaminhamento de virtualização nem sempre funciona, também precisa de suporte sse4.1 do processador.

A instalação do Kata Containers é bastante simples:

Instale utilitários para trabalhar com repositórios:

# yum -y install yum-utils

Desabilite o Selinux (é mais correto configurar, mas para simplificar eu desabilito):

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

Conectamos o repositório e realizamos a instalação

# 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

Fixação

Estarei configurando para trabalhar com docker, sua instalação é típica, não vou descrever com mais detalhes:

# 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

Fazemos alterações no daemon.json:

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

Reinicie a janela de encaixe:

# service docker restart

Testes Funcionais

Se você iniciar o contêiner antes de reiniciar o docker, poderá ver que o uname fornecerá a versão do kernel em execução no 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

Após uma reinicialização, a versão do kernel fica assim:

# 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

Mais equipes!

# 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

Teste de carga rápida

Para avaliar as perdas da virtualização - eu corro o sysbench, como os principais exemplos pegue esta opção.

Executando sysbench usando Docker+containerd

Teste de processador

sysbench 1.0:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time

Prime numbers limit: 20000

Initializing worker threads...

Threads started!

General statistics:
    total time:                          36.7335s
    total number of events:              10000
    total time taken by event execution: 36.7173s
    response time:
         min:                                  3.43ms
         avg:                                  3.67ms
         max:                                  8.34ms
         approx.  95 percentile:               3.79ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   36.7173/0.00

teste de RAM

sysbench 1.0:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time

Initializing worker threads...

Threads started!

Operations performed: 104857600 (2172673.64 ops/sec)

102400.00 MiB transferred (2121.75 MiB/sec)

General statistics:
    total time:                          48.2620s
    total number of events:              104857600
    total time taken by event execution: 17.4161s
    response time:
         min:                                  0.00ms
         avg:                                  0.00ms
         max:                                  0.17ms
         approx.  95 percentile:               0.00ms

Threads fairness:
    events (avg/stddev):           104857600.0000/0.00
    execution time (avg/stddev):   17.4161/0.00

Executando sysbench usando Docker+Kata Containers

Teste de processador

sysbench 1.0:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time

Prime numbers limit: 20000

Initializing worker threads...

Threads started!

General statistics:
    total time:                          36.5747s
    total number of events:              10000
    total time taken by event execution: 36.5594s
    response time:
         min:                                  3.43ms
         avg:                                  3.66ms
         max:                                  4.93ms
         approx.  95 percentile:               3.77ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   36.5594/0.00

teste de RAM

sysbench 1.0:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time

Initializing worker threads...

Threads started!

Operations performed: 104857600 (2450366.94 ops/sec)

102400.00 MiB transferred (2392.94 MiB/sec)

General statistics:
    total time:                          42.7926s
    total number of events:              104857600
    total time taken by event execution: 16.1512s
    response time:
         min:                                  0.00ms
         avg:                                  0.00ms
         max:                                  0.43ms
         approx.  95 percentile:               0.00ms

Threads fairness:
    events (avg/stddev):           104857600.0000/0.00
    execution time (avg/stddev):   16.1512/0.00

Em princípio, a situação já está clara, mas é mais ideal executar os testes várias vezes, removendo os valores discrepantes e tirando a média dos resultados, então ainda não faço mais testes.

Descobertas

Apesar do fato de que tais contêineres demoram cerca de cinco a dez vezes mais para inicializar (o tempo de execução típico para comandos semelhantes ao usar containerd é inferior a um terço de segundo), eles ainda funcionam muito rapidamente se tomarmos o tempo de início absoluto (há são exemplos acima, comandos executados em média três segundos). Bem, os resultados de um teste rápido de CPU e RAM mostram quase os mesmos resultados, o que não pode deixar de ser motivo de alegria, principalmente pelo fato de o isolamento ser fornecido por meio de um mecanismo tão bem executado como o kvm.

Anúncio

O artigo é uma revisão, mas dá a você a oportunidade de sentir o tempo de execução alternativo. Muitas áreas de aplicação não são cobertas, por exemplo, o site descreve a capacidade de executar o Kubernetes sobre Kata Containers. Além disso, você também pode executar uma série de testes focados em encontrar problemas de segurança, definir restrições e outras coisas interessantes.

Peço a todos que leram e voltaram até aqui que participem da pesquisa, da qual dependerão as futuras publicações sobre o tema.

Apenas usuários registrados podem participar da pesquisa. Entrarpor favor

Devo continuar a publicar artigos sobre Kata Containers?

  • 80,0%Sim, escreva mais!28

  • 20,0%Não, não…7

35 usuários votaram. 7 usuários se abstiveram.

Fonte: habr.com

Adicionar um comentário