O blog da AWS
Log centralizado para Windows Containers no Amazon EKS usando o FluentBit
Por Harsh Rawat, Software Engineer na Amazon Web Services e
Marcio Morales, Principal Solutions Architect na Amazon Web Services.
Introdução
Em novembro de 2022, a Amazon Web Services (AWS) anunciou o suporte para imagens de container Fluent Bit para o sistema operacional Windows. Esse suporte elimina a necessidade de clientes que utilizam Windows implementarem qualquer solução de logs personalizada no código da aplicação ou gerenciarem agentes personalizados em seus nós do Windows para extrair logs. Para obter mais detalhes sobre as versões suportadas do Windows e as tags de imagem do Fluent Bit, visite nossa documentação aqui.
O Fluent Bit é um processador e roteador de logs rápido e flexível, suportado por vários sistemas operacionais. Ele é usado para rotear logs para vários destinos na AWS, como Amazon CloudWatch, destinos no Amazon Kinesis Data Firehose, Amazon Simple Storage Service (Amazon S3) e Amazon OpenSearch. Além dos destinos na AWS, o Fluent Bit oferece suporte a soluções comuns de parceiros, como Datadog, Splunk, servidores HTTP personalizados e muito mais. Para obter mais detalhes sobre roteamento de logs de containeres, visite o link do blog aqui. A AWS já oferece suporte às imagens de container Fluent Bit com base em sistema operacional Linux e essa versão permite que os clientes tenham um mecanismo centralizado para processar e rotear seus logs no Amazon Elastic Container Service (Amazon ECS) e no Amazon Elastic Kubernetes Service (Amazon EKS) para cargas de trabalho Linux e Windows.
Neste post, abordamos como os clientes do Amazon EKS podem implementar imagens do Fluent Bit Windows como um DaemonSet em seus nós Windows, afim de transmitir os logs do Internet Information Services (IIS) gerados nos pods Windows para os logs do Amazon CloudWatch, como forma de centralizar o registro. Vamos configurar o Fluent Bit para rotear todos os logs gerados por pods em diferentes namespaces para os respectivos CloudWatch Logs Groups. Além disso, cada entrada de log seria enriquecida com metadados adicionais do Kubernetes, como namespace, nome do pod, nome do container, nome da imagem, nome do host etc. Para obter mais detalhes sobre a implementação do Fluent Bit no cluster Windows do Amazon ECS, visite nossa postagem no blog aqui.
Pré-requisitos
Pré-requisitos e premissas:
- Cluster Amazon EKS (1.20 ou mais recente) instalado e funcionando. Veja este guia passo a passo.
- Iniciar os Windows worker nodes do Amazon EKS. Veja este guia passo a passo.
- Instalação e configuração apropriada da Amazon Command Line Interface (AWS CLI), eksctl e kubectl.
- Para criar uma imagem de container do Windows, iniciar uma instância Windows no Amazon Elastic Compute Cloud (Amazon EC2) com o Docker instalado, que é baseado na mesma versão Windows dos worker nodes do Amazon EKS. Como alternativa, você também pode usar o Amazon EC2 Image Builder para criar sua imagem de container.
- Criar o repositório Amazon Elastic Container Registry (Amazon ECR) para hospedar a imagem do Windows Container. Veja este tutorial passo a passo.
Visão geral da solução
Neste blogpost, executaremos as seguintes tarefas:
- Validar se os Windows worker nodes estão em funcionamento.
- Criar o namespace Kubernetes amazon-cloudwatch no qual o Fluent Bit será executado.
- Configurar as políticas do AWS Identity and Access Management (AWS IAM) adequadas para permitir que o Fluent Bit envie os logs para os destinos necessários.
- Criar um config map com a configuração necessária.
- [Opcional] Criar uma imagem de Windows Container contendo IIS e LogMonitor.
- Implementar o FluentBit no Windows worker node como um DaemonSet.
- Implementar a imagem de Windows Container contendo IIS e LogMonitor.
- [Opcional] Acessar os pods do IIS para gerar logs.
- Verificar logs no Amazon CloudWatch.
- Limpar os recursos criados.
Você pode esperar o seguinte resultado:
Como você pode ver, temos dois nós Windows Server 2019 baseados no Amazon EKS versão 1.23, que estão usando docker e containerd runtime, respectivamente.
2. Crie o namespace Kubernetes amazon-cloudwatch para Fluent Bit
Os namespaces Kubernetes fornecem um escopo para nomes e organizam sua carga de trabalho dentro do cluster. Para consolidar todos os recursos do Fluent Bit, criaremos um namespace chamadoamazon-cloudwatch
.
2.1 Crie um arquivo com o seguinte conteúdo e nomeie como namespace.yaml:namespace.yaml
:
2.2 Execute o seguinte comando para criar o namespace:
3. Configure as políticas do IAM necessárias para permitir que o Fluent Bit envie os logs para os destinos necessários
O Fluent Bit exige permissões específicas do IAM para enviar os logs aos destinos na AWS. As permissões necessárias para um plug-in de saída do Fluent Bit são mencionadas na documentação do mesmo. Por exemplo, usamos o Amazon CloudWatch como destino dos logs. A seguinte permissão do IAM se aplica:
Você também pode verificar detalhes adicionais na documentação oficial do Fluent Bit.
Seguindo o princípio do menor privilégio, em vez de criar e distribuir suas credenciais AWS para os containeres ou usar a instance role do Amazon EC2, você pode usar o IAM Roles for Service Accounts (IRSA) e configurar seus pods para usar a conta de serviço Kubernetes. Para obter mais detalhes, consulte a documentação aqui.
Como alternativa, o Fluent Bit pode usar as permissões da IAM Role anexada à instância do Amazon EC2. Para obter mais detalhes sobre como anexar políticas específicas do IAM ao criar nodegroups usando eksctl, visite a documentação de schema aqui. Você também pode anexar as políticas do IAM depois que o nodegroup for criado. Consulte a documentação aqui.
3.1 Para configurar IAM Roles para contas de serviço (ou seja, IRSA) no Amazon EKS, precisamos associar um provedor IAM OpenID Connect (OIDC) ao cluster Amazon EKS. Verifique se seu cluster Amazon EKS tem um provedor IAM OIDC existente, executando o seguinte comando:
3.2 Se você precisar criar um provedor IAM OIDC, execute o seguinte comando:
3.3 Crie um arquivo chamado fluent-bit-policy.json
com a política mencionada acima. Execute o comando a seguir para criar a política do IAM.
3.4 Crie a conta de serviço do IAM e anexe a política criada anteriormente.
Execute o comando a seguir para criar uma conta de serviço do IAM usandoeksctl
:
Para executar a mesma configuração usando a AWS CLI, consulte a documentação aqui.
4. Crie um config map com a configuração necessária
Precisamos fornecer alguns detalhes ao Fluent Bit para configurá-lo. Isso inclui o nome e a região do cluster. Podemos fazer isso usando Config Maps.
4.1 Execute o seguinte comando para criar um config map, afim de fornecer opções de configuração para o Fluent Bit:
Por padrão, o Fluent Bit lê arquivos de log a partir da ponta (tail) e captura somente novos logs após sua implantação. Se você quiser o contrário, defina FluentBitReadFromHead='On'
e ele coletará todos os logs no sistema de arquivos.
5. [Opcional] Crie uma imagem de container do Windows contendo IIS e LogMonitor
Se você já tem uma imagem de container do Windows para sua aplicação, sinta-se à vontade para pular esta seção.
5.1 Para testar a funcionalidade explicada nesta postagem, criamos uma imagem de container Windows contendo IIS e LogMonitor. Por padrão, os Windows Containers enviam logs para o Event Tracing for Windows (ETW), Event Log e arquivos de logs personalizados. No entanto, processadores de log, como Fluent Bit e fluentd, buscam logs de containers de um pipeline STDOUT que não existe em Windows Containers. O LogMonitor é um plug-in de código aberto criado pela Microsoft para criar um pipeline STDOUT dentro do Windows Container, para que essas ferramentas possam buscar logs com sucesso da mesma forma que fazem em um ambiente Linux.
Para obter mais instruções sobre como usar o LogMonitor, acesse o repositório oficial do GitHub ou a postagem no blog da Microsoft sobre o mesmo.
No exemplo abaixo, temos um Dockerfile que cria uma imagem de Windows Container contendo IIS e LogMonitor.
Esse exemplo de configuração do LogMonitorConfig recupera todos os arquivos de log com a extensão .log salvos em C:\inetpub\logs e subdiretórios, incluindo os logs de acesso do IIS.
Quando a compilação for concluída, envie a imagem para seu Amazon ECR registry.
6. Implemente o Fluent Bit nos Windows Worker Nodes como um DaemonSet
Um DaemonSet
garante que todos (ou alguns) nós executem uma cópia de um pod. À medida que os nós são adicionados ao cluster, os pods também são adicionados a eles. Para garantir que todos os Windows worker nodes tenham uma cópia do pod Windows Fluent Bit, implantamos um DaemonSet
usando o arquivo de implementação especificado nas etapas a seguir.
6.1 Copie o seguinte manifesto em um arquivo chamadofluent-bit-daemon-set.yaml
.
Com base na configuração acima, o Fluent Bit deveria:
- Usar o plugin tail output para encontrar novas entradas de logs que são anexadas aos arquivos de log específicos do container, mantidos pelo tempo de execução do container.
- Usar o filtro Kubernetes Fluent Bit para acrescentar metadados adicionais a cada entrada de log. Isso é feito consultando o servidor Kube-API.
- Usar o Amazon CloudWatch Logs Group que que tem ao final do nome
default
para enviar logs de aplicações de pods em execução nonamespace default do Kubernetes
. - Usar o Amazon CloudWatch Logs Group que tem ao final do nome amazon-cloudwatch para enviar logs gerados por pods do Fluent Bit executados no namespace Kubernetes
amazon-cloudwatch
.
A tag com cada entrada de registro tem o formato application.C.var.log.container.<POD_NAME>_<NAMESPACE_NAME>_<CONTAINER_NAME>-<DOCKER_ID>
. No exemplo de configuração do Fluent Bit acima, roteamos os logs com base em namespaces usando o regex nas configurações do Match para plug-ins de saída. Para obter mais detalhes sobre como o Fluent Bit pode ser configurado para usar Tag e Match, visite a documentação aqui.
Você também pode visitar nossa documentação aqui para obter instruções sobre como personalizar seu logs group ou stream do Amazon CloudWatch com metadados do Kubernetes.
Observação: nesta postagem, configuramos o filtro Kubernetes para usar o Kube API Server em vez do endpoint kubelet para consultar os metadados adicionais. Isso ocorre porque o kubelet no Windows é executado no host network namespace, enquanto o Fluent Bit é executado na rede de containers. Podemos usar o endpoint kubelet se os pods do Fluent Bit forem lançados como pods do tipo HostProcess.
6.2 Implemente esse manifesto usando o seguinte comando:
7. Implemente uma imagem de container Windows contendo IIS e LogMonitor
Nesta etapa, implantaremos os pods Windows nos Windows worker nodes.
7.1 Crie um arquivo de implantação chamado windows_manifest.yaml
com o seguinte conteúdo:
7.2 Implante o manifesto usando o seguinte comando:
8. [Opcional] Acesse os pods de IIS para gerar logs
Essa é uma etapa opcional. Você pode esperar que o tráfego real chegue ao pod Windows que hospeda o servidor web IIS. Como alternativa, você pode entrar em seu container e forçar os logs.
8.1 Execute o seguinte comando para fazer login em seu container:
8.2 De dentro do container, execute o seguinte comando para acessar o servidor web:
9. Verificando logs no Amazon CloudWatch
Nesta etapa, fazemos login no console do Amazon CloudWatch e observamos os logs que foram gerados. O console do Amazon CloudWatch pode ser acessado por meio do link aqui. Acesse o console Log Group a partir do painel lateral por meio de Logs/Log Groups.
Você pode esperar logs groups com o nome:
/aws/containerinsights/<CLUSTER_NAME>/default
/aws/containerinsights/<CLUSTER_NAME>/amazon-cloudwatch
Cada logs group deveria conter logs dos pods implantados nos respectivos namespaces do Kubernetes.
Limpando
Ao terminar o tutorial desta postagem, limpe os recursos associados a ele para evitar cobranças por recursos que você não está usando:
- Exclua a implantação Windows
- Exclua o FluentBit
DaemonSet
- Exclua os logs groups criados pelo Fluent Bit
Conclusão
Neste post, mostramos como implementar o Fluent Bit como um DaemonSet nos Windows worker nodes no Amazon EKS.
Usar o FluentBit como um roteador de logs é uma forma benéfica de centralizar os logs no Amazon EKS para cargas de trabalho Linux e Windows. O Fluent Bit pode enviar os logs para várias soluções de destino, permitindo flexibilidade para os clientes.
Este artigo foi traduzido do Blog da AWS em Inglês.
Sobre os autores
Harsh Rawat é um Software Engineer na Amazon Web Services.
Marcio Morales é Principal Solutions Architect da Amazon Web Services. Marcio é um SME global para Windows Containers e ajuda os clientes da AWS a projetar, criar, proteger e otimizar cargas de trabalho de Windows Containers na AWS.
Revisor
Bruno Lopes é Senior Solutions Architect no time da AWS LATAM. Trabalha com soluções de TI há mais de 14 anos, tendo em seu portfólio inúmeras experiências em workloads Microsoft, ambientes híbridos e capacitação técnica de clientes como Technical Trainer e Evangelista. Agora atua como um Arquiteto de Soluções, unindo todas as capacidades para desburocratizar a adoção das melhores tecnologias afim de ajudar os clientes em seus desafios diários.
Luciano Bernardes trabalha atualmente como Sr Solutions Architect na AWS, especializado em workloads Microsoft. Com 15 anos de experiência no mercado, trabalhou a maior parte em consultoria técnica especializada em Microsoft, em clientes de várias verticais, com demandas voltadas para infraestrutura on-premises e em nuvem. Como SA, trabalha próximo a clientes e parceiros de consultoria em LATAM, para apoiá-los em tomadas de decisão e revisão de arquitetura de workoads Microsoft na nuvem AWS.