Come faccio a eseguire lo streaming dei log dei container su CloudWatch in Amazon EKS?

Ultimo aggiornamento: 13/05/2022

Voglio eseguire lo streaming dei log dei container in esecuzione in Amazon Elastic Kubernetes Service (Amazon EKS) su un sistema di registrazione come CloudWatch Logs. Come posso farlo?

Breve descrizione

Puoi utilizzare Fluent Bit o Fluentd per inviare i log dai container ai log di CloudWatch. Fluent Bit è la soluzione di log di default per Container Insights, quindi è consigliabile utilizzare Fluent Bit invece di Fluentd. Amazon fornisce un'immagine del contenitore Fluent Bit su Amazon Elastic Container Registry (Amazon ECR). Per ulteriori informazioni, consulta cloudwatch-agent su Amazon ECR.

Quando si configura FluentBit come DaemonSet per inviare i log a CloudWatch, FluentBit crea questi gruppi di log, se non esistono già:

Nome del gruppo di log Origine del log
/aws/containerinsights/ Cluster_Name/application Tutti i file di log in /var/log/containers
/aws/containerinsights/ Cluster_Name/host Log da /var/log/dmesg, /var/log/secure e /var/log/messages
/aws/containerinsights/ Cluster_Name/dataplane I log in /var/log/journal per kubelet.service, kubeproxy.service e docker.service

Risoluzione

Prerequisiti

Prima di completare questi passaggi, rivedi i prerequisiti:

  • Il cluster EKS è in esecuzione con nodi nello stato Pronto e il comando kubectl è installato e in esecuzione.
  • La policy CloudWatchAgentServerPolicy gestita da AWS Identity and Access Management (IAM) è in atto per consentire ai nodi worker di Amazon EKS di inviare parametri e log a CloudWatch. Puoi farlo collegando una policy al ruolo IAM dei tuoi nodi worker. Oppure, usa un ruolo IAM per gli account di servizio per il cluster e allega la policy a questo ruolo. Per ulteriori informazioni, consulta Ruoli IAM per gli account di servizio.
  • Stai eseguendo un cluster che supporta Kubernetes versione 1.18 o successiva. Questo è un requisito di Container Insights per EKS Fargate. Hai anche definito un profilo Fargate per programmare i pod su Fargate.
  • Il ruolo di esecuzione del pod EKS è in atto per consentire ai componenti in esecuzione sull'infrastruttura Fargate di effettuare chiamate alle API AWS per tuo conto. Ad esempio, l'estrazione di immagini di container da Amazon ECR.

Streaming dei log dei container in esecuzione nel cluster EC2 EKS

Per eseguire lo streaming dei log dei container su CloudWatch Logs, installa AWS per Fluent Bit completando i seguenti passaggi:

1.    Crea uno spazio dei nomi chiamato amazon-cloudwatch, se non ne hai già uno:

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.    Esegui questo comando per creare un ConfigMap chiamato fluent-bit-cluster-info, incluso il nome del cluster e la regione a cui desideri inviare i log. Sostituisci my-cluster-name e my-cluster-region con il nome e la regione del tuo 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.    Implementa la configurazione ottimizzata DaemonSet di Fluent Bit nel 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.    Facoltativo: applica una patch al DaemonSet di aws-for-fluent-bit per utilizzare l'immagine di AWS for Fluent Bit su 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.    Per i ruoli IAM per gli account di servizio, crea un provider OIDC e un ruolo e una policy IAM. Quindi, associa il ruolo IAM agli account di servizio cloudwatch-agent e fluent-bit. Sostituisci ACCOUNT_ID e IAM_ROLE_NAME con l'ID account AWS e il ruolo IAM utilizzato per gli account di servizio.

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

Per una maggiore personalizzazione, consulta Configurazione di Fluent Bit come DaemonSet per inviare i log a CloudWatch Logs.

Risoluzione dei problemi relativi all'implementazione di Fluent Bit

1.    Esegui questo comando, quindi controlla gli eventi nella parte inferiore dell'output:

kubectl describe pod pod-name -n amazon-cloudwatch

2.    Esegui questo comando per controllare i log:

kubectl logs pod-name -n amazon-cloudwatch

Eliminazione dell'implementazione di Fluent Bit

Per eliminare l'implementazione di Fluent Bit, esegui questi comandi:

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

Streaming dei log dei container in esecuzione nel cluster EKS Fargate

Amazon EKS su Fargate ha un router di log integrato basato su Fluent Bit. Ciò significa che non si esegue esplicitamente un container Fluent Bit come sidecar. Invece, Amazon lo gestisce per tuo conto. Per maggiori dettagli, consulta Registrazione di Fargate.

Completa questi passaggi per trasmettere in streaming i log dei container ai log di CloudWatch:

1.    Crea uno spazio dei nomi Kubernetes dedicato chiamato 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.    Crea una ConfigMap con un valore dati Fluent Conf per spedire i log dei container ai log di 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.    Crea una policy IAM utilizzando la policy IAM di CloudWatch, quindi collegala al ruolo di esecuzione del pod specificato per il profilo Fargate.

curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
  • Crea una policy IAM dal file di policy che hai scaricato.
aws iam create-policy —policy-name eks-fargate-logging-policy —policy-document file://permissions.json
  • Allega la policy IAM al ruolo di esecuzione del pod specificato per il tuo profilo Fargate. Sostituisci 111122223333 con l'ID del tuo account.
aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
--role-name your-pod-execution-role

Per ulteriori informazioni sulla risoluzione dei problemi di AWS Fluent Bit in esecuzione su EKS Fargate, consulta la pagina Risoluzione dei problemi.

Disabilitazione dello streaming dei log per i pod EKS Fargate

Per disabilitare lo streaming dei log per i tuoi pod EKS Fargate, esegui questo comando:

kubectl delete namespace aws-observability

Elimina i pod e implementali di nuovo dopo aver eliminato lo spazio dei nomi aws-observability.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?