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

  1. Remover o contêiner do fluentd previamente criado através do comando docker-compose down;
  2. Como root, rodar o comando sysctl -w vm.max_map_count=262144 necessário para funcionamento do ElasticSearch;
  3. 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}}"

  1. 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
  1. 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>
  1. 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;
}

  1. 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;
  2. Realizar algumas requisições HTTP para o endereço http://localhost:8082 afim de que logs sejam gerados e enviados ao fluentd e elasticsearch;
  3. Acessar o Kibana através de um browser no endereço http://localhost:5601 e clicar no item “Patterns”, conforme figura abaixo:
../../_images/pattern_1.png
  1. No campo index pattern, incluir o valor “docker-web*” e em seguinte clicar no botão “Next Step”;
  2. Na tela seguinte, no campo “Time Filter field name”, escolher a opção “@timestamp”, conforme figura abaixo:
../../_images/pattern_2.png
  1. 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:
../../_images/discover_docker_web.png

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