<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aloisio Bilck</title>
    <description>The latest articles on DEV Community by Aloisio Bilck (@aloisiobilck).</description>
    <link>https://dev.to/aloisiobilck</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F384246%2F3c032441-3d35-45e3-868e-bed61c998819.jpg</url>
      <title>DEV Community: Aloisio Bilck</title>
      <link>https://dev.to/aloisiobilck</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aloisiobilck"/>
    <language>en</language>
    <item>
      <title>Kubernetes + Nginx ingress enviando logs para o Graylog com fluent-bit</title>
      <dc:creator>Aloisio Bilck</dc:creator>
      <pubDate>Tue, 25 Oct 2022 19:20:16 +0000</pubDate>
      <link>https://dev.to/aloisiobilck/kubernetes-nginx-ingress-enviando-logs-para-o-graylog-com-fluent-bit-5385</link>
      <guid>https://dev.to/aloisiobilck/kubernetes-nginx-ingress-enviando-logs-para-o-graylog-com-fluent-bit-5385</guid>
      <description>&lt;p&gt;Neste tutorial será mostrado como centralizar os logs do Kubernetes + Nginx-ingress com Fluent-bit. &lt;/p&gt;

&lt;p&gt;Existem outras maneiras talvez mais elegantes, mas optamos em enviar os logs (stdout/stderr) dos pods para o Graylog utilizando o fluent-bit. O fluent-bit será instalado por helm chart. &lt;/p&gt;

&lt;h2&gt;
  
  
  Documentação oficial
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.graylog.org/"&gt;Graylog&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/fluent/helm-charts"&gt;Fluent-bit helm chart&lt;/a&gt; &lt;br&gt;
&lt;a href="https://kubernetes.io/docs/home/"&gt;Kubernetes&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Versões utilizadas
&lt;/h2&gt;

&lt;p&gt;Graylog &amp;gt;= 4.x&lt;br&gt;
fluent-bit &amp;gt;= 0.20.8 &lt;/p&gt;
&lt;h2&gt;
  
  
  Configuração do Fluent-bit
&lt;/h2&gt;

&lt;p&gt;Não irei abordar a instalação do fluent-bit utilizando helm chart. Você pode seguir a documentação oficial para instalação. Irei deixar o &lt;code&gt;custom-values.yaml&lt;/code&gt; que utilizei para instalação. Talvez para seu ambiente você precise customizar mais alguns parâmetros. &lt;br&gt;
Estou enviando os logs de todos os namespaces do cluster para o Graylog, você pode customizar isso utilizando o parâmetro &lt;code&gt;Exclude_Path&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# kind -- DaemonSet or Deployment
kind: DaemonSet

serviceMonitor:
  enabled: true

## https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/configuration-file
config:
  service: |
    [SERVICE]
        Flush 5
        Daemon Off
        Log_Level info
        Parsers_File parsers.conf
        Parsers_File custom_parsers.conf
        HTTP_Server On
        HTTP_Listen 0.0.0.0
        HTTP_Port 2020
        Health_Check On

  ## https://docs.fluentbit.io/manual/pipeline/inputs
  inputs: |
    [INPUT]
        Name tail
        Path /var/log/containers/*.log
        # Aqui estou excluindo o envio dos logs do namespace `logging`.
        Exclude_Path /var/log/containers/*logging*.log
        Parser docker
        Tag kube.*
        DB /var/log/flb_kube.db
        Mem_Buf_Limit 50MB
        Refresh_Interval 10
        Docker_Mode On
        Skip_Long_Lines On
        Buffer_Chunk_Size 64k
        Buffer_Max_Size 64k

  ## https://docs.fluentbit.io/manual/pipeline/filters
  filters: |
    [FILTER]
        Name parser
        Match kube.*
        Key_Name log
        Parser glog_format
        Parser catchall
        Reserve_Data On
        Preserve_Key Off

    [FILTER]
        Name kubernetes
        Match kube.*
        Merge_Log_Key log_processed
        Merge_Log On
        Keep_Log Off
        K8S-Logging.Parser On
        K8S-Logging.Exclude On
        Labels On
        Annotations On
        Buffer_Size 128k

    [FILTER]
        Name nest
        Match *
        Operation lift
        Nested_under log_processed

    [FILTER]
        Name record_modifier
        Match *
        # &amp;lt;tag_cluster&amp;gt; para o graylog identificar qual cluster está enviado os eventos
        Record kubernetes_environment &amp;lt;tag_cluster&amp;gt;

  ## https://docs.fluentbit.io/manual/pipeline/outputs
  outputs: |
    [OUTPUT]
        Name gelf
        Match kube.*
        Host &amp;lt;GRAYLOG_URL&amp;gt;
        Port &amp;lt;GRAYLOG_PORT&amp;gt;
        Mode udp
        Gelf_Short_Message_Key message

    # [OUTPUT]
    #     Name  stdout
    #     Match *
  ## https://docs.fluentbit.io/manual/pipeline/parsers
  customParsers: |
    [PARSER]
        Name glog_format
        Format regex
        Regex ^(?&amp;lt;severity&amp;gt;[IWECF])(?&amp;lt;timestamp&amp;gt;\d{4} \d{2}:\d{2}:\d{2}\.\d{6}) +(?&amp;lt;thread_id&amp;gt;\d+) (?&amp;lt;src_file&amp;gt;[^:]+):(?&amp;lt;src_line&amp;gt;\d+)\] (?&amp;lt;message&amp;gt;(?:.|\n)*)
        Time_Key timestamp
        Time_Format %m%d %H:%M:%S.%L
        Time_Keep Off
        Types thread_id:integer src_line:integer

    [PARSER]
        Name   json_timestamp
        Format json
        Time_Key timestamp
        Time_Keep Off
        Time_Format %Y-%m-%dT%H:%M:%S.%s%z

    [PARSER]
        Name catchall
        Format regex
        Regex ^(?&amp;lt;message&amp;gt;.*)$

logLevel: info
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Nginx Ingress Controller
&lt;/h2&gt;

&lt;p&gt;Na instalação do nginx-ingress por helm chart, utilizei esses parâmetros no custom-values.yaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
controller:
  # Will add custom configuration options to Nginx https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/
  config:
    log-format-escape-json: "true"
    log-format-upstream: '{"time": "$time_iso8601", "remote_addr": "$proxy_protocol_addr", "x_forward_for": "$proxy_add_x_forwarded_for", "request_id": "$req_id", "remote_user": "$remote_user", "bytes_sent": $bytes_sent, "request_time": $request_time, "status": $status, "vhost": "$host", "request_proto": "$server_protocol", "path": "$uri", "request_query": "$args", "request_length": $request_length, "duration": $request_time,"method": "$request_method", "http_referrer": "$http_referer", "http_user_agent": "$http_user_agent" }'
...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>kubernetes</category>
      <category>graylog</category>
    </item>
    <item>
      <title>CENTRALIZAÇÃO DE LOGS DO KUBERNETES COM GRAYLOG + FLUENTD</title>
      <dc:creator>Aloisio Bilck</dc:creator>
      <pubDate>Sat, 23 May 2020 19:07:58 +0000</pubDate>
      <link>https://dev.to/aloisiobilck/centralizacao-de-logs-do-kubernetes-com-graylog-fluentd-22l8</link>
      <guid>https://dev.to/aloisiobilck/centralizacao-de-logs-do-kubernetes-com-graylog-fluentd-22l8</guid>
      <description>&lt;p&gt;Neste tutorial será mostrado como centralizar os logs do Kubernetes com Graylog + Fluentd.&lt;/p&gt;

&lt;p&gt;Existem outras maneiras talvez mais elegantes, mas optamos em enviar os logs (stdout/stderr) dos pods para o Graylog utilizando o &lt;a href="https://github.com/fluent/fluentd-kubernetes-daemonset"&gt;fluentd-kubernetes-daemonset&lt;/a&gt;. &lt;br&gt;
O fluentd(daemonset) irá utilizar as configurações passadas pelo configmap.&lt;/p&gt;

&lt;p&gt;Repositório com os arquivos no &lt;a href="https://github.com/aloisiobilck/graylog.git"&gt;github&lt;/a&gt;  &lt;/p&gt;
&lt;h3&gt;
  
  
  Documentação oficial
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.graylog.org/en/3.2/index.html#"&gt;Graylog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.fluentd.org/"&gt;Fluentd&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Versões utilizadas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Graylog &amp;gt;= 3.1 &lt;/li&gt;
&lt;li&gt;fluentd &amp;gt;= 1.10 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Use sua configuração
&lt;/h2&gt;

&lt;p&gt;Disponibilizamos dois manifestos de configmap.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fluent-configmap.yaml: Responsável pelo arquivo de configuração do fluent.conf&lt;/li&gt;
&lt;li&gt;fluent-kubernetes-configmap.yaml: Responsável pelo arquivo de configuração do kubernetes.conf&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de como criar um configmap usando como base um arquivo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create configmap fluent-kubernetes-configmap &lt;span class="nt"&gt;--from-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubernetes.conf &lt;span class="nt"&gt;--namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kube-system

kubectl create configmap fluent-configmap &lt;span class="nt"&gt;--from-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fluent.conf &lt;span class="nt"&gt;--namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kube-system
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Uso
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Execute os manifestos do configmap.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; fluent-kubernetes-configmap.yaml &lt;span class="nt"&gt;-f&lt;/span&gt; fluent-configmap.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Execute o manifesto do rbac.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; rbac.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Execute o manifesto do daemonset
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; fluent-daemonset.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Graylog
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Configure um input gelf. (Protocolo (TCP/UDP) e porta de sua escolha)&lt;/li&gt;
&lt;li&gt;No Input gelf criado anteriormente, vá em Manager Extractors
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h036gIwk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1dp0jqp0tagnq2zic8s7.png" alt="Alt Text" width="880" height="392"&gt;
&lt;/li&gt;
&lt;li&gt;Adicione um extractor
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7OdHZBWa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2qeq0vtn24u04r6rr75k.png" alt="Alt Text" width="880" height="120"&gt;
&lt;/li&gt;
&lt;li&gt;Load a mensagem e crie um json. 
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KVAGFY1f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rjzjjhkhw2fmdtf3l290.png" alt="Alt Text" width="880" height="363"&gt;
&lt;/li&gt;
&lt;li&gt;Caso não queira realizar os passos anteriores (1-4) manualmente, disponibilizamos um content-pack na pasta &lt;code&gt;./files/&lt;/code&gt; para criação do input+extractors. &lt;a href="https://github.com/aloisiobilck/graylog.git"&gt;Repositório no github&lt;/a&gt;. Necessário apenas importar o content pack e instalar!&lt;/li&gt;
&lt;li&gt;Exemplo de mensagem 
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UCKs8WuR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7w0o7tosok2tfufx7b14.jpg" alt="Alt Text" width="880" height="403"&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>graylog</category>
      <category>fluentd</category>
      <category>kubernetes</category>
    </item>
  </channel>
</rss>
