Source-to-ContainerNo mundo real
Quem sou??
Evandro Silvestre - [email protected]
• Primeiro código aos 15 anos
• Trabalha na Geofusion há 8 anos
• Gerente de Engenharia
• Gamer nas horas vagas
• Futuro pai de primeira viagem :)
Estamos descobrindo maneiras melhores de entregar software
fazendo-o nós mesmos e ajudando outros a fazê-lo
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
Construindo Docker
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
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>
Construindo Docker
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
Construindo Docker
Parâmetros
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
Obtendo parâmetros
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
Obtendo parâmetros
if [ ! -z $CONSUL ]; thenecho "Using Consul to properties"NAME=$(curl -s http://$CONSUL/v1/kv/devopsweek/name?raw)
JAVA_OPTIONS="-Dname='$NAME'"; export JAVA_OPTIONSfi
/entrypoint.sh
Rodando Docker
docker run -it -p 8080:8080 -e CONSUL=localhost:8500 devops-week
Construindo Docker
ParâmetrosDescoberta de
Serviço
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)
Descoberta de Serviço
docker run -it \ --net=host \ --volume=/var/run/docker.sock:/tmp/docker.sock \ gliderlabs/registrator:latest \ consul://localhost:8500
Descoberta de Serviço
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
Construindo Docker
ParâmetrosDescobrindo
ServiçoLog
Centralizado
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
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
Construindo Docker
ParâmetrosDescobrindo
ServiçoLog
Centralizado
Deploy Remoto
Spot
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
Deploy Remoto - docker-machine
$ eval $(docker-machine env servidor)$ docker pull registry/devops-week$ docker run ...
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)
Deploy Remoto - pipeline
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
Estamos contratando!Escritórios em São Paulo e Campinas
Slides e vagas disponíveis em:http://geofusion.tech
Evandro Silvestre
Top Related