Stockage/calcul distant (on oublie, cf. externalisation)
Virtualisation++
Abstraction du matériel (voire plus)
Accès normalisé par des APIs
Service et facturation à la demande
Flexibilité, élasticité
IaaS : Infrastructure as a Service
PaaS : Platform as a Service
SaaS : Software as a Service
Abstraction des couches basses
On peut tout programmer à son gré (API)
Permet la mise en place d’architectures scalables
Le cloud IaaS repose souvent sur la virtualisation
Ressources compute : virtualisation
Virtualisation complète : KVM, Xen
Virtualisation conteneurs : OpenVZ, LXC, Docker, RKT
L’instance est par définition éphémère
Elle doit être utilisée comme ressource de calcul
Séparer les données des instances
Groupement fonctionnel de ressources : micro services
Infrastructure as Code : Définir toute une infrastructure dans un seul fichier texte de manière déclarative
Scalabilité : passer à l'échelle son infrastructure en fonction de différentes métriques.
Facilitent la mise en place de PaaS
Fonctionnent sur du IaaS ou sur du bare-metal
Simplifient la décomposition d'applications en micro services
Namespaces
Cgroups (control groups)
CGroup: /
|--docker
| |--7a977a50f48f2970b6ede780d687e72c0416d9ab6e0b02030698c1633fdde956
| |--6807 nginx: master process ngin
| | |--6847 nginx: worker proces
Partage du kernel
Un seul processus par conteneur
Le conteneur est encore plus éphémère que l’instance
Le turnover des conteneurs est élevé : orchestration
Permettent d'exécuter des conteneurs sur un système
docker: historique
containerd: implémentation de référence
cri-o: implémentation Open Source développée par RedHat
kata containers: Conteneurs dans des VMs
Fonctionnalités offertes par le Kernel
Les conteneurs engine fournissent des interfaces d'abstraction
Plusieurs types de conteneurs pour différents besoins
Layers
Stockage
Volumes
Réseau
Publication de ports
Service Discovery
Les conteneurs et leurs images sont décomposés en couches (layers)
Les layers peuvent être réutilisés entre différents conteneurs
Gestion optimisée de l'espace disque.
Images Docker, données des conteneurs, volumes
A unification filesystem
Stable : performance écriture moyenne
Non intégré dans le Kernel Linux (mainline)
Basé sur LVM
Thin Provisionning et snapshot
Intégré dans le Kernel Linux (mainline)
Stable : performance écriture moyenne
Successeur de AUFS
Performances accrues
Relativement stable mais moins éprouvé que AUFS ou Device Mapper
Étendre les drivers de stockages disponibles
Utiliser des systèmes de fichier distribués (GlusterFS)
Partager des volumes entre plusieurs hôtes docker
Assurent une persistance des données
Indépendance du volume par rapport au conteneur et aux layers
Partage de volumes entre plusieurs conteneurs
Permettre le partage de volumes entre differents hôtes
Fonctionnalité avancées : snapshot, migration, restauration
NETWORK ID NAME DRIVER
42f7f9558b7a bridge bridge
6ebf7b150515 none null
0509391a1fbd host host
Refactorisation des composants réseau (libnetwork)
Système de plugins : multi host et multi backend (overlay network)
Dans le cas d'un réseau diffèrent de l'hôte
Les conteneurs ne sont pas accessible depuis l'extérieur
Possibilité de publier des ports depuis l'hôte vers le conteneur (iptables)
L'hôte sert de proxy au service
Les conteneurs d'un même réseau peuvent communiquer via IP
Les liens permettent de lier deux conteneurs par nom
Système de DNS rudimentaire (/etc/hosts
)
Remplacés par les discovery services
Les composants de Docker sont modulaires
Nombreuses possibilités offertes par défaut.
Possibilité d'étendre les fonctionnalités via des plugins
Flexibilité et élasticité
Format standard de facto
Instanciation illimitée
Possibilité de construire son image à la main (long et source d'erreurs)
Suivi de version et construction d'images de manière automatisée
Utilisation de Dockerfile afin de garantir l'idempotence des images
Suite d'instruction qui définit une image
Permet de vérifier le contenu d'une image
FROM alpine:3.4
MAINTAINER Particule <admin@particule.io>
RUN apk -U add nginx
EXPOSE 80 443
CMD ["nginx"]
FROM
: baseimage utilisée
RUN
: Commandes effectuées lors du build de l'image
EXPOSE
: Ports exposées lors du run (si -P
est précisé)
ENV
: Variables d'environnement du conteneur à l'instanciation
CMD
: Commande unique lancée par le conteneur
ENTRYPOINT
: "Préfixe" de la commande unique lancée par le conteneur
Bien choisir sa baseimage
Chaque commande Dockerfile génère un nouveau layer
Comptez vos layers !
RUN apk --update add \
git \
tzdata \
python \
unrar \
zip \
libxslt \
py-pip \
RUN rm -rf /var/cache/apk/*
VOLUME /config /downloads
EXPOSE 8081
CMD ["--datadir=/config", "--nolaunch"]
ENTRYPOINT ["/usr/bin/env","python2","/sickrage/SickBeard.py"]
RUN apk --update add \
git \
tzdata \
python \
unrar \
zip \
libxslt \
py-pip \
&& rm -rf /var/cache/apk/*
VOLUME /config /downloads
EXPOSE 8081
CMD ["--datadir=/config", "--nolaunch"]
ENTRYPOINT ["/usr/bin/env","python2","/sickrage/SickBeard.py"]
Build automatisée d'images Docker
Intégration GitHub / DockerHub
Plateforme de stockage et de distribution d'images Docker
docker commit mon-conteneur backup/mon-conteneur
docker run -it backup/mon-conteneur
docker save -o mon-image.tar backup/mon-conteneur
docker import mon-image.tar backup/mon-conteneur
DockerHub n’est qu’au Docker registry ce que GitHub est à git
Pull and Push
Image officielle : registry
docker run
-d
(detach)
-i
(interactive)
-t
(pseudo tty)
-v
/directory/host:/directory/container
-p
portHost:portContainer
-P
-e
“VARIABLE=valeur”
--restart=always
--name=mon-conteneur
--privileged
(Accès à tous les devices)
--pid=host
(Accès aux PID de l’host)
--net=host
(Accès à la stack IP de l’host)
docker exec
docker attach
docker kill (SIGKILL)
docker stop (SIGTERM puis SIGKILL)
docker rm (détruit complètement)
Écosystème de gestion d'images
Construction automatisée d'images
Contrôle au niveau conteneurs
Docker Inc != Docker Project
Docker Inc est le principal développeur du Docker Engine, Compose, Machine, Kitematic, Swarm etc.
Ces projets restent OpenSource et les contributions sont possibles
Créé sous la Linux Fondation
But : Créer des standards OpenSource concernant la manière de "runner" et le format des conteneurs
Non lié à des produits commerciaux
Non lié à des orchestrateurs ou des clients particuliers
runC a été donné par Docker à l'OCI comme base pour leurs travaux
Concept de stack
Infrastructure as a code
Scalabilité
docker-compose.yml
nginx:
image: nginx
ports:
- "80:80"
- "443:443"
volumes:
- "/srv/nginx/etc/sites-enabled:/etc/nginx/sites-enabled"
- "/srv/nginx/etc/certs:/etc/nginx/certs"
- "/srv/nginx/etc/log:/var/log/nginx"
- "/srv/nginx/data:/var/www"
"Metal" as a Service
Provisionne des hôtes Docker
Abstraction du Cloud Provider
Clustering : Mutualisation d'hôtes Docker
Orchestration : placement intelligent des conteneurs au sein du cluster
Systèmes de gestion de conteneurs (COE)
Le projet Docker est Open Source et n'appartient plus à Docker
Des outils permettent d'étendre les fonctionnalités de Docker
Docker Inc. construit des offres commerciales autour de Docker
Debian, CentOS, Ubuntu
Supportent tous Docker
Paquets DEB et RPM disponibles
Paquets inutiles ou out of date
Services par défaut/inutiles alourdissent les distributions
Cycle de release figé
Faire tourner un conteneur engine
Optimisé pour les conteneurs : pas de services superflus
Fonctionnalités avancées liées aux conteneurs (clustering, network, etc.)
Sécurité accrue de part le minimalisme
CoreOS (CoreOS)
Atomic (Red Hat)
RancherOS (Rancher)
Photon (VMware)
Trois "channels" : stable, beta, alpha
Dual root : facilité de mise à jour
Système de fichier en read only
Pas de gestionnaire de paquets : tout est conteneurisé
Forte intégration de systemd
Permet nativement d'avoir un cluster complet
Stable et éprouvé en production
Idéal pour faire tourner Kubernetes (Tectonic)
Système de stockage simple : clé = valeur
Hautement disponible (quorum)
Accessible via API
Communication multi-hosts
UDP ou VXLAN
S'appuie sur un système clé/valeur comme etcd
Docker et juste Docker : Docker est le process de PID 1)
Docker in Docker : Daemon User qui tourne dans le Daemon System
Pas de processus tiers, pas d'init, juste Docker
Encore en beta
Équivalent à CoreOS mais basée sur Fedora
Utilise systemd
Update Atomic (incrémentielles pour rollback)
Répond à un besoin différent des distributions classiques
Fourni des outils et une logique adaptée aux environnements full conteneurs
Sécurité accrue (mise à jour)
Utilisation de COE (Container Orchestration Engine)
Utilisation d'infrastructure as code
Utilisation d'un Discovery Service
Gestion du cycle de vie des conteneurs/applications
Abstraction des hôtes et des cloud providers (clustering)
Scheduling en fonction des besoins de l'application
Version Control System
Intégration / Déploiement Continue
Outils de templating (Heat, Terraform, Cloudformation)
La nature éphémère des conteneurs empêche toute configuration manuelle
Connaître de façon automatique l'état de ses conteneurs à tout instant
Fournir un endpoint fixe à une application susceptible de bouger au sein d'un cluster
Combinaison de plusieurs services : KV Store, DNS, HTTP
Failure detection
Datacenter aware
Exemple :
$ curl -X PUT -d 'docker' http://localhost:8500/v1/kv/container/key1
true
$ curl http://localhost:8500/v1/kv/container/key1 | jq .
[
{
"CreateIndex": 5,
"ModifyIndex": 5,
"LockIndex": 0,
"Key": "container/key1",
"Flags": 0,
"Value": "ZG9ja2Vy"
}
]
$ echo ZG9ja2Vy | base64 -d
docker
L'enregistrement des nouveaux conteneurs peut être automatisé
Registrator est un process écoutant le daemon Docker et enregistrant les évènements
Permet de provisionner et mutualiser des hôtes Docker sur différents Cloud Provider
Bon compromis entre simplicité et fonctionnalités comparé à Mesos ou Kubernetes
Encore jeune, adapté aux environnement de taille moyenne (problèmes de passage à l'échelle)
Mesos : Gestion et orchestration de systèmes distribués
A la base orienté Big Data (Hadoop, Elasticsearch...) et étendu aux conteneurs via Marathon
Marathon : Scheduler pour Apache Mesos orienté conteneur
Multi Cloud/Datacenter
Adapté aux gros environnements, éprouvé jusque 10000 nodes
COE développé par Google, devenu open source en 2014
Utilisé par Google pour la gestion de leurs conteneurs
Adapté à tout type d'environnements
Devenu populaire en très peu de temps
Hashicorp Nomad
Amazon ECS
Docker Cloud
Docker UCP (Universal Control Plane)
L'infrastructure
Les conteneurs
Monitorer des serveur est une problématique résolu depuis de nombreuses années par des outils devenus des standards :
Nagios
Shinken
Centreon
Icinga
Un des principes du cloud computing est d'abstraire les couches basses
Docker accentue cette pratique
Est-ce intéressant de monitorer son infra ?
Oui bien sûr ;)
Monitorer les services fournis par les conteneurs
Monitorer l'état d'un cluster
Monitorer un conteneur spécifique
Les conteneurs sont des boîtes noires
Les conteneurs sont dynamiques
La scalabilité induite par les conteneurs devient un problème
La problématique est différente pour chaque service
Concernant les web services (grande majorité), le temps de réponse du service et la disponibilité du service sont de bons indicatifs
Problème adressé par certains services discovery pour conserver une vision du système cohérente (ex : Consul
Dépends grandement de la technologie employée
Le cluster se situe t-il au niveau de l'host Docker ou des conteneurs eux mêmes ?
Commandes exécutées dans le container
Agents à l'intérieur du conteneur
Agents à l'extérieur du conteneur
Docker stats
CAdvisor
Datadog
Sysdig
Prometheus
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Les Pods sont définis en YAML comme les fichiers docker-compose
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
replicas
.fluentd
ou logstash
nvidia-plugin
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
Deployment
Persistent Volume
et un Storage Class
.apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
parallelism: 1
completions: 1
template:
metadata:
name: pi
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: OnFailure
Cron
jobTemplate
contient la définition de l'application à lancer comme Job
.apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: batch-job-every-fifteen-minutes
spec:
schedule: "0,15,30,45 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: periodic-batch-job
spec:
restartPolicy: OnFailure
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
apiVersion: v1
kind: Service
metadata:
name: frontend
spec:
type: ClusterIP
ports:
- port: 80
selector:
app: guestbook
NodePort
: chaque noeud du cluster ouvre un port statique et redirige le trafic vers le port indiqué
LoadBalancer
: expose le Service en externe en utilisant le loadbalancer d'un cloud provider
Il est aussi possible de mapper un Service avec un nom de domaine en spécifiant le paramètre spec.externalName
.
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com
Ingress
permet d'exposer un Service à l'extérieur d'un cluster KubernetesapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: particule
spec:
rules:
- host: blog.particule.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
Pour utiliser un Ingress
, il faut un Ingress Controller. Un Ingress
permet de configurer une règle de reverse proxy sur l'Ingress Controller.
Kubernetes n'implémente pas de solution réseau par défaut, mais s'appuie sur des solutions tierces qui implémentent les fonctionnalités suivantes :
Solution de PaaS développée par Red Hat
Se base sur Kubernetes en tant qu'orchestrateur de conteneurs
Pas d'Ingress : Router
Build et Images Stream : Création d'images et pipeline de CI/CD
Templates : Permet de definir et templatiser facilement un ensemble d'Objet OpenShift
OpenShift SDN ou Nuage Network pour le réseau
Quasiment identique à Ingress mais implémentés avant Kubernetes
Fournissent les même fonctionnalités
Permet de construire et reproduire des images d'application
Docker builds : via Dockerfile
Source-to-Image (S2I) builds : système de build propre à OpenShift qui produit une image Docker d'une application depuis les source
Pipeline builds : via Jenkins
Similaires à un dépôt DockerHub
Rassemble des images similaires identifiées par des tags
Permet de garder un historique des différentes versions