Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Source-to-container no mundo real

178 views

Published on

Veja nessa apresentação como estamos entregando containers imutáveis em produção com descoberta de serviço e configuração centralizada.

Published in: Technology
  • Be the first to comment

Source-to-container no mundo real

  1. 1. Source-to-Container No mundo real
  2. 2. Quem sou?? Evandro Silvestre - silvestree@gmail.com • Primeiro código aos 15 anos • Trabalha na Geofusion há 8 anos • Gerente de Engenharia • Gamer nas horas vagas • Futuro pai de primeira viagem :)
  3. 3. Estamos descobrindo maneiras melhores de entregar software fazendo-o nós mesmos e ajudando outros a fazê-lo
  4. 4. Premissas • Mesmo container para todos os ambientes (dev/hom/prod) ○ Inclusive na máquina do desenvolvedor • Parametrização dinâmica • Modelo não invasivo: a aplicação não precisa conhecer regras de infraestrutura • Pipeline automatizado • Instâncias EC2 “burras” • Logs Centralizados
  5. 5. Construindo Docker
  6. 6. Construindo Docker • Maven Plugin da Fabric8io: https://dmp.fabric8.io/ • Construímos o código e adicionamos o artefato na imagem docker ○ Construindo: mvn docker:build ○ Executando: mvn docker:start ○ Empurrando: mvn docker:push
  7. 7. Construindo Docker <plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.14.1</version> <configuration> <images> <image> <name>devops-week</name> <registry>path_to_registry</registry> <run> <ports> <port>8080:8080</port> </ports> <env> <JAVA_OPTIONS>-Dname=xpto2</JAVA_OPTIONS> </env> </run> <build> <tags> <tag>latest</tag> <tag>${project.version}</tag> </tags> <assembly> <mode>dir</mode> <exportBasedir>true</exportBasedir> <dockerFileDir>.</dockerFileDir> <descriptor>assembly.xml</descriptor> </assembly> </build> </image> </images> </configuration> </plugin>
  8. 8. Construindo Docker
  9. 9. Empurando para o Registry • Docker Registry: https://docs.docker.com/registry/ • Repositório oficial dos docker • O versionamento pode ser por tag ou • Versionamos a cada build usando o hash do commit
  10. 10. Construindo Docker Parâmetros
  11. 11. Obtendo parâmetros • Consul.io: https://www.consul.io/ • Na maioria das vezes usamos a API rest, mas é possível usar Spring Cloud • Todos os ambientes (dev/hom/prod) possuem a mesma estrutura de parâmetros, porém com valores diferentes • Guardamos senha de bancos criptografadas com chaves de criptografia específicas para cada ambiente
  12. 12. Obtendo parâmetros
  13. 13. Subindo Consul.io docker run --net host -it -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true, "datacenter" : "devopsweek", "node_name":"devopsweek"}' -p 8500:8500 -p 53:53/tcp -p 53:53/udp -v $(pwd)/consul/:/consul/data/ consul agent -server -bind=127.0.0.1 -client=127.0.0.1 -ui -bootstrap-expect=1
  14. 14. Obtendo parâmetros if [ ! -z $CONSUL ]; then echo "Using Consul to properties" NAME=$(curl -s http://$CONSUL/v1/kv/devopsweek/name?raw) JAVA_OPTIONS="-Dname='$NAME'"; export JAVA_OPTIONS fi /entrypoint.sh
  15. 15. Rodando Docker docker run -it -p 8080:8080 -e CONSUL=localhost:8500 devops-week
  16. 16. Construindo Docker Parâmetros Descoberta de Serviço
  17. 17. Descoberta de Serviço • Registrator: http://gliderlabs.com/registrator/latest/ • Serviço de registro não invasivo • Usamos o consul.io, mas funciona com vários serviços de descoberta • O registrator fica monitorando o socket do docker e registrando automaticamente os container que sobem/desce, • É possível usar de diversas maneiras ○ Como serviço de DNS ○ Configurando um load balance (Veja consul-template: https://github.com/hashicorp/consul-template)
  18. 18. Descoberta de Serviço docker run -it --net=host --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest consul://localhost:8500
  19. 19. Descoberta de Serviço
  20. 20. Descoberta de Serviço - Configurando docker run -it -e SERVICE_8080_NAME=app_devopsweek -e SERVICE_TAGS=cluster01 -p 8080:8080 -e CONSUL=localhost:8500 devops-week
  21. 21. Construindo Docker Parâmetros Descobrindo Serviço Log Centralizado
  22. 22. Log Centralizado • Docker Log Driver: https://docs.docker.com/engine/admin/logging/overview/ • Serviço de log centralizado não invasivo • A aplicação não precisa se preocupar com log, só mandar para a saída padrão
  23. 23. Log Centralizado docker run -it -e SERVICE_8080_NAME=app_devopsweek -e SERVICE_TAGS=cluster01 --log-driver=gelf --log-opt gelf-address=udp://localhost:5005 --log-opt tag="devops-week" -p 8080:8080 -e CONSUL=localhost:8500 devops-week
  24. 24. Construindo Docker Parâmetros Descobrindo Serviço Log Centralizado Deploy Remoto Spot
  25. 25. Deploy Remoto - docker-machine • Usando o Docker Machine: https://docs.docker.com/machine/ • Todo o processo é automatizado pela nossa ferramenta de Continuous Delivery • O Docker Machine conecta no servidor hospedeiro • Baixa a última versão do Docker Registry e executa
  26. 26. Deploy Remoto - docker-machine $ eval $(docker-machine env servidor) $ docker pull registry/devops-week $ docker run ...
  27. 27. Deploy Remoto - Spot • Usando EC2 Spot: https://aws.amazon.com/pt/ec2/spot/ • Alguns deploys são feitos criando uma Spot padrão na Amazon • Durante o boot, instalamos o docker e rodamos o container • Todo o processo é gerenciado pelo Puppet • Usamos spots para diminuir - e muito - o nosso custo • Desligamos a instância anterior (se houver)
  28. 28. Deploy Remoto - pipeline
  29. 29. Instâncias EC2 “Burras” • A maioria das nossas instâncias na Amazon são “burras” • Ou seja, elas não sabem o que estão rodando ○ só precisam rodar um docker ○ falar com o consul.io e nossa ferramenta de Continous Delivery • Algumas instâncias precisam de “inteligência”, como um tunning de EBS
  30. 30. Estamos contratando! Escritórios em São Paulo e Campinas
  31. 31. Slides e vagas disponíveis em: http://geofusion.tech
  32. 32. OBRIGADO! silvestree@gmail.com Evandro Silvestre

×