Amazon EKS에서 컨테이너 로그를 CloudWatch로 스트리밍하려면 어떻게 해야 합니까?
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에서 실행되는 컨테이너 로그 스트리밍
다음 단계를 완료하십시오.
-
다음 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 -
다음 명령을 실행해 로그를 보내려는 클러스터 이름과 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을 클러스터의 리전으로 바꾸십시오.
-
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 로그 그룹에 대한 로그를 수집합니다. -
(선택 사항) 다음 명령을 실행해 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"}]}}}}' -
eksctl을 설치합니다.
참고: 다음 명령을 실행하려면 eksctl을 설치해야 합니다. -
다음 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 배포 확인
다음 단계를 완료하십시오.
- 다음 kubectl 명령을 실행해 amazon-cloudwatch 네임스페이스의 포드 이름을 나열합니다.
참고: 포드 이름은 fluent-bit-*****로 반환됩니다.kubectl get pods -n amazon-cloudwatch - 다음 kubectl describe 명령을 실행해 특정 포드에 대한 이벤트 출력을 확인합니다.
참고: POD_NAME을 해당하는 포드의 이름으로 바꾸십시오.kubectl describe pod POD_NAME -n amazon-cloudwatch - 다음 kubectl 명령을 실행해 로그를 확인합니다.
참고: POD_NAME을 해당하는 포드의 이름으로 바꾸십시오.kubectl logs pod-name -n amazon-cloudwatch
Fargate 클러스터의 Amazon EKS에서 실행되는 컨테이너 로그 스트리밍
AWS Fargate 클러스터의 Amazon EKS에는 Fluent Bit를 사용하는 내장 로그 라우터가 있습니다. AWS가 사용자를 대신해 자동으로 Fluent Bit를 실행합니다. 자세한 내용은 클러스터의 AWS Fargate 로깅 시작을 참조하십시오.
다음 단계를 완료하십시오.
-
다음 명령을 실행해 이름이 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 -
다음 명령을 실행해 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 -
CloudWatch용 AWS 관리형 정책을 만듭니다.
참고: 다음 명령에서는 Fargate 프로파일에 대해 지정한 포드 실행 역할에 IAM 정책을 연결합니다. 111122223333을 AWS 계정 ID로, your-pod-execution-role을 포드 실행 역할의 이름으로 바꾸십시오. -
다음 curl 명령을 실행해 IAM 정책 파일을 다운로드합니다.
curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json -
다음 create-policy 명령을 실행해 정책 파일에서 IAM 정책을 만듭니다.
aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json -
다음 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 -
다음 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에서 사용할 수 있는 상태로 유지됩니다.
관련 정보
This article was reviewed and updated on 2026-05-25.
