Francisco Souza @franciscosouza

Transcrição

Francisco Souza @franciscosouza
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
•
Multilinguagem
•
Simplicidade
•
Open source
•
Extensibilidade
•
No vendor lock-in
•
Escalabilidade
Hands on
Por baixo dos panos
•
app-create
Por baixo dos panos
•
git push tsuru master
Por baixo dos panos
•
Acessar http://hello.qcon.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
Host 1
Host 2
Host 3
Host 1
Host 2
Host 3
Host 1
Host 2
Host 3
Host 1
Host 2
Host 3
Host 1
Host 2
Host 3
Host 1
Host 2
Host 3
Host 1
Host 2
Host 3
IaaS
Integration
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 }
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
•
•
Agente rodando isoladamente em outro container
•
•
Um container por entrada no Procfile
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
Contribua!
github.com/tsuru
tsuru internals
https://tsuru.io
Francisco Souza
@franciscosouza
slideshare.net/franciscosouza
[email protected]
Links
•
https://tsuru.io
•
https://github.com/tsuru/bs
•
https://docker.com
•
https://circus.rtfd.org
•
http://galeb.io
•
https://www.docker.com/
docker-swarm
•
https://vulcand.io
•
http://kubernetes.io/
•
https://github.com/tsuru
•
http://docs.tsuru.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/