내용으로 건너뛰기

Amazon EKS에서 컨테이너 로그를 CloudWatch로 스트리밍하려면 어떻게 해야 합니까?

5분 분량
0

Fluent Bit 또는 Fluentd를 사용하여 Amazon Elastic Kubernetes Service(Amazon EKS)에서 실행되는 컨테이너의 로그를 Amazon CloudWatch Logs로 스트리밍하려고 합니다.

간략한 설명

Fluent Bit는 CloudWatch Container Insights의 기본 로그 솔루션입니다. Fluentd 대신 Fluent Bit를 사용하는 것이 좋습니다. Amazon은 Amazon Elastic Container Registry(Amazon ECR)에서 Fluent Bit 컨테이너 이미지를 제공합니다. 자세한 내용은 Amazon ECS용 AWS for Fluent Bit 이미지 리포지토리를 참조하십시오.

Fluent Bit를 다운로드하는 방법은 Fluent Bit 웹 사이트에서 Getting started with Fluent Bit를 참조하십시오. Fluentd의 경우, Fluentd 웹 사이트에서 Download and install Fluentd를 참조하십시오.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI 오류 문제 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

Amazon EC2 클러스터의 Amazon EKS에서 실행되는 컨테이너 로그 스트리밍

다음 단계를 완료하십시오.

  1. 다음 kubectl 명령을 실행해 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. 다음 명령을 실행해 로그를 보내려는 클러스터 이름과 AWS 리전을 사용하여 fluent-bit-cluster-info라는 ConfigMap을 만듭니다.

    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

    참고: MY-CLUSTER-NAME을 해당하는 클러스터의 이름으로, MY-CLUSTER-REGION을 클러스터의 리전으로 바꾸십시오.

  3. Fluent Bit를 DaemonSet로 배포해 Amazon Elastic Compute Cloud(Amazon EC2) 클러스터에 로그를 보내려면 다음 명령을 실행합니다.

    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

    앞의 명령을 실행하고 나면 Fluent Bit가 CloudWatch에서 다음 애플리케이션, 호스트 및 데이터플레인 로그 그룹 및 소스를 만듭니다.
    /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 로스 소스는 /var/log/journal에서 kubelet.service, kubeproxy.service 및 docker.service 로그 그룹에 대한 로그를 수집합니다.

  4. (선택 사항) 다음 명령을 실행해 Amazon ECR에서 기본 이미지 대신 Fluent Bit를 사용하십시오.

    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. eksctl을 설치합니다.
    참고: 다음 명령을 실행하려면 eksctl을 설치해야 합니다.

  6. 다음 eksctl 명령을 실행해 서비스 계정에 대한 AWS Identity and Access Management(IAM) 역할(IRSA)을 만듭니다.

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

Fluent Bit 배포 확인

다음 단계를 완료하십시오.

  1. 다음 kubectl 명령을 실행해 amazon-cloudwatch 네임스페이스의 포드 이름을 나열합니다.
    kubectl get pods -n amazon-cloudwatch
    참고: 포드 이름은 fluent-bit-*****로 반환됩니다.
  2. 다음 kubectl describe 명령을 실행해 특정 포드에 대한 이벤트 출력을 확인합니다.
    kubectl describe pod POD_NAME -n amazon-cloudwatch
    참고: POD_NAME을 해당하는 포드의 이름으로 바꾸십시오.
  3. 다음 kubectl 명령을 실행해 로그를 확인합니다.
    kubectl logs pod-name -n amazon-cloudwatch
    참고: POD_NAME을 해당하는 포드의 이름으로 바꾸십시오.

Fargate 클러스터의 Amazon EKS에서 실행되는 컨테이너 로그 스트리밍

AWS Fargate 클러스터의 Amazon EKS에는 Fluent Bit를 사용하는 내장 로그 라우터가 있습니다. AWS가 사용자를 대신해 자동으로 Fluent Bit를 실행합니다. 자세한 내용은 클러스터의 AWS Fargate 로깅 시작을 참조하십시오.

다음 단계를 완료하십시오.

  1. 다음 명령을 실행해 이름이 aws-observability인 전용 Kubernetes 네임스페이스를 만듭니다.

    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. 다음 명령을 실행해 Fluent Conf 데이터 값으로 ConfigMap을 만들어 컨테이너 로그를 CloudWatch Logs로 스트리밍합니다.

    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. CloudWatch용 AWS 관리형 정책을 만듭니다.
    참고: 다음 명령에서는 Fargate 프로파일에 대해 지정한 포드 실행 역할에 IAM 정책을 연결합니다. 111122223333을 AWS 계정 ID로, your-pod-execution-role을 포드 실행 역할의 이름으로 바꾸십시오.

  4. 다음 curl 명령을 실행해 IAM 정책 파일을 다운로드합니다.

    curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
  5. 다음 create-policy 명령을 실행해 정책 파일에서 IAM 정책을 만듭니다.

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
  6. 다음 attach-role-policy 명령을 실행해 Fargate 프로파일에 대해 지정한 포드 실행 역할에 해당 IAM 정책을 연결합니다.

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
    --role-name your-pod-execution-role
  7. 다음 kubectl 명령을 실행해 로깅 구성이 Fargate 포드에 적용되었는지 확인합니다.

    kubectl describe pod POD-NAME

    참고: POD-NAME을 해당하는 포드의 이름으로 바꾸십시오. 출력에 로깅이 활성인지 확인하는 포드 이벤트가 포함됩니다. 자세한 내용은 문제 해결을 참조하십시오.

Fluent Bit 로그 스트리밍 배포 정리

Fluent Bit를 EC2 클러스터에 배포한 경우, 다음 kubectl 명령을 실행해 Fluent Bit 배포를 삭제합니다.

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

Fluent Bit를 Fargate 클러스터에 배포한 경우, 다음 kubectl 명령을 실행해 aws-observability 네임스페이스를 삭제합니다. 이렇게 하면 ConfigMap을 제거하고 로그 스트리밍이 중지됩니다.

kubectl delete namespace aws-observability

참고: aws-observability 네임스페이스를 삭제하고 나면 새 Fargate 포드가 로그를 CloudWatch Logs로 보내지 않습니다. 기존 포드는 삭제하고 다시 배포할 때까지 계속 로그를 보냅니다. CloudWatch에서 이미 수신한 로그는 계속 CloudWatch Logs에서 사용할 수 있는 상태로 유지됩니다.

관련 정보

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

1 댓글

This article was reviewed and updated on 2026-05-25.

전문가

답글을 게시함 14일 전