source-to-container no mundo real

Post on 16-Apr-2017

76 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Source-to-ContainerNo mundo real

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 :)

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

OBRIGADO!silvestree@gmail.com

Evandro Silvestre

top related