Registrazione Fargate - Amazon EKS

Registrazione Fargate

Amazon EKS su Fargate offre un router di registro integrato basato su Fluent Bit. Ciò significa che non esegui esplicitamente un container Fluent Bit come sidecar, ma Amazon lo gestisce per te. Tutto quello che devi fare è configurare il router di registro. La configurazione avviene attraverso un ConfigMap dedicato che deve soddisfare i seguenti criteri:

  • Deve essere denominato aws-logging

  • Creato in uno spazio dei nomi dedicato denominato aws-observability

Una volta creato il ConfigMap, Amazon EKS su Fargate lo rileva automaticamente e con esso configura il router di log. Fargate utilizza una versione di AWS per Fluent Bit, una distribuzione upstream conforme di Fluent Bit gestita da AWS. Per ulteriori informazioni, consultare AWS per Fluent Bit su GitHub.

Il router di log consente di utilizzare l'ampiezza dei servizi su AWS per l'analisi dei log e per l'archiviazione. É possibile trasmettere i log da Fargate direttamente ad Amazon CloudWatch, Amazon OpenSearch Service. É possibile anche trasmettere i log in destinazioni come Amazon S3, Amazon Kinesis Data Streams e gli strumenti partner tramite Amazon Kinesis Data Firehose.

Prerequisiti

Configurazione del router di registro

Per configurare il router di registro

Nei passaggi che seguono, sostituire example-value con i propri valori.

  1. Creare uno spazio dei nomi Kubernetes dedicato denominato aws-observability.

    1. Salva nel tuo computer i seguenti contenuti in un file denominato aws-observability-namespace.yaml. Il valore per name deve essere aws-observability e l'etichetta aws-observability: enabled è obbligatoria.

      kind: Namespace apiVersion: v1 metadata: name: aws-observability labels: aws-observability: enabled
    2. Crea lo spazio dei nomi.

      kubectl apply -f aws-observability-namespace.yaml
  2. Crea una ConfigMap con valore dei dati Fluent Conf per spedire i log del container verso una destinazione. Fluent Conf è Fluent Bit, un linguaggio di configurazione del processore di log veloce e leggero che viene utilizzato per instradare i log del container verso una destinazione di log selezionata. Per ulteriori informazioni, consultare File di configurazione nella documentazione di Fluent Bit.

    Importante

    In una Fluent Conf tipica, le sezioni principali incluse sono Service, Input, Filter e Output. Tuttavia, il router di log di Fargate accetta solo:

    • Le sezioni Filter e Output e gestisce le sezioni Service e Input autonomamente.

    • Una sezione Parser.

    Se si fornisce un'altra sezione rispetto a Filter, Output e Parser, le sezioni vengono rifiutate.

    Quando si crea la ConfigMap, prendere in considerazione le seguenti regole utilizzate da Fargate per convalidare i campi:

    • [FILTER], [OUTPUT], e [PARSER] dovrebbero essere specificati sotto ogni chiave corrispondente. Ad esempio: [FILTER] deve essere in filters.conf. È possibile avere uno o più [FILTER] in filters.conf. Anche le sezioni [OUTPUT] e [PARSER] dovrebbero essere specificate sotto le loro chiavi corrispondenti. Specificando più sezioni [OUTPUT], è possibile instradare i registritha a destinazioni diverse contemporaneamente.

    • Fargate convalida le chiavi richieste per ogni sezione. Name e match sono necessari per ogni [FILTER] e [OUTPUT]. Name e format sono necessari per ogni [PARSER]. Le chiavi non fanno distinzione tra maiuscole e minuscole.

    • Variabili di ambiente come ${ENV_VAR} non sono ammesse nella ConfigMap.

    • La rientranza deve essere la stessa sia per la direttiva che per la coppia chiave-valore all'interno di ogni filters.conf, output.conf e parsers.conf. Le coppie di chiave-valore devono essere rientranti piuttosto che direttive.

    • Fargate convalida in base ai seguenti filtri supportati: grep, parser, record_modifier, rewrite_tag, throttle, nest, modify e kubernetes.

    • Fargate convalida rispetto al seguente output supportato: es, firehose, kinesis_firehose, cloudwatch, cloudwatch_logs, kinesis e kubernetes.

    • Almeno un plug-in Output supportato deve essere fornito nella ConfigMap per abilitare la registrazione. Filter e Parser non sono necessari per abilitare la registrazione.

    È possibile anche eseguire Fluent Bit su Amazon EC2 utilizzando la configurazione desiderata per risolvere eventuali problemi derivanti dalla convalida. Crea il ConfigMap utilizzando uno degli esempi seguenti.

    Importante

    La registrazione Amazon EKS Fargate non supporta la configurazione dinamica di ConfigMaps. Eventuali modifiche a ConfigMaps vengono applicate solo ai nuovi pod. Le modifiche non vengono applicate ai pod esistenti.

    Creazione di un ConfigMap utilizzando l'esempio per la destinazione del registro desiderata.

    CloudWatch

    Creazione di una ConfigMap per CloudWatch

    Quando si usa CloudWatch, ci sono due opzioni di output:

    Nell'esempio seguente viene illustrato come utilizzare il plug-in cloudwatch_logs per inviare i log a CloudWatch.

    1. Salva i seguenti contenuti in un file denominato aws-logging-cloudwatch-configmap.yaml. Sostituisci region-code con la Regione AWS. I parametri sotto [OUTPUT] sono necessari.

      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
    2. Applica il file manifesto al cluster.

      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
    3. Esegui il download della policy IAM CloudWatch sul computer. Il documento di policy può essere visualizzato su GitHub.

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

    Creazione di una ConfigMap per Amazon OpenSearch Service

    Per inviare registri a Amazon OpenSearch Service, è possibile utilizzare l'output es, che è un plug-in scritto in C. L'esempio seguente spiega come utilizzare il plug-in per inviare registri a OpenSearch.

    1. Salva i seguenti contenuti in un file denominato aws-logging-opensearch-configmap.yaml. Sostituisci ogni example-value con i valori in tuo possesso.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name es Match * Host search-example-gjxdcilagiprbglqn42jsty66y.region-code.es.amazonaws.com Port 443 Index example Type example_type AWS_Auth On AWS_Region region-code tls On
    2. Applica il file manifesto al cluster.

      kubectl apply -f aws-logging-opensearch-configmap.yaml
    3. Esegui il download della OpenSearch policy IAM per il computer. Il documento di policy può essere visualizzato su GitHub.

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

      Assicurarsi che il controllo di accesso di OpenSearch Dashboard sia configurato correttamente. Il all_access role in OpenSearch Dashboards deve avere il ruolo di esecuzione del pod Fargate e il ruolo IAM mappato. La stessa mappatura deve essere eseguita per il ruolo security_manager. È possibile aggiungere i mapping precedenti selezionando Menu, Security, Roles, quindi selezionare i rispettivi ruoli. Per ulteriori informazioni, consultare Come posso risolvere i problemi relativi ai CloudWatch Logs in modo che vengano trasmessi al mio dominio Amazon ES?.

    Kinesis Data Firehose

    Creazione di una ConfigMap per Kinesis Data Firehose

    Sono disponibili due opzioni di output per l'invio di registri a Kinesis Data Firehose:

    Nell'esempio seguente viene illustrato come utilizzare il plug-in kinesis_firehose per inviare log a Kinesis Data Firehose.

    1. Salvare nel computer i seguenti contenuti in un file denominato aws-logging-firehose-configmap.yaml. Sostituisci region-code con la Regione AWS.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name kinesis_firehose Match * region region-code delivery_stream my-stream-firehose
    2. Applicare il file manifesto al cluster.

      kubectl apply -f aws-logging-firehose-configmap.yaml
    3. Esegui il download della policy IAM Kinesis Data Firehose IAM tuo computer. Il documento di policy può essere visualizzato su GitHub.

      curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
  3. Creare una policy IAM utilizzando il file della policy scaricato nel passaggio precedente.

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
  4. Collegare la policy IAM al ruolo di esecuzione del pod specificato per il profilo Fargate. Sostituire 111122223333 con l'ID del proprio account.

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

Supporto filtri Kubernetes

Questa funzionalità richiede la versione minima di Kubernetes e il livello della piattaforma seguenti o versioni successive. Sono supportate anche tutte le versioni Kubernetes e della piattaforma successive a quelle elencate.

Versione di Kubernetes Livello della piattaforma
1.21 eks.3
1.20 eks.3
1.19 eks.7
1.18 eks.9
1,17 eks.10

Il filtro Fluent Bit Kubernetes consente di aggiungere metadati Kubernetes ai file di log. Per ulteriori informazioni sul filtro, consultare Kubernetes nella documentazione di Fluent Bit. È possibile applicare un filtro utilizzando l'endpoint del server API.

filters.conf: | [FILTER] Name kubernetes Match kube.* Merge_Log On Buffer_Size 0 Kube_Meta_Cache_TTL 300s
Importante
  • Kube_URL, Kube_CA_File, Kube_Token_Command e Kube_Token_File sono parametri di configurazione di proprietà del servizio e non devono essere specificati. Amazon EKS Fargate popola questi valori.

  • Kube_Meta_Cache_TTL è il momento in cui Fluent Bit attende il momento in cui comunica al server API i metadati più recenti. Se Kube_Meta_Cache_TTL non è specificato, Amazon EKS Fargate aggiunge un valore predefinito di 30 minuti per ridurre il carico sul server API, poiché Fluent Bit comunica con il server API per ottenere i metadati più recenti.

Per spedire i log dei processi Fluent-bit al tuo account

È possibile spedire i log dei processi di Fluent Bit ad Amazon CloudWatch utilizzando la seguente ConfigMap. Sostituisci region-code con la Regione AWS.

kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability labels: data: # Configuration files: server, input, filters and output # ====================================================== flb_log_cw: "true" #ships fluent-bit process logs to CloudWatch output.conf: | [OUTPUT] Name cloudwatch Match kube.* region region-code log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group true

I registri si trovano nella Regione AWS in cui si trova il cluster in CloudWatch. Il nome del gruppo di log è my-cluster-fluent-bit-logs e il nome del flusso di log Fluent Bit è fluent-bit-podname-pod-namespace.

Nota
  • I log dei processi vengono spediti solo quando il processo Fluent Bit viene avviato correttamente. Se si verifica un errore durante l'avvio di Fluent Bit, i log di processo vengono mancati. È possibile spedire i log di processo solo a CloudWatch.

  • Per eseguire il debug della spedizione dei log di processo sull’account, è possibile applicare la ConfigMap precedente per ottenere i log di processo. Il mancato avvio di Fluent Bit solitamente è dovuto al fatto che la ConfigMap non viene analizzata o accettata da Fluent Bit durante l'avvio.

Applicazione di prova

  1. Implementa un pod di esempio.

    1. Salva nel tuo computer i seguenti contenuti in un file denominato sample-app.yaml.

      apiVersion: apps/v1 kind: Deployment metadata: name: sample-app namespace: same-namespace-as-your-fargate-profile spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - name: http containerPort: 80
    2. Applica il file manifesto al cluster.

      kubectl apply -f sample-app.yaml
  2. Visualizza i log NGINX utilizzando la/le destinazione/i configurata/e nel ConfigMap.

Considerazioni sulle dimensioni

Si consiglia di pianificare fino a 50 MB di memoria per il router del registro. Se si prevede che l'applicazione generi registri a velocità effettiva molto elevata, è necessario pianificarla fino a 100 MB.

Risoluzione dei problemi

Per confermare se la caratteristica di registrazione è abilitata o disabilitata per qualche motivo, ad esempio per una ConfigMap non valida, e perché questa non è valida, controllare gli eventi pod con kubectl describe pod pod_name. L'output potrebbe includere eventi pod che chiariscono se la registrazione è abilitata o meno, ad esempio l'output di esempio seguente.

... Annotations: CapacityProvisioned: 0.25vCPU 0.5GB Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND kubernetes.io/psp: eks.privileged ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning LoggingDisabled <unknown> fargate-scheduler Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found

Gli eventi pod sono effimeri, con un periodo di tempo che dipende dalle impostazioni. È inoltre possibile visualizzare le annotazioni di un pod utilizzando kubectl describe pod pod-name. Nell'annotazione del pod, è possibile sapere se, e per quale motivo, la caratteristica di registrazione è abilitata o disabilitata.