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
- Sous licence Apache 2.0
- Première diffusion le 26 nov. 2014 sur Github
- Version actuelle : 0.3.0+ (5 fév. 2015)
- 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
