내용으로 건너뛰기

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

4분 분량
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 웹사이트에서 Fluent Bit 시작하기를 참조하십시오. Fluentd의 경우 Fluentd 웹사이트에서 Fluentd 다운로드를 참조하십시오.

Fluent Bit를 DaemonSet으로 설정하여 로그를 CloudWatch에 보내면 Fluent Bit는 다음 로그 그룹과 소스를 생성합니다.

  • /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에 있는 로그입니다.

해결 방법

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

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

다음 단계를 완료합니다.

  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. 클러스터 이름과 로그를 보내려는 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-namemy-cluster-region을 사용자의 클러스터 이름과 리전으로 변경하십시오.

  3. Fluent Bit를 사용하여 Amazon Elastic Compute Cloud(Amazon EC2) 클러스터로 로그를 보내려면 다음 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 ECR에서 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. 서비스 계정에 대한 AWS Identity and Access Management 역할(IRSA)을 생성하려면 다음 eksctl 명령을 실행합니다.

    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를 DaemonSet으로 설정하여 CloudWatch Logs로 로그 전송을 참조하십시오.

Fluent Bit 배포 문제 해결

다음 단계를 완료합니다.

  1. amazon-cloudwatch 네임스페이스에 있는 포드 이름을 나열하려면 다음 명령을 실행합니다.

    kubectl get pods -n amazon-cloudwatch

    참고: 포드 이름은 fluent-bit-*****으로 반환됩니다.

  2. 이벤트 출력을 확인하려면 다음 명령을 실행합니다.

    kubectl describe pod POD_NAME -n amazon-cloudwatch

    참고: POD_NAME을 사용자의 포드 이름으로 바꾸십시오.

  3. 로그를 확인하려면 다음 명령을 실행합니다.

    kubectl logs pod-name -n amazon-cloudwatch

    참고: POD_NAME을 사용자의 포드 이름으로 바꾸십시오.

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

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

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

컨테이너 로그를 CloudWatch Logs로 스트리밍하려면 다음 단계를 완료합니다.

  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 로그로 스트리밍하려면 다음 명령을 실행합니다.

    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 정책을 연결합니다.

    IAM 정책 파일을 다운로드하려면 다음 명령을 실행합니다.

    curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json

    정책 파일에서 IAM 정책을 생성하려면 다음 create-policy 명령을 실행합니다.

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json

    Fargate 프로필에 지정한 포드 실행 역할에 IAM 정책을 연결하려면 다음 attach-role-policy 명령을 실행합니다.

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
    --role-name your-pod-execution-role

    참고: 111122223333을 계정 ID로 바꾸십시오.

    자세한 내용은 문제 해결을 참조하십시오.

Fargate 포드에서 EKS의 로그 스트리밍 끄기

Fargate 포드에서 EKS의 로그 스트리밍을 끄려면 다음 명령을 실행합니다.

kubectl delete namespace aws-observability

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