Workshop mesos docker devoxx fr 2016

43
#DevoxxFR Déploiement d'une app distribuée sur Mesos avec Docker, Marathon et MesosDNS Cyril Collen @sxarvipa Bertrand Dickelé @bdickele Julia Mateo @juliamateodc 1

Transcript of Workshop mesos docker devoxx fr 2016

Page 1: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Déploiement d'une app distribuée sur Mesos avec Docker, Marathon et

MesosDNS

Cyril Collen @sxarvipa Bertrand Dickelé @bdickele Julia Mateo @juliamateodc

1

Page 2: Workshop mesos docker devoxx fr 2016

#DevoxxFR 2

Développeurs Java

Qui sommes nous ?

Page 3: Workshop mesos docker devoxx fr 2016

#DevoxxFR

1ère partie du workshop

3

• Présenter cm-voting, une webapp distribuée

• Déployer cm-voting avec docker links

• Déployer cm-voting avec docker compose

Page 4: Workshop mesos docker devoxx fr 2016

#DevoxxFR

2ème partie du workshop

4

• Simuler un cluster Mesos en local

• Déployer cm-voting

Page 5: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Vous aurez besoin de…

5

- Un laptop

- VirtualBox et la VM fournie dans les clés USB

Page 6: Workshop mesos docker devoxx fr 2016

#DevoxxFR

The webapp

6

Page 7: Workshop mesos docker devoxx fr 2016

#DevoxxFR

The webapp

7

Page 8: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Docker

Open platform for developers and sysadmins to build, ship, and run distributed applications.

8

Page 9: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Docker

9

Server

Host OS

Hypervisor

GuestOS Guest OS Guest OS Guest OS

Libs/Bins Libs/Bins Libs/Bins

App 1 App 2 App 3 App 4

Libs/Bins

Server

Host OS

Docker Engine

Libs/Bins Libs/Bins

App 1 App 2 App 3 App 4

c1 c2 c3 c4

VM1 VM2 VM3 VM4

Page 10: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Container and images

10

Docker Images

libcontainer, Union Filesystem

Centos Ubuntu

Jetty

add App.war

Container 1

OracleDB

Container 2

Read only

Writable

Read only

Docker Images

Writable

Page 11: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Avant de commencer…

11

- Démarrez la VM :

login : root

password : osboxes.org

- Activer le réseau

Let’s begin !

Page 12: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Déploiement cm-voting avec Docker links

12

- Code disponible dans la VM (/root/cm-voting) et sur github :

https://github.com/karesti/cm-voting

- Démarrer docker service :

>> service docker start

- Démarrer un container mongo :

>> docker run -i -t -d —name mongo_cmvoting -p 27017:27017 mongo

- Démarrer cm-voting :

>> cd /root/cm-voting

>> docker build -t cmvoting .

>> docker run -i -t -d —p 9000:9000 --link mongo_cmvoting:mongo cmvoting

Page 13: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Deploy cm-voting with docker-compose

13

>> cd /root/cm-voting

>> docker-compose up

Page 14: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Mesos

14

Page 15: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Qu’est-ce Mesos?

15

Système de déploiement

Plateforme d’exécution

Page 16: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Système de déploiement

• Système de déploiement “intelligent”

• Ansible, Chef, Puppet… -> configuration statique

• Mesos assigne dynamiquement les resources en fonction de la charge du cluster (ou d’autres facteurs externes)

16

Qu’est-ce Mesos?

Page 17: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Plateforme d’exécution

• Hosting d’applications plus flexible : Si un slave tombe, l’application est déployée sur une nouvelle instance (framework Marathon)

• HAProxy pour faire du load balancing

• Alternative aux solutions Paas payantes (Heroku, Azure, Openshift...)

17

Qu’est-ce Mesos?

Page 18: Workshop mesos docker devoxx fr 2016

#DevoxxFR 18

Qu’est-ce Mesos?

ZKMaster Master

Executor

Executor Slaves

Executor Executor

Executor Executor

Executor Executor Executor

Page 19: Workshop mesos docker devoxx fr 2016

#DevoxxFR 19

Qu’est-ce Mesos?

mesos.apache.org/documentation/latest/mesos-architecture/

Page 20: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Mesos frameworks : Marathon

20

• Marathon est un framework Mesos écrit en Scala

• Fournit un moyen facile pour déployer des conteneurs Docker

• Gestion d’applications à haute disponibilité

• Rest API orientée développeurs

Page 21: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Mesos frameworks : Marathon

21

ZKMaster Master

Executor

Executor Slaves

Executor Executor

Executor Executor

Executor Executor Executor

Page 22: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Mesos frameworks : Marathon

22

ZK Master Master

Executor

Executor Slaves

Executor Executor

Executor Executor

Executor Executor Executor

Marathon

Page 23: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Service discovery avec MesosDNS

23

cm-voting

Mesos slave 1

Mesos slave 2

REPLICATION, LOAD BALANCING...

Page 24: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Service discovery avec MesosDNS

24

cm-voting

Mesos slave 1

Mesos slave 2

AND FAILOVER…

Page 25: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Service discovery avec MesosDNS

25

https://github.com/mesosphere/mesos-dns

Page 26: Workshop mesos docker devoxx fr 2016

#DevoxxFR

2ème partie du workshop : deploy cmvoting sur Mesos

26

Page 27: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Create mesos cluster

• Docker binding

• Chaque port simule un noeud du cluster

27

Page 28: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Docker binding

28

Host

/root/mongo/data

Host

/var/run/docker.sock

Docker container

/data/db

Docker container

/var/run/docker.sock

Page 29: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Create cluster (I)

29

• Déployer zookeeper :

>> docker run -d -e SERVER_ID=1 -p 2181:2181 garland/zookeeper

• Déployer mesos master

>> docker run -d -p 5050:5050 -e "MESOS_HOSTNAME=${HOST_IP}" \\

-e "MESOS_IP=${HOST_IP}" -e "MESOS_QUORUM=1" \\

-e "MESOS_ZK=zk://${HOST_IP}:2181/mesos" --name mesos-master \\

-e "MESOS_LOG_DIR=/var/log/mesos" --net host --restart always \\ mesoscloud/mesos-master:0.23.0-centos-7

Page 30: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Create cluster (II)

30

• Déployer marathon :

>> docker run -d -e "MARATHON_HOSTNAME=${HOST_IP}" \\-e "MARATHON_HTTPS_ADDRESS=$ {HOST_IP}”\\ -e "MARATHON_HTTP_ADDRESS=${HOST_IP}" \\-e "MARATHON_MASTER=zk://${HOST_IP}:2181/mesos" \\-e "MARATHON_ZK=zk://${HOST_IP}:2181/marathon" \\--name marathon --net host --restart always \\mesoscloud/marathon:v1.0.0-RC1

Page 31: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Create cluster (III)

31

>> docker run -p 5051:5051 -d -e "MESOS_HOSTNAME=${HOST_IP}" \\-e MESOS_PORT=5051 -e "MESOS_IP=$ {HOST_IP}" \\-e "MESOS_MASTER=zk://${HOST_IP}:2181/mesos" \\-v /sys/fs/cgroup:/sys/fs/cgroup \\-v /var/run/ docker.sock:/var/run/docker.sock \\--name slave1 --net host --privileged --restart \\ always mesoscloud/mesos-slave:0.23.0-centos-7

>> docker run -p 5052:5052 -d -e "MESOS_HOSTNAME=${HOST_IP}" \\-e MESOS_PORT=5052 -e "MESOS_IP=$ {HOST_IP}" \\-e "MESOS_MASTER=zk://${HOST_IP}:2181/mesos" \\-v /sys/fs/cgroup:/sys/fs/cgroup \\-v /var/run/ docker.sock:/var/run/docker.sock \\--name slave2 --net host --privileged --restart \\ always mesoscloud/mesos-slave:0.23.0-centos-7

>> docker run -p 5053:5053 -d -e "MESOS_HOSTNAME=${HOST_IP}" \\-e MESOS_PORT=5053 -e "MESOS_IP=$ {HOST_IP}" \\-e "MESOS_MASTER=zk://${HOST_IP}:2181/mesos" \\-v /sys/fs/cgroup:/sys/fs/cgroup \\-v /var/run/ docker.sock:/var/run/docker.sock \\--name slave3 --net host --privileged --restart \\ always mesoscloud/mesos-slave:0.23.0-centos-7

Slave 3

Slave 2

Slave 1

Page 32: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Mesos GUI

32

Page 33: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Marathon GUI

33

Page 34: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Déployer cm-voting• Deploy MesosDNS :

curl -H "Content-Type: application/json" -X POST -d '{"id":"mesos-dns", "cmd":"/usr/bin/mesos-dns -v=2 -config=/config.json", "cpus":0.5, "mem":500, "container":{"type":"DOCKER", "docker":{"image":"mesosdns", "network":"HOST"}}}' http://10.0.2.15:8080/v2/apps?force=true

• Deploy Mongo

curl -H "Content-Type: application/json" -X POST -d '{"id":"mongo", "cmd":"cat /etc/resolv.conf > /tmp/temp && echo \"nameserver 10.0.2.15\" > /etc/resolv.conf && cat /tmp/temp >> /etc/resolv.conf && mongod", "cpus":0.5, "mem":500, "container":{"type":"DOCKER", "docker":{"image":"mongo", "privileged":true, "network":"BRIDGE", "portMappings":[{"containerPort": 27017, "hostPort": 0}]}}}' http://10.0.2.15:8080/v2/apps?force=true

34

Page 35: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Is MesosDNS working?

• Add this line to the beginning of /etc/resolv.conf :

nameserver 10.0.2.15

• Ask MesosDNS for Mongo service

>> dig mongo.marathon.mesos

>> dig _mongo._tcp.marathon.mesos SRV

35

Page 36: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Déployer cm-voting

• Deploy cmvoting

curl -H "Content-Type: application/json" -X POST -d '{"id":"cmvoting", "cmd":"cat /etc/resolv.conf > /tmp/temp && echo \"nameserver 10.0.2.15\" > /etc/resolv.conf && cat /tmp/temp >> /etc/resolv.conf && revel run github.com/karesti/cm-voting prod 9000", "cpus":0.5, "instances":1, "mem":250, "container":{"type":"DOCKER", "docker":{"image":"cmvoting", "network":"HOST"}}, "env" : {"SERVICE_NAME":"mongo"}}' http://10.0.2.15:8080/v2/apps?force=true

36

Page 37: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Vérifier que cmvoting tourne

37

Page 38: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Load balancing : lb-marathon

38

• Outil qui gère HAProxy

• Il se souscrit à l’event bus de Marathon

• Il met à jour la configuration du HAProxy en temps réel

• Health checking

• SSL support

Page 39: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Demo

39

Page 40: Workshop mesos docker devoxx fr 2016

#DevoxxFR 40

GESTION DU FAILOVER LENT

NO HEALTH CHECKING

LES REQUETES PEUVENT ETRE

MISES EN CACHE

SERVICE PORTS NON IDENTIFIABLES

MesosDNS drawbacks

Page 41: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Service discovery avec lb-marathon

41

cm-voting

cm-voting

lb-marathon

lb-marathon

Marathon

Mongolb-marathon

Page 42: Workshop mesos docker devoxx fr 2016

#DevoxxFR

• Multitenant workloads : isolation faible -> la performance d’une app peut être impactée par une autre app (plusieures apps s’exécutent sur la même machine)

• Support pour les bases de données (Cassandra, HDFS, Kafka…) Jusqu’à maintenant mesos -> tâches orientées calculs. Gestion améliorée du disque.

42

Future<Mesos>

Page 43: Workshop mesos docker devoxx fr 2016

#DevoxxFR

Merci !

43