Ir para o conteúdo

Como faço para transmitir logs de contêineres para o CloudWatch no Amazon EKS?

5 minuto de leitura
0

Quero usar o Fluent Bit ou o Fluentd para transmitir logs de contêineres executados no Amazon Elastic Kubernetes Service (Amazon EKS) para o Amazon CloudWatch Logs.

Breve descrição

Como o Fluent Bit é a solução de log padrão do CloudWatch Container Insights, é uma prática recomendada usar o Fluent Bit em vez do Fluentd.A Amazon fornece uma imagem de contêiner do Fluent Bit no Amazon Elastic Container Registry (Amazon ECR). Para mais informações, consulte Repositórios de imagem da AWS para Fluent Bit para Amazon ECS.

Para baixar o Fluent Bit, consulte Introdução ao Fluent Bit no site do Fluent Bit. Para Fluentd, consulte Baixar Fluentd no site do Fluentd.

Quando você configura o Fluent Bit como um DaemonSet para enviar logs ao CloudWatch, o Fluent Bit cria os seguintes grupos e fontes de log:

  • /aws/containerinsights/Cluster_Name/application: A fonte do log são todos os arquivos de log em /var/log/containers.
  • /aws/containerinsights/Cluster_Name/host: A origem do log são os logs de /var/log/dmesg, /var/log/secure e /var/log/messages.
  • /aws/containerinsights/Cluster_Name/dataplane: A fonte do log são os logs em /var/log/journal para kubelet.service, kubeproxy.service e docker.service.

Resolução

Observação: Se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Transmitir logs de contêineres que são executados no Amazon EKS em um cluster do Amazon EC2

Conclua as etapas a seguir:

  1. Para criar um namespace chamado amazon-cloudwatch, execute o seguinte 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. Para criar um ConfigMap chamado fluent-bit-cluster-info que inclui o nome do cluster e a região da AWS para a qual você deseja enviar logs, execute o seguinte comando:

    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

    Observação: substitua my-cluster-name e my-cluster-region pelo nome do cluster e região.

  3. Para usar o Fluent Bit para enviar logs para um cluster do Amazon Elastic Compute Cloud (Amazon EC2), execute o seguinte comando DaemonSet:

    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) Para usar o Fluent Bit no Amazon ECR, execute o seguinte comando aws-for-fluent-bit DaemonSet:

    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 criar perfis do AWS Identity and Access Management para contas de serviço (IRSA), execute o seguinte comando eksctl:

    eksctl create iamserviceaccount \
        --name fluent-bit \
        --namespace amazon-cloudwatch \
        --cluster $CLUSTER \
        --attach-policy-arn "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy" \
        --approve \
        --override-existing-serviceaccounts

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

Solucionar problemas de implantação do FluentBit

Conclua as etapas a seguir:

  1. Para listar os nomes dos pods no namespace amazon-cloudwatch, execute o seguinte comando:

    kubectl get pods -n amazon-cloudwatch

    Observação: o nome do pod retorna como fluent-bit-*****.

  2. Para verificar a saída dos eventos, execute o seguinte comando:

    kubectl describe pod POD_NAME -n amazon-cloudwatch

    Observação: substitua POD_NAME pelo nome do seu pod.

  3. Para verificar os logs, execute o seguinte comando:

    kubectl logs pod-name -n amazon-cloudwatch

    Observação: substitua POD_NAME pelo nome do seu pod.

Excluir a implantação do Fluent Bit

Para excluir a implantação do Fluent Bit, execute os seguintes 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

Transmitir logs de contêineres executados no Amazon EKS em um cluster Fargate

O Amazon EKS em um cluster do AWS Fargate tem um roteador de log integrado baseado no Fluent Bit. A AWS executa automaticamente o Fluent Bit para você. Para mais informações, consulte Iniciar o registro em log do AWS Fargate para seu cluster.

Para transmitir logs de contêineres para o CloudWatch Logs, conclua as etapas a seguir:

  1. Para criar um namespace do Kubernetes dedicado chamado aws-observability, execute o seguinte comando:

    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. Para criar um ConfigMap com um valor de dados do FluentConf para transmitir os logs de contêiner para o CloudWatch Logs, execute o seguinte comando:

    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 gerenciada pela AWS para o CloudWatch. Em seguida, anexe a política do IAM ao perfil de execução do pod que você especificou em seu perfil do Fargate.

    Para baixar o arquivo de política do IAM, execute o seguinte comando:

    curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json

    Para criar uma política do IAM a partir do arquivo de política, execute o seguinte comando create-policy:

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json

    Para anexar a política do IAM ao perfil de execução do pod que você especificou no seu perfil do Fargate, execute o seguinte comando attach-role-policy:

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
    --role-name your-pod-execution-role

    Observação: substitua 111122223333 pelo ID da sua conta.

    Para mais informações, consulte Resolver problemas.

Desativar os logs de streaming do EKS nos pods Fargate

Para desativar os logs de streaming de seus pods EKS no Fargate, execute o seguinte comando:

kubectl delete namespace aws-observability

Exclua os pods e reimplante-os depois de excluir o namespace aws-observability.