Mesos university - Devoxx France 2015 - part 2

Post on 15-Jul-2015

172 views 7 download

Tags:

transcript

@XebiaFr @YesWeScale#MesosUniversity

Mesos University

@jbclaramonte @plopezFr @jpthiery @aurelienmaury

@XebiaFr @YesWeScale#MesosUniversity

Agenda• Mesos

• Frameworks

• Mesosphere

• Marathon

@YourTwitterHandle@YourTwitterHandle@XebiaFr @YesWeScale#MesosUniversity

Mesos

@XebiaFr @YesWeScale#MesosUniversity

Ressources partagées

Master

Slave Slave Slave Slave

cpu: 2mem: 2048

cpu: 4mem: 16384

cpu: 2mem: 4096

cpu: 32mem: 131072

@XebiaFr @YesWeScale#MesosUniversity

Resources

• 2 méthodes permettent de décrire les slaves du cluster

• Resources

• Tags (ou « Attributes »)

@XebiaFr @YesWeScale#MesosUniversity

Resources• Certaines resources types sont pré définies par Mesos

• cpu

• mem

• disk

• port

@XebiaFr @YesWeScale#MesosUniversity

Resources• Certaines resources types sont pré définies par Mesos

• cpu

• mem

• disk

• port

OBLIGATOIRE !

@XebiaFr @YesWeScale#MesosUniversity

Resources• Trois différentes types de resources

• scalars

• ranges

• sets

@XebiaFr @YesWeScale#MesosUniversity

Resources

cpu:24;mem:24576;disk:409600;ports:[21000-24000];disks:{1,2,3,4,5,6,7,8,9}

@XebiaFr @YesWeScale#MesosUniversity

Resources

cpu:24;mem:24576;disk:409600;ports:[21000-24000];disks:{1,2,3,4,5,6,7,8,9}

Scalar

@XebiaFr @YesWeScale#MesosUniversity

Resources

cpu:24;mem:24576;disk:409600;ports:[21000-24000];disks:{1,2,3,4,5,6,7,8,9}

Range

@XebiaFr @YesWeScale#MesosUniversity

Resources

cpu:24;mem:24576;disk:409600;ports:[21000-24000];disks:{1,2,3,4,5,6,7,8,9}

Set

par exemple /mnt/disk/{diskNum}

@XebiaFr @YesWeScale#MesosUniversity

Mesos: Web UI

@XebiaFr @YesWeScale#MesosUniversity

Mesos: Web UI

@XebiaFr @YesWeScale#MesosUniversity

Mesos: Web UI

@XebiaFr @YesWeScale#MesosUniversity

Mesos: Web UI

@XebiaFr @YesWeScale#MesosUniversity

Mesos: Web UI

@YourTwitterHandle@YourTwitterHandle@XebiaFr @YesWeScale#MesosUniversity

Framework

@XebiaFr @YesWeScale#MesosUniversity

Framework

Framework = Application

@XebiaFr @YesWeScale#MesosUniversity

Frameworks

@XebiaFr @YesWeScale#MesosUniversity

Framework : API

@XebiaFr @YesWeScale#MesosUniversity

API

@XebiaFr @YesWeScale#MesosUniversity

APIScheduler

• Est notifié par le master de la mise à disposition de ressource

• Demande l’exécution de tâches au master

Executor

• Réalise les taches soumises par le master

@XebiaFr @YesWeScale#MesosUniversity

API

Scheduler Mesos (master)

register

time

Executor

@XebiaFr @YesWeScale#MesosUniversity

API

Scheduler Mesos (master)

registerregistered

time

Executor

@XebiaFr @YesWeScale#MesosUniversity

API

Scheduler Mesos (master)

registerregistered

offer

time

Executor

@XebiaFr @YesWeScale#MesosUniversity

API

Scheduler Mesos (master)

registerregistered

offer

launch

time

launch

Executor

@XebiaFr @YesWeScale#MesosUniversity

API

Scheduler Mesos (master)

registerregistered

offer

launch

updatetime

launch

Executor

update

@XebiaFr @YesWeScale#MesosUniversity

Framework : API

API du Scheduler

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Lifecycle management

Executor

Master

Slave

Scheduler

registered(…)

void registered(SchedulerDriver driver, FrameworkID fwkId, MasterInfo masterInfo);

Master

Standby

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Lifecycle management

Executor

Master

Slave

Scheduler

Master

Standby

disconnected(…)

void disconnected(SchedulerDriver driver);

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Lifecycle management

Executor

Slave

Schedulerreregistered(…)

Master Master

void reregistered(SchedulerDriver driver, MasterInfo masterInfo);

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Resource Allocation

Executor

Master

Slave

HadoopScheduler

resourceOffers(…)

Master

Standby

CassandraScheduler

void resourceOffers(SchedulerDriver driver, List<Offer> offers);

Offre de ressources

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Resource Allocation

CassandraExecutor

Master

Slave

HadoopScheduler

offerRescinded(…)

Master

Standby

CassandraScheduler

Task

Le scheduler Cassandra

exécute le premier la tâche

void offerRescinded(SchedulerDriver driver, OfferID offerId);

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Communication

CassandraExecutor

Master

Slave

HadoopScheduler

statusUpdate(…)

Master

Standby

CassandraScheduler

Task

void statusUpdate(SchedulerDriver driver, TaskStatus taskStatus);

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Communication

CassandraExecutor

Master

Slave

HadoopScheduler

frameworkMessage(…)

Master

Standby

CassandraScheduler

Task

void frameworkMessage(SchedulerDriver driver, ExecutorID execId, SlaveID slaveId, byte[] message);

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Error events

CassandraExecutor

Master

Slave

HadoopScheduler

slaveLost(…)

Master

Standby

CassandraScheduler

Task

void slaveLost(SchedulerDriver driver, SlaveID slaveId);

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Error events

CassandraExecutor

Master

Slave

HadoopScheduler

executorLost(…)

Master

Standby

CassandraScheduler

Task

void executorLost(SchedulerDriver driver,ExecutorID execId, SlaveID slaveId, int status);

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Error events

Executor

Master

Slave

Scheduler

error(…)

Master

Standby

void error(SchedulerDriver driver, String message);

@XebiaFr @YesWeScale#MesosUniversity

Framework : API

API de l’Executor

@XebiaFr @YesWeScale#MesosUniversity

Executor : Lifecycle management

Executor

Master

Slave

Scheduler

registered(…)

Master

Standby

void registered (ExecutorDriver driver, ExecutorInfo execInfo, FrameworkInfo fwkInfo, SlaveInfo slaveInfo);

@XebiaFr @YesWeScale#MesosUniversity

Executor : Lifecycle management

Executor

Master

Slave

Scheduler

Master

Standby

disconnected(…)

void disconnected(ExecutorDriver driver);

@XebiaFr @YesWeScale#MesosUniversity

Executor : Lifecycle management

Executor

Master

Slave

Scheduler

Master

Standby

reregistered(…)

void reregistered(ExecutorDriver driver, SlaveInfo slaveInfo);

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Task management

CassandraExecutor

Master

Slave

launchTask(…)

Master

Standby

CassandraScheduler

Task

void launchTask(ExecutorDriver driver, TaskInfo taskInfo);

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Task management

CassandraExecutor

Master

Slave

killTask(…)

Master

Standby

CassandraScheduler

Task

void killTask(ExecutorDriver driver, TaskID taskId);

schedulerDriver.killTask(…)

@XebiaFr @YesWeScale#MesosUniversity

Scheduler : Communication

CassandraExecutor

Master

Slave

frameworkMessage(…)

Master

Standby

CassandraScheduler

Task

void frameworkMessage(ExecutorDriver driver, byte[] msg);

@YourTwitterHandle@YourTwitterHandle@XebiaFr @YesWeScale#MesosUniversity

Mesosphere : Chronos & Marathon

@XebiaFr @YesWeScale#MesosUniversity

Mesosphere

Florian Leibert

Benjamin HindmanTobi Knaup

@XebiaFr @YesWeScale#MesosUniversity

Mesosphere

Our mission is to make building and running distributed systems as easy as building or running an

app on your smartphone.

@XebiaFr @YesWeScale#MesosUniversity

Chronos

@XebiaFr @YesWeScale#MesosUniversity

Marathon

@XebiaFr @YesWeScale#MesosUniversity

Quoi ?

“Init Daemon” pour Data Center

Private PaaS

@XebiaFr @YesWeScale#MesosUniversity

Pourquoi ?

Simplifier

Automatiser

API pour les développeurs

Améliorer l’efficacité

@XebiaFr @YesWeScale#MesosUniversity

Fonctionnalities

Déploiement élastique

Haute disponibilité

SécuritéSystème

d’évènementsAPI REST

Service Discovery

@XebiaFr @YesWeScale#MesosUniversity

UI : liste des applications

@XebiaFr @YesWeScale#MesosUniversity

UI : créer une application

@XebiaFr @YesWeScale#MesosUniversity

Cycle de vie

Master

Slave Slave Slave Slave

Marathon

Tâches Évènements / Offres

@XebiaFr @YesWeScale#MesosUniversity

Marathon

API REST

@XebiaFr @YesWeScale#MesosUniversity

POST /v2/apps { "id": "myrestapi", "instances": 2, "cpus": 0.3, "mem": 128, "ports": [0], "uris": ["http://storage.googleapis.com/restapi-jb/RestApi.jar"], "cmd": "java -jar RestApi.jar --server.port=$PORT0" }

Démarrer une “Self Contained App”

@XebiaFr @YesWeScale#MesosUniversity

POST /v2/apps { "id": "myrestapi", "instances": 2, "cpus": 0.3, "mem": 128, "ports": [0], "uris": ["http://storage.googleapis.com/restapi-jb/RestApi.jar"], "cmd": "java -jar RestApi.jar --server.port=$PORT0" }

Démarrer une “Self Contained App”

Slave myrestapi$PORT0

ports:[0]

@XebiaFr @YesWeScale#MesosUniversity

POST /v2/apps { "id": "ubuntu", "container": { "type": "DOCKER", "docker": { "image": "libmesos/ubuntu" } }, "instances": 1, "cpus": 0.5, "mem": 512, "uris": [], "cmd": "while sleep 10; do date -u +%T; done" }

Démarrer une application Dockerisée

@XebiaFr @YesWeScale#MesosUniversity

Health check

• Par défaut, information provenant de Mesos

TASK_RUNNING => Healthy

• Configurable via l’API REST de Marathon

@XebiaFr @YesWeScale#MesosUniversity

{ "id": "my-restapi-example-app", ... "healthChecks": [ { "protocol": "COMMAND", "command": { "value": "curl -f -X GET

http://$HOST:$PORT0/simpleapi/info" }, "gracePeriodSeconds": 300, "intervalSeconds": 5, "timeoutSeconds": 3, "maxConsecutiveFailures": 3 } ] }

Health check

@XebiaFr @YesWeScale#MesosUniversity

{ "id": "my-restapi-example-app", ... "healthChecks": [ { "protocol": "HTTP", "path": "/simpleapi/info", "gracePeriodSeconds": 300, "intervalSeconds": 5, "timeoutSeconds": 3, "maxConsecutiveFailures": 3 } ] }

Health check

@XebiaFr @YesWeScale#MesosUniversity

Les contraintes

Contrôler le “où” lors du déploiement

@XebiaFr @YesWeScale#MesosUniversity

Les contraintes : tags

Identifier les ressources par des tags : • type de hardware • emplacement physique (datacenter , rack) • …

Positionnées au démarrage du slave

$ mesos-slave … --attributes="rack_id:2"

@XebiaFr @YesWeScale#MesosUniversity

POST /v2/apps { "id": "my-restapi-example-app", "instances": 2, "cpus": 0.3, "mem": 128, "ports": [0], "uris": ["http://storage.googleapis.com/restapi-jb/RestApi.jar"], "cmd": "java -jar RestApi.jar --server.port=$PORT", "constraints": [["hostname","UNIQUE"] }

Contrainte : UNIQUE

@XebiaFr @YesWeScale#MesosUniversity

POST /v2/apps { "id": "my-restapi-example-app", "instances": 2, "cpus": 0.3, "mem": 128, "ports": [0], "uris": ["http://storage.googleapis.com/restapi-jb/RestApi.jar"], "cmd": "java -jar RestApi.jar --server.port=$PORT", "constraints": [["hostname","UNIQUE"] }

Contrainte : UNIQUE

Slave 1

UserMgt UserMgt

Slave 2

UserMgt CreditApp

Slave 3 Slave 4

UserMgt CreditApp

@XebiaFr @YesWeScale#MesosUniversity

POST /v2/apps { "id": "my-restapi-example-app", "instances": 2, "cpus": 0.3, "mem": 128, "ports": [0], "uris": ["http://storage.googleapis.com/restapi-jb/RestApi.jar"], "cmd": "java -jar RestApi.jar --server.port=$PORT", "constraints": [["harddrive","CLUSTER", "ssd"] }

Contrainte : CLUSTER

Slave 1

UserMgt UserMgt

Slave 2

UserMgt CreditApp

Slave 3 Slave 4

UserMgt UserMgt

ssd

hdd

@XebiaFr @YesWeScale#MesosUniversity

POST /v2/apps { "id": "my-restapi-example-app", "instances": 2, "cpus": 0.3, "mem": 128, "ports": [0], "uris": ["http://storage.googleapis.com/restapi-jb/RestApi.jar"], "cmd": "java -jar RestApi.jar --server.port=$PORT", "constraints":[["hostname","CLUSTER", “slave-3”] }

Contrainte : CLUSTER

Slave 1

UserMgt

Slave 2

UserMgt CreditApp

Slave 3 Slave 4

UserMgt UserMgt CreditApp

@XebiaFr @YesWeScale#MesosUniversity

POST /v2/apps { "id": "my-restapi-example-app", "instances": 2, "cpus": 0.3, "mem": 128, "ports": [0], "uris": ["http://storage.googleapis.com/restapi-jb/RestApi.jar"], "cmd": "java -jar RestApi.jar --server.port=$PORT", "constraints": [["rack_id","GROUP_BY"] }

Contrainte : GROUP_BY

Slave 1

UserMgt

Slave 2

CreditApp

Slave 3 Slave 4

Rack 1

Rack 2

UserMgt CreditApp

UserMgt

UserMgt

@XebiaFr @YesWeScale#MesosUniversity

POST /v2/apps { "id": "my-restapi-example-app", "instances": 2, "cpus": 0.3, "mem": 128, "ports": [0], "uris": ["http://storage.googleapis.com/restapi-jb/RestApi.jar"], "cmd": "java -jar RestApi.jar --server.port=$PORT", "constraints": [["hostname","UNLIKE", "slave-[2-3]"] }

Contrainte : UNLIKE

Slave 1

UserMgt UserMgt

Slave 2

UserMgt CreditApp

Slave 3 Slave 4

UserMgt UserMgt

@XebiaFr @YesWeScale#MesosUniversity

POST /v2/apps { "id": "my-restapi-example-app", "instances": 2, "cpus": 0.3, "mem": 128, "ports": [0], "uris": ["http://storage.googleapis.com/restapi-jb/RestApi.jar"], "cmd": "java -jar RestApi.jar --server.port=$PORT", "constraints": [["hostname","LIKE", "slave-[1-3]"] }

Contrainte : LIKE

Slave 1

UserMgt UserMgt

Slave 2

UserMgt CreditApp

Slave 3 Slave 4

UserMgt UserMgt

@XebiaFr @YesWeScale#MesosUniversity

Application groups

• Définir des liens de dépendance entre les groupes

• Scaler tout un groupe à la fois

@XebiaFr @YesWeScale#MesosUniversity

Marathon : Application groups

/myapp/bdd

postgresql instance=3

redis instance=4

/myapp/service

apache instance=5

tomcat instance=8

myapp

Dépendance

@XebiaFr @YesWeScale#MesosUniversity

{ "id": "/myapp", "groups": [ { "id": "/myapp/bdd", "apps": [ { "id": "/myapp/postgresql", ... }, { "id": "/myapp/redis", ... } ] },{ "id": "/myapp/service", "dependencies": ["/myapp/bdd"], "apps": [ { "id": "/myapp/apache", ... }, { "id": "/myapp/tomcat", ... } ] } ] }

Application groups

@XebiaFr @YesWeScale#MesosUniversity

Service Discovery

Où est mon application ?

@XebiaFr @YesWeScale#MesosUniversity

HaProxy : reload configuration

• HaProxy - Marathon bridge (script)

• Bamboo

@XebiaFr @YesWeScale#MesosUniversity

Service Discovery

Slave 1 Slave 2

Marathon

HA Proxy

HA Proxy Marathon Bridge

HA Proxy

HA Proxy Marathon Bridge

@XebiaFr @YesWeScale#MesosUniversity

Service Discovery

Slave 1 Slave 2

UserMgt Port 31100

UserMgt Port 31200

UserMgt Port 31100

CreditApp Port 31200

UserMgt Port : 10000 CreditApp Port : 20000Marathon

HA Proxy

HA Proxy Marathon Bridge

HA Proxy

HA Proxy Marathon Bridge

@XebiaFr @YesWeScale#MesosUniversity

Service Discovery

Slave 1 Slave 2

UserMgt Port 31100

UserMgt Port 31200

UserMgt Port 31100

CreditApp Port 31200

UserMgt Port : 10000 CreditApp Port : 20000Marathon

HA Proxy

HA Proxy Marathon Bridge

HA Proxy

HA Proxy Marathon Bridge

@XebiaFr @YesWeScale#MesosUniversity

Service Discovery

Slave 1

Marathon

HA Proxy

HA Proxy Marathon Bridge

Slave 2

HA Proxy

HA Proxy Marathon Bridge

UserMgt Port 31100

UserMgt Port 31200

UserMgt Port 31100

CreditApp Port 31200

localhost:10000 { slave1:31100 slave1:31200 slave2:31100

} localhost:20000 {

slave2:31200 }

UserMgt Port : 10000 CreditApp Port : 20000

@XebiaFr @YesWeScale#MesosUniversity

Service Discovery

Slave 1

Marathon

HA Proxy

HA Proxy Marathon Bridge

Slave 2

HA Proxy

HA Proxy Marathon Bridge

UserMgt Port 31100

UserMgt Port 31200

UserMgt Port 31100

CreditApp Port 31200

localhost:10000 { slave1:31100 slave1:31200 slave2:31100

} localhost:20000 {

slave2:31200 }

UserMgt Port : 10000 CreditApp Port : 20000

@XebiaFr @YesWeScale#MesosUniversity

DCOS

@YourTwitterHandle@YourTwitterHandle@XebiaFr @YesWeScale#MesosUniversity

Demo

@YourTwitterHandle@YourTwitterHandle@XebiaFr @YesWeScale#MesosUniversity

Q & A