Cap. 3 - Exercício 3: Centralização e Visualização dos Logs dos Contêineres¶
Para aplicar os conhecimentos explanados nesta aula, será necessário implementar um conjunto de soluções e integrações para guarda de logs de um contêiner de teste plenamente funcional. Para tanto, as ações abaixo balizam a implantação de um stack utilizando fluentd (coleta/recepção), elasticsearch (guarda) e Kibana (Visualização):
- Remover o contêiner do fluentd previamente criado através do comando
docker-compose down
; - Como root, rodar o comando
sysctl -w vm.max_map_count=262144
necessário para funcionamento do ElasticSearch; - Criar uma nova pasta chamada “logs” e inserir o seguinte conteúdo para o arquivo docker-compose.yml:
version: '2.2'
volumes:
esdata1:
kibana-plugins:
kibana-bundle:
services:
fluentd:
image: elastic-fluentd
build: fluentd/
restart: unless-stopped
ports:
- 24224:24224
volumes:
- ./fluentd/fluent.conf:/fluentd/etc/fluent.conf
elasticsearch:
image: "docker.elastic.co/elasticsearch/elasticsearch:6.1.2"
volumes:
- esdata1:/usr/share/elasticsearch/data
kibana:
image: "docker.elastic.co/kibana/kibana:6.1.2"
ports:
- 5601:5601
volumes:
- kibana-plugins:/usr/share/kibana/plugins
- kibana-bundle:/usr/share/kibana/optimize
web-test:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
- 8082:80
logging:
driver: fluentd
options:
fluentd-address: localhost:24224
tag: "docker-web.{{.ImageName}}/{{.Name}}/{{.ID}}"
- Criar uma pasta chamada “fluentd” dentro da pasta “logs” e, nela, criar o arquivo Dockerfile com o seguinte conteúdo:
FROM fluent/fluentd
RUN gem install fluent-plugin-elasticsearch --no-rdoc --no-ri
- Ainda na pasta “fluentd”, proceda com a criação de um arquivo chamado “fluent.conf” contendo as seguintes configurações:
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<filter docker-web**>
@type parser
format json
key_name log
</filter>
<match docker-web**>
@type copy
format nginx
<store>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
logstash_prefix docker-web
logstash_dateformat %Y%m%d
include_tag_key true
tag_key @log_name
flush_interval 1s
</store>
</match>
- Criar um arquivo chamado “nginx.conf” na pasta “logs”, contendo as seguintes configurações:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main escape=json '{ "time_local": "$time_local", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"request": "$request", '
'"status": "$status", '
'"body_bytes_sent": "$body_bytes_sent", '
'"request_time": "$request_time", '
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
- Inicializar os contêineres através do comando
docker-compose up -d
. Nesse ponto, o elasticsearch e o Kibana podem demorar de 1 a 2 minutos para serem inicializalidos a depender da configuração de hardware do host; - Realizar algumas requisições HTTP para o endereço
http://localhost:8082
afim de que logs sejam gerados e enviados ao fluentd e elasticsearch; - Acessar o Kibana através de um browser no endereço
http://localhost:5601
e clicar no item “Patterns”, conforme figura abaixo:
- No campo index pattern, incluir o valor “docker-web*” e em seguinte clicar no botão “Next Step”;
- Na tela seguinte, no campo “Time Filter field name”, escolher a opção “@timestamp”, conforme figura abaixo:
- Por fim, basta visualizar os logs gerados clicando no item de menu “Discover” no painel lateral. A visualização há de ocorrer de forma parecida com a da figura abaixo:
Salvando os trabalhos¶
Após a realização das atividades, salve o resultado do trabalho no github, através dos seguintes comandos (a partir da pasta onde os trabalhos se encontram):
# Adicionar os arquivos atuais ao repositório
git add .
# Realizar o 'Commit' das mudanças no repositório local.
git commit -m "Aula 3 - Exercicio 3"
# Criar uma etiqueta para esta aula.
git tag -a aula3_3 -m "Aula 3 - Exercicio 3"
# Enviar as mudanças para o repositório remoto.
git push -u origin master aula3_3