Configurar o Fluent Bit como um DaemonSet para enviar logs ao CloudWatch Logs - Amazon CloudWatch

Configurar o Fluent Bit como um DaemonSet para enviar logs ao CloudWatch Logs

As seções a seguir ajudam a implantar o Fluent Bit para enviar logs de contêineres ao CloudWatch Logs.

O que se difere se você já estiver usando Fluentd

Se você já estiver usando o Fluentd para enviar logs de contêineres ao CloudWatch Logs, leia esta seção para ver as diferenças entre o Fluentd e o Fluent Bit. Se ainda não estiver usando o Fluentd com o Container Insights, você pode pular para Configurar o Fluent Bit.

Fornecemos duas configurações padrão para o Fluent Bit:

  • Configuração otimizada do Fluent Bit: uma configuração alinhada às práticas recomendadas do Fluent Bit.

  • Configuração compatível com Fluentd: uma configuração alinhada ao comportamento Fluentd o máximo possível.

A lista a seguir explica as diferenças entre o Fluentd e cada configuração do Fluent Bit em detalhes.

  • Diferenças nos nomes de fluxo de logs: se você usar a configuração otimizada do Fluent Bit, os nomes de fluxo de logs serão diferentes.

    Em /aws/containerinsights/Cluster_Name/application

    • A configuração otimizada do Fluent Bit envia logs para kubernetes-nodeName-application.var.log.containers.kubernetes-podName_kubernetes-namespace_kubernetes-container-name-kubernetes-containerID

    • O Fluentd envia logs para kubernetes-podName_kubernetes-namespace_kubernetes-containerName_kubernetes-containerID

    Em /aws/containerinsights/Cluster_Name/host

    • A configuração otimizada do Fluent Bit envia logs para kubernetes-nodeName.host-log-file

    • O Fluentd envia logs para host-log-file-Kubernetes-NodePrivateIp

    Em /aws/containerinsights/Cluster_Name/dataplane

    • A configuração otimizada do Fluent Bit envia logs para kubernetes-nodeName.dataplaneServiceLog

    • O Fluentd envia logs para dataplaneServiceLog-Kubernetes-nodeName

  • Os arquivos de log kube-proxy e aws-node = que o Container Insights grava estão em locais diferentes. Na configuração do FluentD, eles estão em /aws/containerinsights/Cluster_Name/application. Na configuração otimizada do Fluent Bit, eles estão em /aws/containerinsights/Cluster_Name/dataplane.

  • A maioria dos metadados, como pod_name e namespace_name são os mesmos no Fluent Bit e no Fluentd, mas os seguintes são diferentes.

    • A configuração otimizada do Fluent Bit usa docker_id, e o Fluentd usa Docker.container_id.

    • Nenhuma das duas configurações do Fluent Bit usa os metadados a seguir. Eles estão presentes apenas no Fluentd: container_image_id, master_url, namespace_id e namespace_labels.

Configurar o Fluent Bit

Para configurar o Fluent Bit para coletar logs de seus contêineres, siga as etapas em Configuração de início rápido para o Container Insights no Amazon EKS e no Kubernetes ou siga as etapas nesta seção.

Com qualquer dos dois métodos, a função do IAM que está anexada aos nós do cluster deve ter permissões suficientes. Para obter mais informações sobre as permissões necessárias para executar um cluster do Amazon EKS, consultePolíticas, funções, e permissões do Amazon EKS IAM no Manual do usuário do Amazon EKS.

Nas etapas a seguir, você configura o FluentD como um DaemonSet para enviar logs ao CloudWatch Logs. Ao concluir esta etapa, o Fluent Bit criará os grupos de log a seguir, caso eles ainda não existam.

Nome do grupo de logs Origem do log

/aws/containerinsights/Cluster_Name/application

Todos os arquivos de log em /var/log/containers

/aws/containerinsights/Cluster_Name/host

Logs de /var/log/dmesg, /var/log/secure e /var/log/messages

/aws/containerinsights/Cluster_Name/dataplane

Os logs no /var/log/journal para kubelet.service, kubeproxy.service e docker.service.

Para instalar o Fluent Bit para enviar logs de contêineres ao CloudWatch Logs

  1. Se você ainda não tem um namespace chamado amazon-cloudwatch, crie um inserindo este comando:

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
  2. Execute o comando a seguir para criar um ConfigMap chamado cluster-info com o nome do cluster e a região para enviar logs. Substitua cluster-name e cluster-region pelo nome e pela região de seu cluster.

    ClusterName=cluster-name RegionName=cluster-region FluentBitHttpPort='2020' FluentBitReadFromHead='Off' [[ ${FluentBitReadFromHead} = 'On' ]] && FluentBitReadFromTail='Off'|| FluentBitReadFromTail='On' [[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer='Off' || FluentBitHttpServer='On' kubectl create configmap fluent-bit-cluster-info \ --from-literal=cluster.name=${ClusterName} \ --from-literal=http.server=${FluentBitHttpServer} \ --from-literal=http.port=${FluentBitHttpPort} \ --from-literal=read.head=${FluentBitReadFromHead} \ --from-literal=read.tail=${FluentBitReadFromTail} \ --from-literal=logs.region=${RegionName} -n amazon-cloudwatch

    Neste comando, o FluentBitHttpServer para monitorar métricas de plugin é ativado por padrão. Para desativá-lo, altere a terceira linha no comando para FluentBitHttpPort='' (string vazia) no comando.

    Também por padrão, o Fluent Bit lê arquivos de log a partir do final e capturará somente novos logs depois de implantado. Caso queira o oposto, defina FluentBitReadFromHead='On', e ele coletará todos os logs no sistema de arquivos.

  3. Baixe e implante o DaemonSet do Fluent Bit no cluster executando os comandos a seguir.

    • Se quiser a configuração otimizada do Fluent Bit, execute este comando.

      kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit.yaml
    • Se desejar que a configuração do Fluent Bit seja mais semelhante ao Fluentd, execute este comando.

      kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit-compatible.yaml
  4. Valide a implantação inserindo o comando a seguir. Cada nó deve ter um pod chamado fluent-bit-*.

    kubectl get pods -n amazon-cloudwatch

As etapas acima criarão os seguintes recursos no cluster:

  • Uma conta de serviço chamada Fluent-Bit no namespace amazon-cloudwatch. Essa conta de serviço é usada para executar o DaemonSet do Fluent Bit. Para obter mais informações, consulte Gerenciar contas de serviço (em inglês) na Referência do Kubernetes.

  • Uma função do cluster chamada Fluent-Bit-role no namespace amazon-cloudwatch. Essa função do cluster concede permissões get, list e watch em logs de pod para a conta de serviço Fluent-Bit. Para obter mais informações, consulte Visão geral da API (em inglês) na Referência do Kubernetes.

  • Um ConfigMap chamado Fluent-Bit-config no namespace amazon-cloudwatch. Esse ConfigMap contém a configuração a ser usada pelo Fluent Bit. Para obter mais informações, consulte Configurar um pod para usar um ConfigMap na documentação do Kubernetes Tasks.

Se pretende verificar a configuração do Fluent Bit, siga estas etapas.

Verifique a configuração do Fluent Bit

  1. Abra o console do CloudWatch em https://console.aws.amazon.com/cloudwatch/.

  2. No painel de navegação, escolha Log groups (Grupos de logs).

  3. Certifique-se de que você está na região na qual implantou o Fluent Bit.

  4. Confira a lista de grupos de logs na região. Você deve ver o seguinte:

    • /aws/containerinsights/Cluster_Name/application

    • /aws/containerinsights/Cluster_Name/host

    • /aws/containerinsights/Cluster_Name/dataplane

  5. Navegue até um desses grupos de log e marque Last Event Time (Hora do último evento) para os fluxos de log. Se for recente em relação à implantação do Fluent Bit, a instalação será verificada.

    Pode haver um pequeno atraso na criação do grupo de logs /dataplane. Isso é normal, pois esses grupos de log só são criados quando o Fluent Bit começa a enviar logs a esse grupo de logs.

Suporte a logs de várias linhas

Por padrão, o iniciador da entrada do log de várias linhas é qualquer caractere sem espaço em branco. Isso significa que todas as linhas do log que começam com um caractere que não tenha espaço em branco são consideradas como uma nova entrada de log de várias linhas.

Se seus próprios logs de aplicativo usarem um iniciador de várias linhas diferente, você poderá oferecer suporte a eles fazendo duas alterações no arquivo Fluent-Bit.yaml.

Primeiro, exclua-os da entrada padrão adicionando os nomes de caminho dos arquivos de log a um campo exclude_path na seção containers de Fluent-Bit.yaml. Veja um exemplo a seguir.

[INPUT] Name tail Tag application.* Exclude_Path full_pathname_of_log_file*, full_pathname_of_log_file2* Path /var/log/containers/*.log

Adicione um bloco para seus arquivos de log ao arquivo Fluent-Bit.yaml. Consulte o exemplo de configuração de log do cloudwatch-agent abaixo do qual usa uma expressão regular de carimbo de data/hora como o iniciador de várias linhas.

application-log.conf: | [INPUT] Name tail Tag application.* Path /var/log/containers/cloudwatch-agent* Docker_Mode On Docker_Mode_Flush 5 Docker_Mode_Parser cwagent_firstline Parser docker DB /fluent-bit/state/flb_cwagent.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 parsers.conf: | [PARSER] Name cwagent_firstline Format regex Regex (?<log>(?<="log":")\d{4}[\/-]\d{1,2}[\/-]\d{1,2}[ T]\d{2}:\d{2}:\d{2}(?!\.).*?)(?<!\\)".*(?<stream>(?<="stream":").*?)".*(?<time>\d{4}-\d{1,2}-\d{1,2}T\d{2}:\d{2}:\d{2}\.\w*).*(?=}) Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%LZ

(Opcional) Reduzir o volume de log do Fluent Bit

Por padrão, enviamos logs de aplicação do Fluent Bit e metadados do Kubernetes ao CloudWatch. Para reduzir o volume de dados que estão sendo enviados ao CloudWatch, você pode impedir que uma ou ambas as fontes de dados sejam enviadas ao CloudWatch.

Para interromper os logs de aplicação do Fluent Bit, remova a seção a seguir do arquivo Fluent-Bit.yaml.

[INPUT] Name tail Tag application.* Path /var/log/containers/fluent-bit* Parser docker DB /fluent-bit/state/flb_log.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10

Para remover os metadados do Kubernetes, a fim de que não sejam anexados aos eventos de log enviados ao CloudWatch, adicione uma linha à seção application-log.conf do arquivo Fluent-Bit.yaml.

application-log.conf: | [FILTER] Name nest Match application.* Operation lift Nested_under kubernetes Add_prefix Kube. [FILTER] Name modify Match application.* Remove Kube.<Metadata_1> Remove Kube.<Metadata_2> Remove Kube.<Metadata_3> [FILTER] Name nest Match application.* Operation nest Wildcard Kube.* Nested_under kubernetes Remove_prefix Kube.

Solução de problemas

Caso não veja esses grupos de log e esteja procurando na região correta, confira os logs para os pods do DaemonSet do FluentD para procurar o erro.

Execute o comando a seguir para certificar-se de que o status seja Running.

kubectl get pods -n amazon-cloudwatch

Se os logs tiverem erros relacionados às permissões do IAM, verifique a função do IAM que está anexada aos nós do cluster. Para obter mais informações sobre as permissões necessárias para executar um cluster do Amazon EKS, consultePolíticas, funções, e permissões do Amazon EKS IAM no Manual do usuário do Amazon EKS.

Se o status do pod for CreateContainerConfigError, obtenha o erro exato executando o comando a seguir.

kubectl describe pod pod_name -n amazon-cloudwatch

Painel

É possível criar um painel para monitorar métricas de cada plugin em execução. Você pode visualizar dados para bytes de entrada e saída e para taxas de processamento de registros, bem como erros de saída e taxas de repetição/falha. Para visualizar essas métricas, será necessário instalar o agente do CloudWatch com a coleção de métricas do Prometheus para clusters do Amazon EKS e do Kubernetes. Consulte Instalar o agente do CloudWatch com a coleção de métricas do Prometheus em clusters do Amazon EKS e do Kubernetes Instalar o agente do CloudWatch com a coleção de métricas do Prometheus em clusters do Amazon EKS e do Kubernetes para obter mais informações sobre como configurar o painel.

nota

Antes de configurar este painel, é necessário configurar as métricas do Container Insights para o Prometheus. Para mais informações, consulte Monitoramento de métricas do Container Insights Prometheus.

Para criar um painel para métricas do Prometheus do Fluent Bits

  1. Crie variáveis de ambiente, substituindo os valores à direita nas linhas a seguir para corresponder a sua implantação.

    DASHBOARD_NAME=your_cw_dashboard_name REGION_NAME=your_metric_region_such_as_us-west-1 CLUSTER_NAME=your_kubernetes_cluster_name
  2. Crie o painel executando o comando a seguir.

    curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/fluent-bit/cw_dashboard_fluent_bit.json \ | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \ | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \ | xargs -0 aws cloudwatch put-dashboard --dashboard-name ${DASHBOARD_NAME} --dashboard-body