Work on TP2

This commit is contained in:
nemunaire 2016-09-15 02:46:46 +02:00
parent c11a3b9132
commit b171ee869d
10 changed files with 295 additions and 141 deletions

BIN
tutorial/2/chronograf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -10,21 +10,52 @@ L'intérêt est de permettre à chaque conteneur d'effectuer une tâche
générique, de manière à pouvoir être réutilisé pour d'autres projets
dans le futur. Par exemple, notre conteneur InfluxDB pourra être
utilisé pour stocker des relevés de métriques systèmes ou des logs.
Grafana peut également afficher davantage d'informations ou combiner
les informations de plusieurs bases distinctes.
Chronograf peut être connecté à d'autres serveurs afin de corréler les
métriques, ...
## Séparer le `Dockerfile`
Commençons par séparer notre `Dockerfile` en deux : dans une partie
nous allons garder la partie InfluxDB, de l'autre la partie Grafana.
nous allons garder la partie InfluxDB, de l'autre la partie Chronograf.
Il va vous falloir créer deux dossiers distincts, il en faut un par
`Dockerfile`.
`Dockerfile` : réutilisez l'image `influxdb` créée précédemment et créez le
dossier pour l'image `chronograf`.
Profitez en pour rajouter les Data Volume Container, si vous ne l'avez
pas fait dans la partie précédente !
\vspace{1em}
Pour tester la bonne marche de vos conteneurs, vous pouvez le lancer votre
conteneur chronograf avec la commande suivante (en considérant que votre
conteneur influxdb de la première partie est toujours lancé).
```
docker run --rm --link YOUR_INFLUX_CNTR_NAME:influxdb chronograf
```
Remplacez `YOUR_INFLUX_CNTR_NAME` par le nom du conteneur qui fait tourner
votre influxdb. En créant ce lien, `chronograf` sera capable de contacter une
machine `influxdb` (la partie après les `:`).
### Visualiser les données dans `chronograf`
Avant d'arrêter `telegraf` et nos conteneurs pour passer à une nouvelle étape,
prenez le temps d'afficher les données que vous avez collecté depuis le début
du TP.
Après avoir ajouté le serveur (en remplaçant `localhost` proposé par défaut par
`influxdb` issue du *link*), ajouter deux visualisations avec les requêtes
suivantes :
```
SELECT used, available, cached FROM mem WHERE tmpltime()
SELECT mean(usage_idle) FROM cpu WHERE tmpltime() GROUP BY time(20s), cpu
```
## Automatiser la construction et le lancement
@ -37,33 +68,50 @@ conteneurs, définissez à la racine de votre projet un fichier
les paramètres d'exécution.
```
influxdb:
...
grafana:
build: grafana/
image: nginx
ports:
- "3000:3000"
volumes:
- ./:/tmp/toto
links:
- influxdb
version: '2'
services:
influxdb:
...
chronograf:
build: grafana/
image: nginx
ports:
- "3000:3000"
volumes:
- ./:/tmp/toto
links:
- influxdb
```
Ce fichier est un condensé des options que vous passez habituellement
au `docker run`.
L'exemple ci-dessus est à adapter largement, consultez
<http://docs.docker.com/compose/yml/> pour une liste exhaustive des
<http://docs.docker.com/compose/compose-file/> pour une liste exhaustive des
options que vous pouvez utiliser.
Notez toutefois la présence d'une ligne `version` ; il ne s'agit pas de la
version de vos conteneurs, mais de la version du format de fichier
docker-compose qui sera utilisé. Sans indication de version, la version
originale sera utilisée.
Une fois que votre `docker-compose.yml` sera prêt, lancez tout d'abord
`docker-compose build` pour commencer la phase de build de tous les
conteneurs listés dans le fichier.
Une fois le build terminé, vous pouvez lancer la commande suivante pour admirer le résultat :
Une fois le build terminé, vous pouvez lancer la commande suivante et admirer
le résultat :
```
docker-compose up
```
Encore une fois, testez la bonne connexion entre chronograf (accessible sur
<http://localhost:10000>) et influxdb.
## Rendu
Pour cette partie, vous devrez rendre la dernière itération de votre
`docker-compose.yml`.

View file

@ -1,12 +1,12 @@
\newpage
# Premiers pas
Premières étapes
================
Dans un premier temps, nous allons créer une image Docker comme si l'on
réalisait l'installation sur une machine classique : en suivant les méthodes
habituelles, mais tout en écrivant notre recette dans le `Dockerfile`. La
machine (notre première image Docker) contiendra tout le nécessaire pour faire
fonctionner notre service.
réalisait une installation sur une machine classique : en suivant une
recette. La machine (notre première image Docker) contiendra tout le nécessaire
pour faire fonctionner notre service.
## Les caches
@ -25,10 +25,9 @@ n'est pas modifiée dans le `Dockerfile`, le cache sera utilisé.
Il est possible de ne pas utiliser le cache et de relancer toutes les étapes du
`Dockerfile` en ajoutant l'option `--no-cache` au moment du `docker build`.
Les couches du cache peuvent être partagées entre plusieurs conteneur, c'est
ainsi que vous pouvez partager facilement une plus grosse partie du système de
fichiers (afin de profiter du cache du système de fichiers au moment de
l'exécution du conteneur).
Les couches du cache peuvent être partagées entre plusieurs conteneur,
c'est ainsi que vous pouvez partager facilement une plus grosse partie
du système de fichiers.
\vspace{1.5em}
@ -36,10 +35,10 @@ Pour profiter du cache, il faut donc placer les étapes les plus génériques (q
seraient susceptibles d'apparaître dans plusieurs conteneur), en haut du
`Dockerfile`.
Commençons donc notre `Dockerfile` : choisissez une image de base pour votre
`FROM`, et indiquez votre nom avec l'instruction `MAINTAINER`, pour indiquez
que c'est vous qui maintenez ce conteneur (si d'autres gens ont besoin qu'il
faut le mettre à jour par exemple).
Commençons donc notre `Dockerfile` : choisissez une image de base pour
votre `FROM`, et indiquez votre nom avec l'instruction `MAINTAINER`,
pour indiquez que c'est vous qui maintenez ce conteneur (si d'autres
gens ont besoin de vous avertir pour le mettre à jour par exemple).
## `RUN` ou script ?
@ -48,20 +47,24 @@ faut le mettre à jour par exemple).
Ensuite vient l'installation d'InfluxDB. Le paquet n'est pas disponible dans
les dépôts. La
[procédure décrite sur le site](https://influxdb.com/docs/v0.9/introduction/installation.html)
incite à télécharger le paquet mis à disposition puis à l'installer via `dpkg
-i`.
[https://docs.influxdata.com/influxdb/v1.0/introduction/installation/#ubuntu-debian](procédure
décrite sur le site) incite à télécharger le paquet mis à disposition puis à
l'installer via `dpkg -i`.
Deux solutions s'offrent à nous : télécharger le paquet hors du conteneur, le
copier, puis l'installer. Ou faire un `RUN` avec toutes ces opérations (sans
oublier l'installation de `wget`/`curl`).
Deux solutions s'offrent à nous :
* télécharger le paquet hors du conteneur, le copier, puis l'installer.
* faire un `RUN` avec toutes ces opérations (sans oublier l'installation
préalable de `wget`/`curl`).
La copie étant définitive (supprimer le fichier ne le supprimera pas des
couches où il a pu exister), donc la seconde solution semble préférable (mais
`wget` restera en déchet).
couches où il a pu exister), on préférera la seconde méthode, malgré que `wget`
restera en déchet. La première méthode aura plus sa place dans un dépôt où les
binaires auront été préalablement compilés, il ne restera plus qu'à les copier
dans le conteneur au bon emplacement.
Écrivez une commande `RUN` qui va télécharger la dernière version d'InfluxDB,
qui va l'installer et supprimer le fichier.
Écrivons une commande `RUN` qui va télécharger la dernière version
d'InfluxDB, qui va l'installer et supprimer le fichier.
\vspace{1em}
@ -69,17 +72,46 @@ qui va l'installer et supprimer le fichier.
bien utilisable : `EXPOSE`, `CMD`, ...
Il est possible que vous ayez à écraser le fichier de configuration via un
`COPY` (ou de manière plus maline en utilisant `--volume` au moment du `docker
run`, cela fonctionne pas qu'avec les dossiers). Garder la ligne qui vous
permet de lancer votre serveur web dans un coin, en attendant la partie
suivante.
`COPY` (ou de manière plus maligne en utilisant `--volume` au moment du `docker
run`, cela fonctionne pas qu'avec les dossiers). Ou peut-être ferez-vous un
`ENTRYPOINT` ?
### Grafana
### Telegraf
Une fois InfluxDB configuré, nous allons avoir la même réflexion avec Grafana.
Telegraf est un programme qui permet de collecter des métriques systèmes. Il
travaille de paire avec InfluxDB pour stocker les valeurs.
De la même manière, téléchargez, installez et supprimez le paquet.
Vous pouvez monitorer les métriques de n'importe quelle machine, simplement en
installant *Telegraf* et en lui indiquant l'emplacement de son serveur
InfluxDB. Nous allons installer *telegraf* sur notre machine à l'aide de la
[https://docs.influxdata.com/telegraf/v1.0/introduction/installation/](documentation).
Lors de vos tests, sachez que vous pouvez vous connecter sur grafana avec
l'utilisateur *admin*, mot de passe *admin*.
Ces quelques lignes devraient suffir à lancer la collecte, à condition que
votre InfluxDB écoute sur le port 8086 local :
```bash
TELEGRAF_VERSION=1.0.0
wget https://dl.influxdata.com/telegraf/releases/telegraf-${TELEGRAF_VERSION}_linux_amd64.tar.gz
tar xf telegraf-${TELEGRAF_VERSION}_linux_amd64.tar.gz
TELEGRAF_CONFIG_PATH=./telegraf/etc/telegraf/telegraf.conf ./telegraf/usr/bin/telegraf
```
Rendez-vous ensuite dans [http://localhost:8083/](l'interface d'InfluxDB) pour
voir si la collecte se passe bien.
Dans l'interface sélectionnez la base *telegraf* puis explorez les valeurs :
```sql
SHOW MEASUREMENTS
SHOW FIELD KEYS
SELECT usage_idle FROM cpu WHERE cpu = 'cpu-total' ORDER BY time DESC LIMIT 5
```
Laissons tourner `telegraf` afin de constituer un petit historique de valeurs.
## Rendu
Avant de passer à la suite, placez votre `Dockerfile` dans un dossier
`influxdb` (pour le moment il ne contient rien d'autre !).

View file

@ -1,6 +1,7 @@
\newpage
# Retour sur les bonnes pratiques
Retour sur les bonnes pratiques
===============================
Pour chacune des bonnes pratiques ci-dessous, vérifiez que vous les respectez
bien, faites les modifications nécessaires.
@ -39,9 +40,7 @@ En plus, cela réduira le temps de build et la taille des images produites !
Vous devez trouver l'équilibre idéal entre la lisibilité de votre `Dockerfile`
(qui assure la maintenabilité sur le long-terme) et le nombre de couches
créées. Le nombre de couches idéal devrait être égal au nombre de branches
distincte partant d'une image de base, afin d'utiliser au mieux le cache du
système de fichiers.
créées.
## Ordonnez vos lignes de commandes complexes
@ -105,7 +104,7 @@ Il y a un certain nombre de règles à connaître pour bien utiliser ce mécanis
## Concevez des conteneur éphémères
Les conteneurs que vous générez doivent aussi éphémères que possible : ils
Les conteneurs que vous générez doivent être aussi éphémères que possible : ils
devraient pouvoir être arrêtés, détruits et recréés sans nécessiter d'étape de
reconfiguration. La configuration devrait se faire au lancement du conteneur ou
lors de sa construction.

View file

@ -2,17 +2,62 @@
# Installation
## Docker
Ce TP requiert la dernière version de Docker (1.12). Commencez par vérifier que
vous avez bien cette version :
```
42sh$ docker version
Client:
Version: 1.12.1
API version: 1.24
Go version: go1.7
Git commit: 23cf638
Built:
OS/Arch: linux/amd64
Server:
Version: 1.12.1
API version: 1.24
Go version: go1.7
Git commit: 23cf638
Built:
OS/Arch: linux/amd64
```
Si vous n'avez pas une version assez récente, consultez le premier TP pour
savoir comment installer Docker.
## `docker-compose`
L'équipe en charge de Docker compose met à disposition un binaire contenant
Nous allons également avoir besoin de `docker-compose`.
Ce projet ne bénéficie pas d'une intégration au sein du projet Docker et doit
être téléchargé séparément, car originellement, le projet était développé par
une équipe indépendante. S'étant révélé primordiale, ils ont trouvé une place
au sein du projet Docker, mais l'incompatibilité des langages utilisés fait que
`docker-compose` n'est toujours pas intégré dans docker.
### Par le gestionnaire de paquets
Les distributions à jour vous proposeront un paquet `docker-compose` qui
fonctionnera avec la version de Docker qu'ils fournissent.
### Par la distribution binaire
L'équipe en charge de Docker compose met à disposition un exécutable contenant
tous les scripts. Nous pouvons l'installer en suivant la procédure suivante :
```
curl -L https://github.com/docker/compose/releases/download/1.3.3/docker-compose-Linux-x86_64 \
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-Linux-x86_64 \
> /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
```
### `pip`
Le projet étant écrit en Python, il est également disponible via `pip`, si vous
préférez cette méthode. N'oubliez pas de préciser une version compatible avec
votre version de Docker.
@ -25,7 +70,7 @@ Comme avec Docker, nous pouvons vérifier le bon fonctionnement de
```
42sh$ docker-compose --version
docker-compose version: 1.3.3
docker-compose version: 1.8.0
```
Si vous obtenez une réponse similaire, c'est que vous êtes prêt à commencer le

View file

@ -1,73 +1,50 @@
\newpage
# Rendu
## Avis
Dans le courriel que vous enverrez, je serais ravi de connaître votre avis sur
ce cours : aussi bien les choses que vous avez apprécié que celles que vous
n'avez pas aimés.
Cela ne rentrera pas en compte dans la notation, mais permettra d'améliorer ce
cours.
## TP
Rendez le contenu de votre dossier à la dernière étape du TP : avec le
`docker-compose.yml`, ainsi que vos `Dockerfile` et les éventuels fichiers
annexes.
Rendu
=====
## Projet
De la même manière que nous avons réaliser un groupe de conteneurs utilisant
`grafana` et `InfluxDB`, qui permet d'afficher facilement des métriques sous
forme de graphiques, vous allez réaliser, à l'aide des images Docker présentent
sur le hub, une interface web de recherche et de visualisation de logs,
utilisant
[Kibana](https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14-04).
Amusez-vous à la piscine, il n'y a pas de projet en plus des exercices fait en
TP !
Toutes la chaîne d'image Docker est déjà présente sur le hub :
[logstash](https://hub.docker.com/_/logstash/),
[elasticsearch](https://hub.docker.com/_/kibana/),
[kibana](https://hub.docker.com/_/kibana/).
En complément de ce TP, vous pouvez jetez un œil à
[https://docs.docker.com/engine/swarm](Docker Swarm) !
Le but du projet est donc de réaliser un `docker-compose.yml` permettant
d'avoir un système de centralisation de logs fonctionnels. Vous aurez sans
doute à faire quelques adaptations au niveau des images Docker, au moins pour
des fichiers de configuration, donc il n'y aura sans doute pas que ce fichier à
rendre.
Vous pouvez utiliser comme source de logs les conteneurs du TP, grâce aux
options `log-driver=gelf` et `log-opt=gelf-address=udp://host:port`, passées
aux `docker run` (ou dans le `docker-compose`).
## Modalité de rendu
Côté `logstash`, votre configuration devrait ressembler à ça :
Un service automatique s'occupe de réceptionner vos rendus, de faire les
vérifications nécessaires et de vous envoyer un accusé de réception (ou de
rejet).
Ce service écoute sur l'adresse <virli@nemunai.re>, c'est donc à cette adresse
et exclusivement à celle-ci que vous devez envoyer vos rendus. Tout rendu
envoyé à une autre adresse et/ou non signé ne sera pas pris en compte.
## Tarball
Tous les fichiers identifiés comme étant à rendre pour ce TP sont à
placer dans une tarball (pas d'archive ZIP, RAR, ...).
Les réponses aux questions sont à regrouper dans un fichier `questions.txt` à
placer à la racine de votre rendu.
Voici une arborescence type:
```
input {
tcp {
port => 4242
}
udp {
port => 4242
}
}
output {
elasticsearch { }
}
login_x-TP2/questions.txt
login_x-TP2/docker-compose.yml
login_x-TP2/influxdb
login_x-TP2/influxdb/Dockerfile
login_x-TP2/influxdb/influxdb.conf
login_x-TP2/chronograf
login_x-TP2/chronograf/Dockerfile
login_x-TP2/chronograf/chronograf.conf
login_x-TP2/mymonitoring
login_x-TP2/mymonitoring/Dockerfile
login_x-TP2/mymonitoring/chronograf.conf
login_x-TP2/mymonitoring/influxdb.conf
login_x-TP2/mymonitoring/supervisor.conf
```
Vous pourrez ainsi envoyez les logs de Docker sur le port 4242. Ou directement
vos logs syslog :
```
netcat localhost 4242 < /var/log/syslog
```
N'oubliez pas de lire les README associés aux images Docker du hub, ils vous
indiqueront comment utiliser les images et comment leur passer des paramètres.
Bon courage !

View file

@ -1,15 +1,56 @@
\newpage
# Plusieurs daemons dans un conteneur
Plusieurs daemons dans un conteneur
===================================
Notre système de monitoring commence enfin à ressembler à quelque chose. Mais
ce serait tellement plus pratique de voir tous ces tableaux de nombres sous
forme de graphiques !
Nous allons pour cela ajouter `chronograf` dans notre conteneur.
Avant de modifier votre `Dockerfile`, créez un nouveau dossier de rendu :
`mymonitoring`, dans lequel vous recopierez l'état actuel de notre image
`influxdb`.
## Chronograf
Commençons par compléter la commande d'installation existante pour `influxdb`,
afin d'installer simultanément `chronograf`.
La documentation de la procédure est disponible
[https://docs.influxdata.com/chronograf/v1.0/introduction/installation/](à
cette adresse).
## Script d'init
Lors du dernier TP, nous avons vu que les conteneurs étaient détruits dès que
le premier processus du conteneur (celui qui a le PID 1, à la place d'`init`)
terminer son exécution, quelque soit le statut de ses éventuels fils.
terminait son exécution, quelque soit le statut de ses éventuels fils.
Pour lancer tous nos daemon, nous allons donc besoin d'écrire un script qui
lance puis attend que les deux deamons aient terminés de s'exécuter
Pour lancer tous nos daemons, nous avons donc besoin d'écrire un script qui
lance puis attend que les deux deamons aient terminés de s'exécuter.
Écrivons ce script. Hints : `wait(1)`.
\vspace{1em}
Pour vérifier que votre conteneur fonctionne correctement, vous pouvez le
lancer :
```
docker run --rm -p 10000:10000 mymonitoring
```
Puis accéder à chronograf : <http://localhost:10000/>. Donnez un nom à votre
configuration, puis cliquez sur *Add*. Les paramètres préremplis dans le
formulaire sont corrects.
Vous devriez obtenir l'écran suivant (notez la partie `Status: Online, v1.0.0`) :
![Chronograf configuré](chronograf_setup.png)
## Autorestart
@ -45,14 +86,16 @@ Première étape : installer `supervisor`, le paquet se trouve dans les dépôts
L'étape suivante consiste à remplir puis copier le fichier de configuration
dans le conteneur. Vous allez devoir écraser dans votre conteneur le fichier
`/etc/supervisord.conf` pour démarrer à la fois `grafana` et `influxdb`.
`/etc/supervisord.conf` pour démarrer à la fois `chronograf` et `influxdb`.
Vous pouvez vous aider de la documentation disponible à :
<http://supervisord.org/configuration.html>
## C'est parti !
La même procédure de test que précédemment peut être suivie.
Votre conteneur doit maintenant être parfaitement fonctionnel : vous devriez
pouvoir lancer votre script de monitoring et voir apparaître vos données dans
Grafana !
## Rendu
Nous ne toucherons plus à cette image, placez-la dans un dossier
`mymonitoring`.

View file

@ -1,20 +1,25 @@
% Virtualisation légère -- TP n^o^3
% Pierre-Olivier *Nemunaire* Mercier
% Jeudi 29 octobre 2015
---
title: Virtualisation légère -- TP n^o^ 2
subtitle: Aller plus loin avec Docker
author: Pierre-Olivier *Nemunaire* Mercier
institute: EPITA
date: Jeudi 15 septembre 2016
...
Durant ce troisième TP, nous allons approfondir l'utilisation de Docker !
Durant ce deuxième TP, nous allons approfondir l'utilisation de Docker !
Tous les éléments de ce TP (exercices et questions) sont à rendre à
<virli@nemunai.re> au plus tard le jeudi 12 novembre 2015 à 23 h 42. Consultez la
<virli@nemunai.re> au plus tard le jeudi 6 octobre 2016 à 8 h 42. Consultez la
dernière section de chaque partie pour plus d'information sur les éléments à
rendre. Vous pouvez placer les réponses aux questions dans le corps du courriel
ou dans un fichier joint.
rendre.
En tant que personnes sensibilisées à la sécurité des échanges électroniques,
vous devriez m'envoyer vos rendus signés avec votre clef PGP. Pensez à
vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à
[me](http://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire
signer votre clef et n'hésitez pas à
[faire signer votre clef](http://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
Vous pouvez utiliser l'adresse <signcheck@nemunai.re> pour savoir si vous vous
y prenez correctement.
\hypersetup{linkcolor=black}
\tableofcontents

View file

@ -1,11 +1,16 @@
# But du TP
But du TP
=========
Aujourd'hui, nous allons terminer notre système de monitoring commencé lors du
premier TP.
Aujourd'hui, nous allons réaliser un système de monitoring.
Le résultat attendu d'ici la fin du TP, est un groupe de conteneurs
indépendants les uns des autres, réutilisables en fonction des besoins.
Les données collectées seront envoyés vers
[InfluxDB](https://influxdb.com/), puis elles seront affichées sous
forme de graphique dans [Grafana](http://grafana.org/).
Nous collecterons les données d'utilisation de votre machine avec
[https://www.influxdata.com/time-series-platform/telegraf/](Telegraf). Ces
données seront envoyés vers
[https://www.influxdata.com/time-series-platform/influxdb/](InfluxDB), puis
elles seront affichées sous forme de graphique dans
[https://www.influxdata.com/time-series-platform/chronograf/](Chronograf).
![Dashboard de l'utilisation CPU et mémoire sur Chronograf](chronograf.png)