Transcript

tsuru internals

Francisco Souza @franciscosouza

what the f**rancisco?!

• Desenvolvedor @ Globo.com

• Open source fanboy

• tsuru developer desde Abril de 2012

Premissas

• Boas práticas

• Simplicidade

• Extensibilidade

• Escalabilidade

• Multilinguagem

• Open source

• No vendor lock-in

Hands on

Por baixo dos panos• app-create

Por baixo dos panos• git push tsuru master

Por baixo dos panos• Acessar http://hello.tdc.souza.cc

Internals

Safe deployment

Processo de deploy• Gera imagem da aplicação

• Cria unidades com imagem da aplicação

• Espera unidades responderem

• Adicionar unidades no balanceamento

• Remove unidades antigos do balanceamento

• Destrói unidades antigos no Docker

Pipelining

• Organização em actions

• Toda action tem forward e backward

• Actions são encadeadas

• Quando uma action falha, o backward de todas as anteriores é executado

type  Result  interface{}  

type  Forward  func(context  FWContext)  (Result,  error)  

type  Backward  func(context  BWContext)  

type  FWContext  struct  {                  Previous  Result                  Params      []interface{}  }  

type  BWContext  struct  {                  FWResult  Result                  Params  []interface{}  }  

type  Action  struct  {                  Name  string                  Forward  Forward                  Backward  Backward                  MinParams  int  }

actions  :=  []*action.Action{                  &reserveUserApp,                  &insertApp,                  &exportEnvironmentsAction,                  &createRepository,                  &provisionApp,                  &setAppIp,  }  pipeline  :=  action.NewPipeline(actions...)  err  =  pipeline.Execute(app,  user)  if  err  !=  nil  {                  //  handle  error  }

Unidade = Docker Container

Container Scheduling

docker-cluster

• Lib em Go para clusterização de nós de Docker

• Managed vs Unmanaged Nodes

Scheduler• Segregação

• Disponibilidade

• Otimização de recursos

• Quantidade de containers

• Memória disponível

Host 1

Host 2

Host 3

IaaS Integration

Managed nodes

• Nodes criados com integração com IaaS

• Suporte a EC2 e CloudStack

• [Coming soon] Suporte a docker-machine

• Extensível

type  Machine  struct  {                  Id                          string  `bson:"_id"`                  Iaas                      string                  Status                  string                  Address                string                  CreationParams  map[string]string  }  

type  IaaS  interface  {                  CreateMachine(params  map[string]string)  (*Machine,  error)                  DeleteMachine(m  *Machine)  error  }

Auto-scaling

Node auto-scaling

• Detecta sobrecarga de recursos

• Quantidade de containers

• Quantidade de memória RAM

• Estratégia de scaling também extensível

type  autoScaleEvent  struct  {                  ID                        interface{}  `bson:"_id"`                  MetadataValue  string                  Action                string                  Reason                string                  StartTime          time.Time                  EndTime              time.Time  `bson:",omitempty"`                  Successful        bool                  Error                  string              `bson:",omitempty"`                  Node                    cluster.Node  `bson:",omitempty"`                  Log                      string              `bson:",omitempty"`  }  

type  autoScaler  interface  {                  scale(event  *autoScaleEvent,  groupMetadata  string,  nodes  []*cluster.Node)  error  }  

Container auto-scaling

• Serviço externo

• Baseado em métricas da aplicação

• Regras definidas pelo usuário

• Flexibilidade vs Complexidade

Healing

Node Healing

• Managed nodes

• Detecta que o nó caiu e substitui

• Monitoração ativa

• Monitoração passiva

Container healing

• Detecta que um container não está saudável

• Status reporting

• Substitui o container

Routers

Routers

• Recebe e encaminha requests

• Suporte a múltiplos tipos

• Interface com operações de gerenciamento de backends e rotas

• Atrelado ao plano

type  Router  interface  {                  AddBackend(name  string)  error                  RemoveBackend(name  string)  error                  AddRoute(name  string,  address  *url.URL)  error                  RemoveRoute(name  string,  address  *url.URL)  error                  SetCName(cname,  name  string)  error                  UnsetCName(cname,  name  string)  error                  Addr(name  string)  (string,  error)                  Swap(string,  string)  error                  Routes(name  string)  ([]*url.URL,  error)  }

Routers (cont.)

• 3 implementações disponíveis:

• Hipache

• Galeb

• Vulcand

Hipache• Router mais antigo

• Node.js

• Configuração no Redis

• WebSocket

• Criado pela DotCloud (atualmente Docker Inc.)

Galeb• Router criado dentro da Globo.com

• Parcialmente open source (até o próximo trimestre)

• Java

• _Rápido_

• Configuração em memória (alterada dinamicamente via API)

• WebSocket

Vulcand• Router mais novo no tsuru

• Go

• Configuração no etcd

• Criado pela Mailgun

• Sem suporte a WebSocket ainda

• Suporte a HTTPS com SNI

Lean containers

Hoje• Todos os processos do Procfile no container

• Agente dentro do container

• Controla processos

• Coleta logs

• Coleta métricas

• Reporta o status dos processos

Problemas• Non-idiomatic Docker

• Agente em Python

• Alto consumo de memória

• Disputa recursos com processos da aplicação

• Python instalado na plataforma de Java?

Lean containers• Um processo por container

• Um container por entrada no Procfile

• Agente rodando isoladamente em outro container

• Apenas uma instância do agente, coletando informações de todos os containers

• Docker controla e mantém processos rodando

bs• Agente que roda dentro de um container

• Docker friendly

• docker run tsuru/bs

• Coleta informações de todos os containers irmãos

• Logs

• Saúde

• Métricas

bs (cont.)

• Uso mais efetivo de recursos

• Escrito em Go

• Nasceu pra vigiar os containers irmãos

• Disponível apenas na próxima versão do tsuru :-(

O que vem por aí

Futuro• tsuru 1.0

• Lean containers

• Melhor gerenciamento de plataformas

• Melhor gerenciamento de plugins

• Integração com Docker Machine

• Terceirizar gerenciamento do cluster?

• Docker Swarm

• Kubernetes

Contribua!

github.com/tsuru

tsuru internals

Francisco Souza @franciscosouza slideshare.net/franciscosouza [email protected]

https://tsuru.io

Links• https://tsuru.io

• https://docker.com

• http://galeb.io

• https://vulcand.io

• https://github.com/tsuru

• http://docs.tsuru.io

• https://github.com/tsuru/bs

• https://circus.rtfd.org

• https://www.docker.com/docker-swarm

• http://kubernetes.io/

Imagens• https://www.flickr.com/photos/underactive/4641141770/

• https://www.flickr.com/photos/dominicspics/1127762669/

• https://www.flickr.com/photos/jaxport/9613150301/

• https://www.flickr.com/photos/lukaskr/16036193656/

• https://www.flickr.com/photos/daveseven/6033338327/

• https://www.flickr.com/photos/jotbepunkt/7981094164/

• https://www.docker.com/sites/default/files/island_1.png

• https://www.flickr.com/photos/kightp/8083387488/

• https://www.flickr.com/photos/baggyjumper/6635779085/

• https://www.flickr.com/photos/98640399@N08/9410826173/