Como faço uma transmissão de logs de contêiner para o CloudWatch no Amazon EKS?

6 minuto de leitura
0

Quero transmitir logs de contêineres executados no Amazon Elastic Kubernetes Service (Amazon EKS) para um sistema de registro em log como o CloudWatch Logs. Como faço isso?

Breve descrição

Você pode usar os recursos os externos Fluent Bit ou Fluentd para enviar logs de seus contêineres para seus registros do CloudWatch. O Fluent Bit é a solução padrão de logs para o Container Insights, portanto, o uso do Fluent Bit em vez do Fluentd é uma prática recomendada. A Amazon fornece uma imagem de contêiner do Fluent Bit no Amazon Elastic Container Registry (Amazon ECR). Para obter mais informações, consulte cloudwatch-agent no Amazon ECR.

Quando você configura o Fluent Bit como um DaemonSet para enviar logs para o CloudWatch, o Fluent Bit cria os seguintes grupos de logs, se eles ainda não existirem:

| Nome do grupo de logs | Fonte do log | | /aws/containerinsights/nome_do_cluster/application | Todos os arquivos de log em /var/log/containers | | /aws/containerinsights/nome_do_cluster/host | Logs de /var/log/dmesg, /var/log/secure e /var/log/messages | | /aws/containerinsights/nome_do_cluster/dataplane | Os logs em /var/log/journal para kubelet.service, kubeproxy.service e docker.service |

Resolução

Pré-requisitos

Antes de realizar estas etapas, analise os pré-requisitos:

  • Seu cluster do EKS está sendo executado com nós no estado Ready (Pronto), e o comando kubectl está instalado e em execução.
  • O CloudWatchAgentServerPolicy gerenciado pelo AWS Identity and Access Management (IAM) está em vigor para permitir que seus nós de processamento do Amazon EKS enviem métricas e logs para o CloudWatch. Você pode fazer isso anexando uma política à função do IAM dos seus nós de processamento. Como alternativa, use uma função do IAM para contas de serviço do cluster e anexe a política a essa função. Para mais informações, consulte Funções do IAM para contas de serviço.
  • Você está executando um cluster compatível com Kubernetes versão 1.18 ou superior. Esse é um requisito do Container Insights para o EKS Fargate. Você também definiu um perfil do Fargate para programar pods no Fargate.
  • A função de execução de pod do EKS está em vigor para permitir que componentes executados na infraestrutura do Fargate façam chamadas para APIs da AWS em seu nome. Por exemplo, para a extração de imagens de contêiner do Amazon ECR.

Fazer uma transmissão de logs de contêineres executados em seu cluster do EC2 do EKS

Para transmitir logs de contêineres para o CloudWatch Logs, instale o AWS para Fluent Bit executando estas etapas:

1.    Crie um namespace chamado amazon-cloudwatch, se você ainda não tiver um:

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 este comando para criar um ConfigMap chamado fluent-bit-cluster-info, incluindo o nome do cluster e a região para a qual deseja enviar os logs. Substitua my-cluster-name e my-cluster-region pelo nome e região do cluster.

ClusterName=<my-cluster-name>
RegionName=<my-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

3.    Implante o DaemonSet de configuração otimizada para Fluent Bit no cluster:

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

4.    Opcional: aplique um patch para que o DaemonSet aws-for-fluent-bit use a imagem do AWS for Fluent Bit no Amazon Elastic Container Registry:

kubectl patch ds fluent-bit -n amazon-cloudwatch -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"fluent-bit","image":"public.ecr.aws/aws-observability/aws-for-fluent-bit:latest"}]}}}}'

5.    Para funções do IAM para contas de serviço, crie um provedor OIDC e uma função e uma política do IAM. Em seguida, associe a função do IAM às contas de serviço cloudwatch-agent e fluent-bit. Substitua ACCOUNT_ID e IAM_ROLE_NAME pelo ID da conta da AWS e pela função do IAM usada para contas de serviço.

kubectl annotate serviceaccounts fluent-bit -n amazon-cloudwatch "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

Para mais informações sobre a personalização, consulte Configurar o Fluent Bit como um DaemonSet para enviar logs ao CloudWatch Logs.

Solucionar problemas de implantação do Fluent Bit

1.    Execute este comando e verifique os eventos na parte inferior da saída:

kubectl describe pod pod-name -n amazon-cloudwatch

2.    Execute este comando para verificar os logs:

kubectl logs pod-name -n amazon-cloudwatch

Excluir a implantação do Fluent Bit

Para excluir a implantação do Fluent Bit, execute estes comandos:

kubectl delete configmap fluent-bit-cluster-info -n amazon-cloudwatch 

kubectl delete -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

Fazer uma transmissão de logs de contêineres executados em seu cluster do EKS Fargate

O Amazon EKS no Fargate tem um roteador integrado de logs baseado no Fluent Bit. Isso significa que você não executa explicitamente um contêiner do Fluent Bit como um sidecar. Em vez disso, a Amazon o executa para você. Para mais detalhes, consulte Registro do Fargate em log.

Siga estas etapas para transmitir logs de contêineres para logs do CloudWatch:

1.    Crie um namespace Kubernetes dedicado chamado aws-observability:

cat <<EOF > aws-observability-namespace.yaml
kind: Namespace
apiVersion: v1
metadata:
  name: aws-observability
  labels:
    aws-observability: enabled
EOF

kubectl apply -f aws-observability-namespace.yaml

2.    Crie um ConfigMap com um valor de dados Fluent Conf para enviar logs de contêiner para logs do CloudWatch:

cat <<EOF > aws-logging-cloudwatch-configmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
  name: aws-logging
  namespace: aws-observability
data:
  output.conf: |
    [OUTPUT]
        Name cloudwatch_logs
        Match   *
        region region-code
        log_group_name fluent-bit-cloudwatch
        log_stream_prefix from-fluent-bit-
        auto_create_group true
        log_key log

  parsers.conf: |
    [PARSER]
        Name crio
        Format Regex
        Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L%z
  
  filters.conf: |
     [FILTER]
        Name parser
        Match *
        Key_name log
        Parser crio
EOF

kubectl apply -f aws-logging-cloudwatch-configmap.yaml

3.    Crie uma política do IAM usando a política do IAM do CloudWatch e, em seguida, anexe-a à função de execução do pod especificada para o seu perfil do Fargate.

  • Baixe a política do IAM do CloudWatch para seu computador. Você também pode visualizar a política no GitHub.
curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
  • Crie uma política do IAM com base no arquivo de política que baixou.
aws iam create-policy —policy-name eks-fargate-logging-policy —policy-document file://permissions.json
  • Anexe a política do IAM à função de execução do pod especificada para o seu perfil do Fargate. Substitua 111122223333 pelo ID da sua conta.
aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
--role-name your-pod-execution-role

Para mais informações sobre como solucionar problemas do AWS Fluent Bit em execução no EKS Fargate, consulte a página solução de problemas.

Desabilitar logs de transmissão para pods do EKS Fargate

Para desabilitar os logs de transmissão para seus pods do EKS Fargate, execute este comando:

kubectl delete namespace aws-observability

Exclua os pods e reimplante-os após excluir o namespace aws-observability.


Informações relacionadas

Usar o Container Insights

AWS OFICIAL
AWS OFICIALAtualizada há um ano