Upload
jean-baptiste-claramonte
View
37
Download
1
Tags:
Embed Size (px)
Citation preview
@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