Fluent Bit를 DaemonSet로 설정하여 CloudWatch Logs에 로그 전송 - Amazon CloudWatch

Fluent Bit를 DaemonSet로 설정하여 CloudWatch Logs에 로그 전송

다음 단원을 통해 Fluent Bit를 배포하여 컨테이너에서 CloudWatch Logs로 로그를 전송할 수 있습니다.

이미 Fluentd를 사용 중인 경우 차이점

이미 Fluentd를 사용하여 컨테이너에서 CloudWatch Logs로 로그를 전송하고 있다면 이 단원을 읽고 Fluentd와 Fluent Bit의 차이점을 확인하세요. Container Insights와 함께 Fluentd를 아직 사용하고 있지 않다면 Fluent Bit 설정으로 건너뛸 수 있습니다.

다음과 같이 Fluent Bit에 대한 기본 구성을 두 가지 제공합니다.

  • Fluent Bit 최적화 구성 - Fluent Bit 모범 사례에 맞춰 조정된 구성입니다.

  • Fluentd 호환 구성 - 가능한 한 Fluentd 동작에 맞춰 조정한 구성입니다.

다음 목록에서는 Fluentd와 각 Fluent Bit 구성 간의 차이점을 자세히 설명합니다.

  • 로그 스트림 이름의 차이점 - Fluent Bit 최적화 구성을 사용하는 경우 로그 스트림 이름이 달라집니다.

    /aws/containerinsights/Cluster_Name/application에서

    • Fluent Bit 최적화 구성은 로그를 kubernetes-nodeName-application.var.log.containers.kubernetes-podName_kubernetes-namespace_kubernetes-container-name-kubernetes-containerID에 전송합니다.

    • Fluentd는 로그를 kubernetes-podName_kubernetes-namespace_kubernetes-containerName_kubernetes-containerID에 전송합니다.

    /aws/containerinsights/Cluster_Name/host에서

    • Fluent Bit 최적화 구성은 로그를 kubernetes-nodeName.host-log-file에 전송합니다.

    • Fluentd는 로그를 host-log-file-Kubernetes-NodePrivateIp에 전송합니다.

    /aws/containerinsights/Cluster_Name/dataplane에서

    • Fluent Bit 최적화 구성은 로그를 kubernetes-nodeName.dataplaneServiceLog에 전송합니다.

    • Fluentd는 로그를 dataplaneServiceLog-Kubernetes-nodeName에 전송합니다.

  • Container Insights가 작성하는 kube-proxyaws-node 로그 파일은 서로 다른 위치에 있습니다. Fluentd 구성에서는 /aws/containerinsights/Cluster_Name/application에 있습니다. Fluent Bit 최적화 구성에서는 /aws/containerinsights/Cluster_Name/dataplane에 있습니다.

  • pod_namenamespace_name과 같은 대부분의 메타데이터는 Fluent Bit와 Fluentd에서 동일하지만, 다음은 다릅니다.

    • Fluent Bit 최적화 구성은 docker_id를 사용하며 Fluentd는 Docker.container_id를 사용합니다.

    • 두 Fluent Bit 구성은 모두 다음 메타데이터를 사용하지 않습니다. 즉, 다음 메타데이터는 Fluentd에만 있습니다. container_image_id, master_url, namespace_id, namespace_labels

Fluent Bit 설정

Fluent Bit를 설정하여 컨테이너에서 로그를 수집하려면 Amazon EKS 및 Kubernetes에서 Container Insights의 빠른 시작 설정의 절차를 따르거나 이 단원의 절차를 따르면 됩니다.

어느 방법이든 클러스터 노드에 첨부된 IAM 역할에 충분한 권한이 있어야 합니다. Amazon EKS 클러스터를 실행하는 데 필요한 권한에 대한 자세한 내용은 Amazon EKS 사용 설명서의 Amazon EKS IAM 정책, 역할 및 권한 단원을 참조하세요.

다음 단계에서는 Fluent Bit를 daemonSet로 설정하여 CloudWatch Logs에 로그를 전송합니다. 이 단계를 완료하면 Fluent Bit가 다음 로그 그룹을 생성합니다(아직 없는 경우).

중요

Container Insights에 이미 FluentD가 구성되어 있고 FluentD DaemonSet가 예상대로 실행되지 않는 경우(containerd 런타임을 사용하는 경우 발생할 수 있음), Fluent Bit를 설치하기 전에 Fluent Bit를 제거해야 Fluent Bit가 FluentD 오류 로그 메시지를 처리하지 않습니다. 그러지 않으면 Fluent Bit를 성공적으로 설치한 후 즉시 FluentD를 제거해야 합니다. Fluent Bit를 설치한 후 Fluentd를 제거하면 이 마이그레이션 과정에서 로깅을 계속 유지할 수 있습니다. CloudWatch Logs로 로그를 전송하는 데 Fluent Bit 또는 FluentD 중 하나만 필요합니다.

로그 그룹 이름 로그 소스

/aws/containerinsights/Cluster_Name/application

/var/log/containers의 모든 로그 파일

/aws/containerinsights/Cluster_Name/host

/var/log/dmesg, /var/log/secure/var/log/messages에서의 로그

/aws/containerinsights/Cluster_Name/dataplane

kubelet.service, kubeproxy.servicedocker.service에 대한 /var/log/journal에서의 로그.

Fluent Bit를 설치하여 컨테이너에서 CloudWatch Logs로 로그를 전송하려면
  1. amazon-cloudwatch라는 네임스페이스가 아직 없는 경우 다음 명령을 입력하여 네임스페이스를 생성합니다.

    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. 다음 명령을 실행하여 로그를 전송할 클러스터 이름 및 리전이 포함된 cluster-info라는 ConfigMap을 생성합니다. cluster-namecluster-region을 클러스터의 이름 및 리전으로 바꿉니다.

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

    이 명령에서 플러그 인 지표 모니터링을 위한 FluentBitHttpServer는 기본적으로 활성화되어 있습니다. 명령에서 이를 비활성화하려면 명령의 세 번째 줄을 FluentBitHttpPort=''(빈 문자열)로 변경합니다.

    또한 기본적으로 Fluent Bit는 테일에서 로그 파일을 읽으며 배포된 후 새 로그만 캡처합니다. 반대를 원하는 경우 FluentBitReadFromHead='On'으로 설정하면 파일 시스템의 모든 로그를 수집합니다.

  3. 다음 명령 중 하나를 실행하여 Fluent Bit 데몬 세트를 다운로드한 후 클러스터에 배포합니다.

    • Fluent Bit 최적화 구성을 원하는 경우 이 명령을 실행합니다.

      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
    • Fluentd와 더 유사한 Fluent Bit 구성을 원하는 경우 이 명령을 실행합니다.

      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-compatible.yaml
    중요

    Fluent Bit DaemonSet 구성은 기본적으로 로그 수준을 INFO로 설정하므로 CloudWatch Logs 수집 비용이 높아질 수 있습니다. 로그 수집 볼륨과 비용을 줄이려면 로그 수준을 오류로 변경하면 됩니다.

    로그 볼륨을 줄이는 방법에 대한 자세한 내용은 (선택 사항) Fluent Bit의 로그 볼륨 축소 섹션을 참조하세요.

  4. 다음 명령을 입력하여 배포를 검증합니다. 각 노드에는 fluent-bit-*라는 포드가 하나 있어야 합니다.

    kubectl get pods -n amazon-cloudwatch

위 단계는 클러스터에 다음 리소스를 생성합니다.

  • amazon-cloudwatch 네임스페이스의 Fluent-Bit이라는 서비스 계정. 이 서비스 계정은 Fluent Bit daemonSet를 실행하는 데 사용됩니다. 자세한 내용은 Kubernetes 참조 문서의 서비스 계정 관리를 참조하세요.

  • amazon-cloudwatch 네임스페이스의 Fluent-Bit-role이라는 클러스터 역할. 이 클러스터 역할은 Fluent-Bit 서비스 계정에 대해 Pod 로그에서 get, listwatch 권한을 부여합니다. 자세한 내용은 Kubernetes 참조 문서의 API 개요를 참조하세요.

  • amazon-cloudwatch 네임스페이스의 Fluent-Bit-config이라는 ConfigMap. 이 ConfigMap에는 Fluent Bit에서 사용할 구성이 포함되어 있습니다. 자세한 내용은 Kubernetes 작업 설명서의 ConfigMap을 사용하도록 Pod 구성을 참조하세요.

Fluent Bit 설정을 확인하려면 다음 단계를 따르세요.

Fluent Bit 설정 확인
  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. 탐색 창에서 로그 그룹을 선택합니다.

  3. Fluent Bit를 배포한 리전에 있는지 확인합니다.

  4. 리전의 로그 그룹 목록을 확인합니다. 다음과 같은 모양이어야 합니다.

    • /aws/containerinsights/Cluster_Name/application

    • /aws/containerinsights/Cluster_Name/host

    • /aws/containerinsights/Cluster_Name/dataplane

  5. 이러한 로그 그룹 중 하나로 이동하여 로그 스트림의 마지막 이벤트 시간을 확인합니다. 해당 시간이 Fluent Bit를 배포한 시점을 기준으로 최근인 경우 설정이 확인됩니다.

    /dataplane 로그 그룹을 생성하는 데 약간의 지연이 있을 수 있습니다. 이러한 로그 그룹은 Fluent Bit가 해당 로그 그룹에 대한 로그 전송을 시작할 때만 생성되기 때문에 약간의 지연 현상은 정상입니다.

여러 줄 로그 지원

여러 줄 로그와 함께 Fluent Bit를 사용하는 방법에 대한 자세한 내용은 Fluent Bit 설명서의 다음 섹션을 참조하세요.

(선택 사항) Fluent Bit의 로그 볼륨 축소

기본적으로 CloudWatch에 Fluent Bit 애플리케이션 로그와 Kubernetes 메타데이터가 전송됩니다. CloudWatch에 전송되는 데이터의 볼륨을 줄이려면 이러한 데이터 원본 중 하나 또는 둘 모두가 CloudWatch에 전송되지 못하게 막으면 됩니다.

Fluent Bit 애플리케이션 로그를 중지하려면 Fluent-Bit.yaml 파일에서 다음 섹션을 제거합니다.

[INPUT] Name tail Tag application.* Path /var/log/containers/fluent-bit* Parser docker DB /fluent-bit/state/flb_log.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10

Kubernetes 메타데이터를 제거하여 CloudWatch로 전송되는 로그 이벤트에 추가되지 못하게 하려면 Fluent-Bit.yaml 파일의 application-log.conf 섹션에 다음 필터를 추가합니다. <Metadata_1> 및 유사한 필드를 실제 메타데이터 식별자로 바꾸세요.

application-log.conf: | [FILTER] Name nest Match application.* Operation lift Nested_under kubernetes Add_prefix Kube. [FILTER] Name modify Match application.* Remove Kube.<Metadata_1> Remove Kube.<Metadata_2> Remove Kube.<Metadata_3> [FILTER] Name nest Match application.* Operation nest Wildcard Kube.* Nested_under kubernetes Remove_prefix Kube.

문제 해결

이러한 로그 그룹이 표시되지 않으며 리전이 올바른지 살펴보고 있는 경우 Fluent Bit daemonSet 포드의 로그를 확인하여 오류를 찾습니다.

다음 명령을 실행하여 상태가 Running인지 확인합니다.

kubectl get pods -n amazon-cloudwatch

로그에 IAM 권한과 관련된 오류가 있다면 클러스터 노드에 연결된 IAM 역할을 확인합니다. Amazon EKS 클러스터를 실행하는 데 필요한 권한에 대한 자세한 내용은 Amazon EKS 사용 설명서의 Amazon EKS IAM 정책, 역할 및 권한 단원을 참조하세요.

Pod 상태가 CreateContainerConfigError이면 다음 명령을 실행하여 정확한 오류를 가져옵니다.

kubectl describe pod pod_name -n amazon-cloudwatch

대시보드

대시보드를 생성하여 실행 중인 각 플러그 인의 지표를 모니터링할 수 있습니다. 출력 오류 및 재시도/실패 비율 관련 데이터뿐만 아니라 입력 및 출력 바이트 관련 데이터, 레코드 처리 속도 관련 데이터를 확인할 수 있습니다. 이러한 지표를 보려면 Amazon EKS 및 Kubernetes 클러스터용 Prometheus 지표 수집과 함께 CloudWatch 에이전트를 설치해야 합니다. 대시보드 설정 방법에 대한 자세한 내용은 Amazon EKS 및 Kubernetes 클러스터에 Prometheus 지표 수집과 함께 CloudWatch 에이전트 설치 단원을 참조하세요.

참고

이 대시보드를 설정하려면 먼저, Prometheus 지표에 대한 Container Insights를 설정해야 합니다. 자세한 내용은 Container Insights Prometheus 지표 모니터링 단원을 참조하십시오.

Fluent Bit Prometheus 지표에 대한 대시보드를 생성하려면
  1. 환경 변수를 만들어서 다음 줄의 오른쪽에 있는 값을 배포와 일치하도록 바꿉니다.

    DASHBOARD_NAME=your_cw_dashboard_name REGION_NAME=your_metric_region_such_as_us-west-1 CLUSTER_NAME=your_kubernetes_cluster_name
  2. 다음 명령을 실행하여 대시보드를 생성합니다.

    curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/fluent-bit/cw_dashboard_fluent_bit.json \ | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \ | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \ | xargs -0 aws cloudwatch put-dashboard --dashboard-name ${DASHBOARD_NAME} --dashboard-body