Google a créé gVisor, un runtime de conteneur en bac à sable qui fournit une couche d’isolation entre l'application conteneur et l'OS hôte sans recourir à la virtualisation.

Comme Kata Containers, Google gVisor est conforme OCI et s'intègre avec Docker et Kubernetes. Cependant, gVisor est plus flexible et affiche une empreinte encore plus petite. Le noyau gVisor fonctionne comme un processus d'espace utilisateur non privilégié qui supporte la plupart des appels système Linux. Pour créer le bac à sable, gVisor isole les traitements du système d’exploitation hôte en interceptant ces appels et en créant un environnement qui obtient son propre noyau et un ensemble de ressources virtualisées.

Google a basé gVisor sur des technologies déjà en production et a rendu le service disponible comme un projet open source sur GitHub sous la licence Apache 2.0. Le service ne prend en charge que Linux, tant pour l’hôte que pour les conteneurs.

Bien que gVisor soit plus léger que Kata Containers, gVisor ne peut pas exécuter toutes les applications Linux car il ne supporte pas tous les appels système proposés par Linux. Actuellement, le projet gVisor sur GitHub montre que seul un éventail limité d’applications et d’images a été testé. Malgré tout, gVisor est très prometteur – assez en tout cas pour que les organisations de l'industrie des conteneurs le prennent au sérieux.

Docker

Remarque: cet article nécessite Docker version 17.09.0 ou supérieure. Reportez-vous à la documentation Docker pour savoir comment l'installer.  

Installation

Le gVisor de Google existe pour fournir un véritable bac à sable pour vos conteneurs Docker. Il remplace runc, le runtime Docker par défaut qui présentait récemment une grave vulnérabilité.  En théorie, gVisor est un remplacement direct de runc, mais fonctionne-t-il réellement avec un VPS Linux Ubuntu ?

Sur votre poste Linux :

curl -LsO  https://storage.googleapis.com/gvisor/releases/nightly/latest/runsc
chmod +x runsc
mv runsc /usr/local/bin
cat <<EOF >> /etc/docker/daemon.json
{
    "runtimes": {
        "runsc": {
            "path": "/usr/local/bin/runsc"
       }
    }
}
EOF
systemctl restart docker

Vous pouvez désormais exécuter des conteneurs avec gVisor en ajoutant l'indicateur --runtime = runsc à vos commandes Docker.  Cela seul n'est pas particulièrement utile, car nous comptons sur Docker pour orchestrer et exécuter des conteneurs pour nous.

Tout ce que nous devons faire est d'ajouter une valeur supplémentaire au fichier de configuration Docker en tant que root svp :

root@gabriel-Latitude-E6320:/home/gabriel# cat <<EOF >> /etc/docker/daemon.json
> {
>     "runtimes": {
>         "runsc": {
>             "path": "/usr/local/bin/runsc"
>        }
>     }
> }
> EOF

Vous devez redémarrer le démon Docker après avoir apporté des modifications à ce fichier, généralement cela se fait via systemd:

sudo systemctl restart docker

On repasse en non-sudo et on déploie une image de test comme Nginx :

root@gabriel-Latitude-E6320:/home/gabriel# su gabriel
gabriel@gabriel-Latitude-E6320:~$ docker run -d nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
68ced04f60ab: Pull complete 
28252775b295: Pull complete 
a616aa3b0bf2: Pull complete 
Digest: sha256:2539d4344dd18e1df02be842ffc435f8e1f699cfc55516e2cf2cb16b7a9aea0b
Status: Downloaded newer image for nginx:latest
644433ffef132fb6c4e850c3a3b05872f398173f0a045921facb7ba06e493df5

Après avoir redémarré Docker, nous pouvons voir que les conteneurs sont maintenant mis en sandbox à l'aide de gVisor:

gabriel@gabriel-Latitude-E6320:~$ ps aux | grep '[r]unc'
root     21060  0.0  0.0 107632  5428 ?        Sl   19:25   0:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/644433ffef132fb6c4e850c3a3b05872f398173f0a045921facb7ba06e493df5 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc

On peut inspecter un container Gvisor avec runsc :

gabriel@gabriel-Latitude-E6320:~$ docker run --runtime=runsc --rm -it ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
5bed26d33875: Pull complete 
f11b29a9c730: Pull complete 
930bda195c84: Pull complete 
78bf9a5ad49e: Pull complete 
Digest: sha256:bec5a2727be7fff3d308193cfde3491f8fba1a2ba392b7546b43a051853a341d
Status: Downloaded newer image for ubuntu:latest
root@bc4e76634bac:/# exit

Vérifiez le runtime

Vous pouvez vérifier que vous exécutez dans gVisor à l'aide de la commande dmesg :

gabriel@gabriel-Latitude-E6320:~$ docker run --runtime=runsc -it ubuntu dmesg
[    0.000000] Starting gVisor...
[    0.565248] Mounting deweydecimalfs...
[    0.946274] Creating cloned children...
[    1.114874] Searching for needles in stacks...
[    1.122086] Daemonizing children...
[    1.597467] Checking naughty and nice process list...
[    1.889087] Reticulating splines...
[    2.020580] Constructing home...
[    2.306503] Waiting for children...
[    2.756446] Digging up root...
[    2.864298] Rewriting operating system in Javascript...
[    3.130087] Ready!