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/