App Container Specification

Introduction

  • Les conteneurs logiciels suscitent beaucoup d'intérêts
  • Le gestionnaire de conteneurs Docker rencontre un franc succès depuis sa publication en 2013
  • Docker a initié une standardisation de la notion de conteneur logiciel...
  • ...avant de changer de capte : on ne parle plus de conteneurs Docker mais de plateformes Docker
  • Le composant ré-utilisable Docker s'est transformé en véritable gestionnaire de clusters
  • Un contributeur actif de Docker a souhaité revenir à l'essence de Docker
  • La spécification App Container propose de standardiser la notion de conteneurs logiciels

Présentation

  • État de la spécification
  • Définit un format d'image, un mécanisme de découverte et un environnement d'exécution
    • Facilite la récupération et l'exécution de conteneurs
    • Assure la vérification et la mise en cache des conteneurs
    • Permet des implémentations indépendantes de runtimes
    • Basé sur des technologies communes pour le cryptage, l'archivage, la compression et le transport
    • Utilise le système de noms DNS pour nommer et découvrir des images de conteneurs

Composants

App Container Image (ACI)

App Container Executor (ACE)

App Container Metadata Service

App Container Image Discovery

Image d'un conteneur logiciel : fichiers et métadonnées nécessaire à l'exécution

Mécanisme de découverte : procédé pour identifier et localiser des conteneurs

Moteur d'exécution de conteneurs : gère le déploiement de conteneurs

Service de métadonnées : service fournissant des métadonnées aux conteneurs

App Container Image (ACI)

  • Archive contenant tous les fichiers et métadonnées nécessaires à l'exécution des apps du conteneurs
  • La racine de l'archive contient deux fichiers
    • Le fichier manifeste décrivant le contenu de l'image et la manière de l'exécuter
    • Le répertoire rootfs contenant les fichiers existant à la racine du conteneur de l'application (root "/")
  • Manipulée avec des technologies standards : HTTP, gpg, tar et gzip
  • Compressée au format gzip, bzip2 ou xz
  • Porte l'extension .aci et sa signature l'extension .aci.asc
  • Peut être cryptée avec l'algo de chiffrement symétrique AES
  • L'image ID permet d'identifier de manière unique un conteneur et de vérifier son intégrité
  • Le manifeste décrivant le conteneur est écrit en JSON

App Container Executor (ACE)

  • Chargé de déployer les conteneurs et d'initialiser leur environnement et exécutions
  • La spécification distingue deux aspects majeurs
    • Executor : étapes nécessaires à l'installation du conteneur
    • App : initialisation de l'environnement à l'intérieur du conteneur

hello.aci

App Container Executor

Executor Perspective

App Perspective

$ find .
/manifest
/rootfs
/rootfs/usr/bin/hello

Executor Perspective

  • Installe le système de fichier du conteneur
    • L'implémentation minimal consiste à extraire le contenu d'une image (ACI) dans un nouveau répertoire
cd $(mktemp -d -t temp.XXXX)
mkdir hello
tar xzvf /var/lib/pce/heelo.aci -C hello
  • Un conteneur exécute une ou plusieurs application avec des namspaces (PID, netword, mount, IPC, et UTS) partagés
    • Chaque application démarre dans son propre rootfs
    • Le manifeste définissant un conteneur décrit les applications pouvant être lancées
  • Assure le montage des répertoires
  • Gère la configuration réseau
  • Les logs des applications doivent être redirigées vers les sorties standard et d'erreur

App Perspective

  • Environnement d'exécution
    • PATH : /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    • USER, LOGNAME : nom de l'utilisateur exécutant l'application
    • HOME : répertoire home de l'utilisateur
    • SHELL : login de l'utilisateur dans le shell
    • AC_APP_NAME : nom de l'application
    • AC_METADATA_URL : URL du service de métadonnées
  • L'isolation de l'environnement peut être renforcée pour une application ou tout un conteneur via des filtres
    • cpu/shares
    • memory/limit
    • cpu/mask
    • block-io/read-bandwidth
    • network-io/write-bandwidth
    • ...

App Container Image Discovery

  • Mécanisme permettant d'identifier, de localiser, de valider et authentifier un conteneur à partir de son nom
    • Le nom d'un conteneur est semblable à une URL
    • Il peut contenir des paramètres pour identifier une application particulière (version, OS et architecture)
  • Découverte simplifié
    • Schéma : https://{name}-{version}-{os}-{arch}.aci[.asc]
    • example.com/hello > https://example.com/hello-1.0.0-linux-amd64.aci
  • "Méta" découverte
    • Déclenché si la découverte simplifiée échoue
    • Utilise HTTPS+HTML (tags meta) pour localiser un conteneur
    • URL et tags inspectées : https://example.com/hello?ac-discovery=1
      • <meta name="ac-discovery" content="prefix-match url-tmpl">
      • <meta name="ac-discovery-pubkeys" content="prefix-match url">

App Container Metadata Service

  • Il faut éviter d'écrire des fichiers sur le système hôte pour exécuter des conteneurs
  • L'ACE doit fournir un serveur fournissant les métadonnées des conteneurs
  • L'URL du service est stocké dans la variable d'environnement AC_METADATA_URL
  • Les clients interrogent le service avec le paramètre Metadata-Flavor: Appcontainer dans l'entête des requêtes
  • Le service fournit différentes métadonnée
    • Sur le conteneur
    • Sur les applications qu'ils contiennent
    • Sur l'identité des conteneurs (aspect sécurité)

Image Manifest Schema

{   "acKind": "ImageManifest",
    "acVersion": "0.3.0",
    "name": "example.com/reduce-worker",
    "labels": [
        { "name": "version", "value": "1.0.0" },
        { "name": "arch", "value": "amd64" },
        { "name": "os", "value": "linux" }
    ],
    "app": {
        "exec": [ "/usr/bin/reduce-worker", "--quiet" ],
        "user": "100",
        "group": "300",
        "eventHandlers": [
            {   "exec": [
                    "/usr/bin/data-downloader"
                ],
                "name": "pre-start"
            }, {"exec": [
                    "/usr/bin/deregister-worker",
                    "--verbose"
                ],
                "name": "post-stop"
            }
        ],
        "workingDirectory": "/opt/work",
        "environment": [
            { "name": "REDUCE_WORKER_DEBUG", "value": "true" }
        ],
        "isolators": [
            { "name": "cpu/shares", "value": "20" },
            { "name": "memory/limit", "value": "1G" },
            { "name": "cpu/mask", "value": "0-3" },
            { "name": "capabilities/bounding-set", 
                "value": "CAP_NET_BIND_SERVICE CAP_SYS_ADMIN" }
        ],
        "mountPoints": [
            {   "name": "work",
                "path": "/var/lib/work",
                "readOnly": false
            }
        ],

        "ports": [
            {   "name": "health",
                "port": 4000,
                "protocol": "tcp",
                "socketActivated": true
            }
        ]
    },
    "dependencies": [
        {
            "app": "example.com/reduce-worker-base",
            "imageID": "sha512-...",
            "labels": [
                { "name": "os", "value": "linux" },
                { "name": "env", "value": "canary" }
            ]
        }
    ],
    "pathWhitelist": [
        "/etc/ca/example.com/crt",
        "/usr/bin/map-reduce-worker",
        "/opt/libs/reduce-toolkit.so",
        "/etc/reduce-worker.conf",
        "/etc/systemd/system/"
    ],
    "annotations": [
        { "name": "authors",
            "value": "Carly Container, Nat Network" },
        { "name": "created", 
            "value": "2014-10-27T19:32:27.67021798Z" },
        { "name": "documentation",
            "value": "https://example.com/docs" },
        { "name": "homepage", 
            "value": "https://example.com" }
    ]
}

Container Runtime Manifest Schema

{

    "acVersion": "0.3.0",
    "acKind": "ContainerRuntimeManifest",
    "uuid": "6733C088-A507-4694-AABF-EDBE4FC5266F",
    "apps": [
        {
            "app": "example.com/reduce-worker-1.0.0",
            "imageID": "sha512-...",
            "mounts": [
                 {"volume": "work", "mountPoint": "work"}
            ]
        },
        {
            "app": "example.com/worker-backup-1.0.0",
            "imageID": "sha512-...",
            "isolators": [
                {
                    "name": "memory/limit",
                    "value": "1G"
                }
            ],
            "annotations": [
                {
                    "name": "foo",
                    "value": "baz"
                }
            ],
            "mounts": [
                 {"volume": "work", "mountPoint": "backup"}
            ]
        },
        {
            "app": "example.com/reduce-worker-register-1.0.0",
            "imageID": "sha512-..."
        }
    ],

    "volumes": [
        {
            "name": "work",
            "kind": "host",
            "source": "/opt/tenant1/work",
            "readOnly": true
        }
    ],
    "isolators": [
        {
           "name": "memory/limit",
           "value": "4G"
        }
    ],
    "annotations": [
        {
           "name": "ip-address",
           "value": "10.1.2.3"
        }
    ]
}

App Container Specification

By Steven Enten

App Container Specification

  • 931