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

최종 업데이트 날짜: 2022년 9월 19일

Amazon Elastic Kubernetes Service(Amazon EKS)에서 실행되는 컨테이너 로그를 CloudWatch Logs와 같은 로깅 시스템으로 스트리밍하고 싶습니다. 어떻게 해야 합니까?

간략한 설명

외부 리소스인 Fluent Bit 또는 Fluentd를 사용하여 컨테이너의 로그를 CloudWatch 로그로 전송할 수 있습니다. Fluent Bit는 Container Insights의 기본 로그 솔루션이므로 Fluentd 대신 Fluent Bit를 사용하는 것이 가장 좋습니다. Amazon은 Amazon Elastic Container Registry(Amazon ECR)에서 Fluent Bit 컨테이너 이미지를 제공합니다. 자세한 내용은 Amazon ECR의 cloudwatch-agent를 참조하세요.

CloudWatch에 로그를 전송하기 위해 Fluent Bit을 DaemonSet으로 설정하면 이러한 로그 그룹이 아직 없는 경우 FluentBit가 그룹을 생성합니다.

로그 그룹 이름 로그 소스
/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.service, and docker.service에 대한 /var/log/journal의 로그

해결 방법

사전 요구 사항

다음 단계를 수행하기 전에 사전 요구 사항을 검토하십시오.

  • EKS 클러스터가 준비 상태의 노드로 실행 중이고 kubectl 명령이 설치되어 실행 중입니다.
  • AWS Identity and Access Management(IAM) 관리형 CloudWatchAgentServerPolicy는 Amazon EKS 작업자 노드가 지표와 로그를 CloudWatch로 전송할 수 있도록 하기 위해 마련되었습니다. 작업자 노드의 IAM 역할에 정책을 연결하여 이를 수행할 수 있습니다. 또는 클러스터의 서비스 계정에 IAM 역할을 사용하고 정책을 이 역할에 연결합니다. 자세한 내용은 서비스 계정용 IAM 역할을 참조하십시오.
  • Kubernetes 버전 1.18 이상을 지원하는 클러스터를 실행 중입니다. 이는 EKS Fargate용 Container Insights 요구 사항입니다. 또한 Fargate에서 포드를 스케줄링하기 위해 Fargate 프로필을 정의했습니다.
  • EKS 포드 실행 역할은 Fargate 인프라에서 실행되는 구성 요소가 사용자를 대신하여 AWS API를 호출할 수 있도록 하기 위해 마련되었습니다. 예를 들어 Amazon ECR에서 컨테이너 이미지를 가져옵니다.

EKS EC2 클러스터에서 실행 중인 컨테이너 로그 스트리밍

컨테이너 로그를 CloudWatch 로그로 스트리밍하려면 다음 단계를 따라 Fluent Bit용 AWS를 설치하십시오.

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

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

3.    Fluent Bit 최적화 구성 DaemonSet을 클러스터에 배포합니다.

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

4.    선택 사항: Amazon Elastic Container Registry에서 AWS를 Fluent Bit 이미지에 사용하도록 aws-for-fluent-bit DaemonSet을 패치합니다.

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.    서비스 계정에 대한 IAM 역할의 경우 OIDC 공급자와 IAM 역할 및 정책을 생성합니다. 그런 다음 IAM 역할을 cloudwatch-agent 및 fluent-bit 서비스 계정에 연결합니다. ACCOUNT_IDIAM_ROLE_NAME을 AWS 계정 ID 및 서비스 계정에 사용되는 IAM 역할로 바꿉니다.

kubectl annotate serviceaccounts fluent-bit -n amazon-cloudwatch "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

추가 사용자 지정에 대해서는 Fluent Bit를 DaemonSet로 설정하여 CloudWatch Logs에 로그 전송을 참조하십시오.

Fluent Bit 배포 문제 해결

1.    다음 명령을 실행한 다음 출력 하단에서 이벤트를 확인합니다.

kubectl describe pod pod-name -n amazon-cloudwatch

2.    다음 명령을 실행하여 로그를 확인하십시오.

kubectl logs pod-name -n amazon-cloudwatch

Fluent Bit 배포 삭제

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

EKS Fargate 클러스터에서 실행 중인 컨테이너 로그 스트리밍

Amazon EKS on Fargate에는 Fluent Bit를 기반으로 하는 내장 로그 라우터가 있습니다. 다시 말해, Fluent Bit 컨테이너를 사이드카로써 명시적으로 실행하지 않는다는 의미입니다. 대신 Amazon이 실행해드립니다. 자세한 내용은 Fargate 로깅을 참조하십시오.

컨테이너 로그를 CloudWatch 로그로 스트리밍하려면 다음 단계를 따르십시오.

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.    컨테이너 로그를 CloudWatch 로그로 전송하려면 Fluent Conf 데이터 값으로 ConfigMap을 생성합니다.

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 IAM 정책을 사용하여 IAM 정책을 생성한 다음 Fargate 프로필에 지정된 포드 실행 역할에 연결합니다.

  • CloudWatch IAM 정책을 컴퓨터에 다운로드합니다. GitHub에서도 정책을 볼 수 있습니다.
curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
  • 다운로드한 정책 파일에서 IAM 정책을 생성합니다.
aws iam create-policy —policy-name eks-fargate-logging-policy —policy-document file://permissions.json
  • Fargate 프로필에 지정된 포드 실행 역할에 IAM 정책을 연결합니다. 111122223333을 계정 ID로 바꿉니다.
aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
--role-name your-pod-execution-role

EKS Fargate에서 실행되는 AWS Fluent Bit 문제 해결에 대한 자세한 내용은 문제 해결 페이지를 참조하십시오.

EKS Fargate 포드의 스트리밍 로그 비활성화

EKS Fargate 포드에 대한 스트리밍 로그를 비활성화하려면 다음 명령을 실행합니다.

kubectl delete namespace aws-observability

aws-observability 네임스페이스를 삭제한 후 포드를 삭제하고 다시 배포합니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?