tsuru internals -...
TRANSCRIPT
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
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 }
Scheduler• Segregação
• Disponibilidade
• Otimização de recursos
• Quantidade de containers
• Memória disponível
Managed nodes
• Nodes criados com integração com IaaS
• Suporte a EC2 e CloudStack
• [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 }
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
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
• 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) }
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
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 :-(
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
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/