class: center, middle, inverse # Cours NoSQL ## Haïkel Guémar - haikel.guemar@gmail.com --- class: center, middle, inverse # Introduction aux conteneurs, Kubernetes et OpenShift --- class: middle Ceci est un crash course pour vous donner les bases pour déployer des applications via Docker et/ou OpenShift --- class: center, middle, inverse # Le Cloud Computing --- class: middle ## Pourquoi? * Automatisation du provisionnement * Facturation à la demande * Stockage, calculs distants * Redondance * Virtualisation * Pet vs Cattle --- class: middle ## Cloud Computing: X as a Service ![](img/comparison-xass.jpg) --- class: middle ## Automatisation * Abstraction des ressources * Infrastructure as Code * Passage à l'échelle --- class: center, middle, inverse # Conteneurs --- class: middle ## C'est quoi? * Technologie de virtualisation légère de type isolateur * Permet d'isoler l'exécution d'un processus dans une sandbox * Ex: BSD Jails, Solaris Zones, Linux: LXC, VServer, Docker, etc. * Partage du noyau ![](img/containers-655x325.png) --- class: middle ## Docker * 2013: DotCloud un fournisseur de PaaS libère la technologie Docker * Initialement basé sur LXC puis libcontainer * Docker est avant tout une technologie de déploiement et non de virtualisation --- class: middle ## Matrix Hell
--- class: center, middle, inverse # Concepts --- class: middle ## Concepts * Layers * Stockage * Volumes * Réseau * Publication de ports * Links --- class: middle ## Conteneurs/images Une image docker est un ensemble de données immuable et statique. Un conteneur Docker est une instance d'une image Docker. --- class: middle ## Layers * Une image est composé de layers * Les layers sont réutilisables par différentes images * Optimisation du stockage * Un conteneur = une image (Read-Only) + container layer (Read-Write) ![](img/icontainer-layers.jpg) --- class: middle ## Stockage * Stockage physique des images * Plusieurs backends: * AUFS (défaut) * DeviceMapper (défaut sous Fedora/RHEL/CentOS) * OverlayFS * via le plugin Convoy: NFS, GlusterFS --- class: middle ## Volumes * Persistance des données * Similaire aux points de montage Unix * Possibilité de partage entre plusieurs conteneurs --- class: middle ## Réseau ```bash % docker network ls NETWORK ID NAME DRIVER SCOPE 1b1d95e1b322 bridge bridge local 279f5d822d69 host host local a78cc076ed66 none null local ``` --- class: middle ## Bridge * Driver par défaut * Permet de communiquer avec l'extérieur * Isolation entre les conteneurs et l'hôte
--- class: middle ## Host * Driver par défaut * Permet de communiquer avec l'extérieur * Utilise directement la pile réseau de l'hôte
--- class: middle ## Macvlan * Permet d'attribuer une adresse MAC à votre conteneur * Apparait comme une machine physique sur le réseau * Utile pour les applications legacy --- class: middle ## Overlay * Permet d'aggréger le ŕeseau sur des hôtes multiples et réseaux différents * Exemple d'implémentation FLannel ![](img/docker-overlay.png) --- class: middle ## None * Pas de réseau --- class: middle ## Publications de ports * Permet d'associer un port X du conteneur vers le port Y de l'hôte * Exemple: port 8080 du conteneur accessible sur le port 80 de l'hôte ![](img/docker-publish-ports.png) --- class: middle ## Links * Permet de lier des conteneurs par leurs noms * DNS rudimentaires --- class: center, middle, inverse # Utiliser Docker --- class: middle ## Lancer un conteneur ```bash % docker run
``` * -d: detach (exécution en background) * -t: pseudo-tty * -i: interactif (souvent utilisé avec -t pour avoir un shell dans le conteneur courant) * --name $NAME => nommer son conteneur * -v $REPERTOIRE_HÔTE:$RÉPERTOIRE_CONTENEUR => monter un volume * -p $PORT_HÔTE:$PORT_CONTENEUR => publier un port * -e $VARIABLE=$VALEUR => passer des variables d'environnement --- class: middle ## Se connecter à un conteneur ```bash % docker exec
% docker attach
``` --- class: middle ## Détruire un conteneur ```bash % docker kill
# SIGKILL % docker stop
# SIGTERM % docker rm
# suppression ``` --- class: center, middle, inverse # Construire image Docker --- class: middle ## Format Docker * Standard de fait * Simple à appréhender * Automatisable * Dockerfile --- class: middle ## Dockerfile ```yaml FROM fedora;27 MAINTAINER Haïkel Guémar
RUN yum install -y nginx EXPOSE 80 443 CMD ["nginx"] ``` --- class: middle ## Instructions principales * FROM $IMAGE_BASE:$VERSION * RUN $commande * EXPOSE $port * ENV $VARIABLE_ENVIRONNEMENT $VALEUR * CMD $COMMANDE => exécution unique d'une commande * ENTRYPOINT $COMMANDE => préfixe de la commande à être exécuté au démarrage du conteneur --- class: middle ## Attention aux layers Mauvais exemple! ```yaml FROM fedora;27 MAINTAINER Haïkel Guémar
RUN yum install -y nginx RUN yum clean all EXPOSE 80 443 CMD ["nginx"] ``` --- class: middle ## Attention aux layers Mieux ```yaml FROM fedora;27 MAINTAINER Haïkel Guémar
RUN yum install -y nginx && \ yum clean all EXPOSE 80 443 CMD ["nginx"] ``` --- class: middle ## Pour aller plus loin * Docker Hub: registre public d'images Docker pour publication * Docker compose: déploiement multi-containers * Docker Machine * Swarm etc. --- class: middle ## tutoriel Docker À assimiler d'ici la prochaine séance! https://docs.docker.com/get-started/ --- class: center, middle, inverse # Kubernetes --- class: middle ## Kubernetes ou K8s pour les intimes * Projet open source d'orchestration de conteneurs * Développé par Google (basé sur Borg) * Flexible --- class: middle ## Concepts * PODs * Networking * Volumes * Namespaces * Labels * Replication controllers --- class: middle ## POD * Groupe d'un ou plusieurs conteneurs * Unité d'orchestration: les conteneurs sont instanciés/détruits simultanément * Orchestré sur un seul hôte * Spécifications communes: pile IP (network namespace), IPC (PID namespace) --- class: middle ## POD: définition ```yaml apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 ``` --- class: middle ## Networking * Overlay network * Flannel * OpenShift * OpenContrail * Évite l'utilisation du NAT --- class: middle ## Volumes * Stockage persistant pour les PODs * Support de multiples backends * GCE * AWS * GlusterFS * NFS * Ceph * iSCSI --- class: middle ## Volumes Déclaration suivie d'affectation à un service ```yaml apiVersion: v1 kind: Pod metadata: name: redis spec: containers: - name: redis image: redis volumeMounts: - name: redis-persistent-storage mountPath: /data/redis volumes: - name: redis-persistent-storage emptyDir: {} ``` --- class: middle ## Namespaces * Séparation logique des ressources (par projets, utilisateurs, etc.) * Les objets existent uniquement dans un namespace donnée * Ëvite la collision des noms d'objets --- class: middle ## Labels * Attributs clé/valeur * Permet d'ajouter des métadonnées aux objets (PODs, RC, services) ```yaml apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 ``` --- class: middle ## Replication controllers * Permet de gérer le cycle de vie des PODs * S'assurer qu'un nombre minimum de PODs est présent (scaling, redondance) --- class: middle ## Services * Abstractions des PODs et RCs * Permet de rendre un ensemble de PODs accessibles depuis l'extérieur * Load balancing entre les PODs d'un même service * Intégration avec les loads balancers des clouds: AWS ELB, GCE --- class: middle ## En production 8 Ëcrit en Go, compilé statiquement * Version 1.4 stable * La plus populaire et versatile * Bien intégré * Outil en ligne de commandes: kubectl --- class: center, middle, inverse # Architecture de K8s --- class: middle ## Composants * kubelet: agent tournant sur tout les nœuds * kube-apiserver: point d'entrée API * kube-proxy: forwarding des flux TCP/UDP et load-balalancing * kube-scheduler: scheduling * kuber-controller-manager: gestion du cluster physique --- class: middle ## Architecture
--- class: middle, center, inverse # OpenShift --- class: middle ## C'est quoi * PaaS développé par Red Hat (3ème itération) * Version Open Source: [OpenShift Origin](https://www.openshift.org/) * Basé sur Kubernetes pour l'orchestration de conteneurs --- class: middle ## Quoi de plus par rapport à k8s? * Build et Image Stream: Création d'images et pipeline de CI/CD * Templates d'applications * Intégration dans le flux de développement --- class: middle ## Build * Permet de construire à la volée les images d'applications * Docker builds: Dockerfile * Source-to-image (S2I) builds: propre à OpenShift, pour construire l'image à partir des sources * Pipelines builds: utilise Jenkins --- class: middle ## Image Stream * Dépôts d'image (DockerHub like) * Groupe les images similaires à l'aide des tags * Garde un historique des différentes versions de vos images --- class: middle ## Exercice Tutoriel de déploiement d'une application nodejs: 1. installer OpenShift tools => Sur Windows: https://blog.openshift.com/installing-oc-tools-windows/ 2. S'inscrire sur OpenShift Online (Plan Starter ça suffira) https://www.openshift.com/pricing/index.html 3. Faire le tutoriel sur https://github.com/sclorg/nodejs-ex --- class: middle ## Rappel (Redis) ```bash % oc new-app redis % oc status In project My Project (myproject) on server https://127.0.0.1:8443 svc/redis - 172.30.124.164:6379 dc/redis deploys openshift/redis:3.2 deployment #1 deployed about an hour ago - 1 pod % oc get pods NAME READY STATUS RESTARTS AGE redis-1-2z8sd 1/1 Running 0 53m % oc rsh redis-1-2z8sd # accès shell au pod redis > source /opt/rh/rh-redis32/enable # dans le conteneur > redis-cli % oc log -f redis-1-2z8sd # logs du pod % oc delete service redis # suppression du service redis (pods inclus) ``` --- class: middle, center, inverse # Q/A