Exibindo Logs do Aplicativo em Nós Virtuais

Descubra como exibir os logs de aplicativos em execução em nós virtuais em um cluster do Kubernetes que você criou usando o Kubernetes Engine (OKE).

Depois de criar um cluster com nós virtuais usando o Kubernetes Engine, você tem duas opções para acessar os logs de aplicativos em execução nos nós virtuais:

  • Exiba os logs stdout e stderr dos contêineres de aplicativos usando o comando kubectl logs.
  • Envie logs do aplicativo para um servidor de logs persistente para exibição.

Exibindo logs stdout e stderr usando o comando logs do kubectl

Para exibir os logs stdout e stderr dos contêineres de um aplicativo usando o comando kubectl logs:
  1. Se você ainda não tiver feito isso, siga as etapas para configurar o arquivo de configuração kubeconfig do cluster e (se necessário) defina a variável de ambiente KUBECONFIG para apontar para o arquivo. Observe que você deve configurar seu próprio arquivo kubeconfig. Não é possível acessar um cluster usando um arquivo kubeconfig que outro usuário tenha configurado. Consulte Configurando o Acesso ao Cluster.
  2. Em uma janela de terminal, execute o comando kubectl logs digitando:
    kubectl logs <pod-name>

    Por exemplo:

    kubectl logs nginx

    Quando o pod contiver mais de um contêiner, especifique o contêiner para o qual você deseja exibir os logs. Por exemplo, se o pod myapp tiver dois contêineres chamados nginx e logging e você quiser exibir os logs do contêiner logging, informe:

    kubectl logs myapp logging

Enviando logs para um servidor de logs persistente

Você pode enviar os logs de aplicativos em execução em nós virtuais para um servidor de logs remoto, como OpenSearch, e exibir os logs nesse servidor. Como os nós virtuais não suportam o conjunto de daemons do Kubernetes, você não pode executar um agente de log no nível do nó. Em vez disso, você pode executar um agente de log leve como um sidecar para cada um dos pods do aplicativo. Você pode usar qualquer agente de log que possa ser executado como um sidecar em um pod do Kubernetes, como Fluent Bit.

Por exemplo, para executar o Fluent Bit como um sidecar em um pod para enviar logs do aplicativo para um servidor de log OpenSearch remoto:

  1. Crie um Kubernetes ConfigMap por cluster ou por namespace, especificando as definições de configuração do Fluent Bit a serem usadas. Em particular, observe que você deve especificar o endereço IP, o número da porta e os parâmetros de autenticação do servidor de log remoto.

    Por exemplo:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: fluentbit-config
    data:
      fluent-bit.conf: |
        [SERVICE]
            flush        1
            daemon       Off
     
        [INPUT]
            Name              tail
            Path              /mnt/log/*
     
        [OUTPUT]
            name  opensearch
            match *
            host <ip-address>
            port <port-number>
            tls On
            HTTP_User <username>
            HTTP_Passwd <example-password>
            Index fluent-bit
            Suppress_Type_Name On

    em que:

    • host <ip-address> especifica o endereço IP do servidor Opensearch.
    • port <port-number> especifica a porta do servidor Opensearch (9200 por padrão).
    • HTTP_User <username> especifica o nome de usuário do servidor Opensearch.
    • HTTP_Passwd <example-password> especifica a senha do servidor Opensearch.
  2. Adicione um sidecar Fluent Bit a cada pod. Observe que você deve configurar todos os pods com um sidecar de Bit Fluente para garantir que os logs do aplicativo sejam enviados para o destino de log persistente.
    1. Na seção volumes de cada especificação de pod, especifique:

      • Um emptyDir em que os logs do aplicativo são gravados, da seguinte forma:
        - name: logs
          emptyDir: {}
      • Uma referência ao ConfigMap criado anteriormente, da seguinte forma:
        - name: fluentbit-config
          configMap:
            name: fluentbit-config
    2. Na seção containers de cada especificação de pod, especifique que o contêiner de log:

      • Usa a imagem fluent/fluent-bit.
      • Monta logs emptyDir e fluentbit-config ConfigMap.

      Por exemplo:

      - name: logging
        image: fluent/fluent-bit
        resources:
          requests:
            cpu: 100m
            memory: 50Mi
        volumeMounts:
        - name: logs
          mountPath: /mnt/log
        - name: fluentbit-config
          mountPath: /fluent-bit/etc 

    Veja um exemplo de uma especificação de pod completa:

    apiVersion: v1
    kind: Pod
    metadata:
      name: date-logging
    spec:
      containers:
      - name: date
        image: busybox
        resources:
          requests:
            cpu: 500m
            memory: 200Mi
        command: ["sh", "-c"]
        args:
          - while [ 1 ]; do
            echo "Writing the date in /mnt/log/date.log";
            date >> /mnt/log/date.log;
            sleep 10;
            done
        volumeMounts:
        - name: logs
          mountPath: /mnt/log
      - name: logging
        image:
         resources:
          requests:
            cpu: 100m
            memory: 50Mi
        volumeMounts:
        - name: logs
          mountPath: /mnt/log
        - name: fluentbit-config
          mountPath: /fluent-bit/etc
      volumes:
      - name: logs
        emptyDir: {}
      - name: fluentbit-config
        configMap:
          name: fluentbit-config