Source-to-container no mundo real

34

Transcript of Source-to-container no mundo real

Page 1: Source-to-container no mundo real
Page 2: Source-to-container no mundo real

Source-to-ContainerNo mundo real

Page 3: Source-to-container no 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 :)

Page 4: Source-to-container no mundo real

Estamos descobrindo maneiras melhores de entregar software

fazendo-o nós mesmos e ajudando outros a fazê-lo

Page 5: Source-to-container no mundo real

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

Page 6: Source-to-container no mundo real

Construindo Docker

Page 7: Source-to-container no mundo real

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

Page 8: Source-to-container no mundo real

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>

Page 9: Source-to-container no mundo real

Construindo Docker

Page 10: Source-to-container no mundo real

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

Page 11: Source-to-container no mundo real

Construindo Docker

Parâmetros

Page 12: Source-to-container no mundo real

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

Page 13: Source-to-container no mundo real

Obtendo parâmetros

Page 14: Source-to-container no mundo real

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

Page 15: Source-to-container no mundo real

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

Page 16: Source-to-container no mundo real

Rodando Docker

docker run -it -p 8080:8080 -e CONSUL=localhost:8500 devops-week

Page 17: Source-to-container no mundo real

Construindo Docker

ParâmetrosDescoberta de

Serviço

Page 18: Source-to-container no mundo real

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)

Page 19: Source-to-container no mundo real

Descoberta de Serviço

docker run -it \ --net=host \ --volume=/var/run/docker.sock:/tmp/docker.sock \ gliderlabs/registrator:latest \ consul://localhost:8500

Page 20: Source-to-container no mundo real

Descoberta de Serviço

Page 21: Source-to-container no mundo real

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

Page 22: Source-to-container no mundo real

Construindo Docker

ParâmetrosDescobrindo

ServiçoLog

Centralizado

Page 23: Source-to-container no mundo real

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

Page 24: Source-to-container no mundo real

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

Page 25: Source-to-container no mundo real

Construindo Docker

ParâmetrosDescobrindo

ServiçoLog

Centralizado

Deploy Remoto

Spot

Page 26: Source-to-container no mundo real

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

Page 27: Source-to-container no mundo real

Deploy Remoto - docker-machine

$ eval $(docker-machine env servidor)$ docker pull registry/devops-week$ docker run ...

Page 28: Source-to-container no mundo real

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)

Page 29: Source-to-container no mundo real

Deploy Remoto - pipeline

Page 30: Source-to-container no mundo real

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

Page 31: Source-to-container no mundo real
Page 32: Source-to-container no mundo real

Estamos contratando!Escritórios em São Paulo e Campinas

Page 33: Source-to-container no mundo real

Slides e vagas disponíveis em:http://geofusion.tech

Page 34: Source-to-container no mundo real

[email protected]

Evandro Silvestre