Fargate 로깅 - Amazon EKS

Fargate 로깅

중요

Amazon EKS가 있는 AWS Fargate은 AWS GovCloud(미국 동부) 및 AWSGovCloud(미국 서부)를 제외한 모든 Amazon EKS 지역에서 사용할 수 있습니다.

Amazon EKS on Fargate는 Fluent Bit를 기반으로 내장된 로그 라우터를 제공합니다. 즉, 사용자가 Fluent Bit 컨테이너를 사이드카로 명시적으로 실행하지는 않지만 Amazon이 자동으로 실행합니다. 로그 라우터를 구성하기만 하면 됩니다. 이 구성은 다음 기준을 충족해야 하는 전용 ConfigMap을 통해 이루어집니다.

  • aws-logging으로 이름 지정

  • aws-observability라는 전용 네임스페이스에서 생성

  • 5300자를 초과할 수 없습니다.

ConfigMap을 생성하고 나면 Fargate의 Amazon EKS가 자동으로 감지하고 로그 라우터를 구성합니다. Fargate는 Fluent Bit에 대한 AWS의 한 버전인 AWS에서 관리하는 Fluent Bit의 업스트림 호환 배포판을 사용합니다. 자세한 내용을 알아보려면 GitHub의 Fluent Bit에 대한 AWS를 참조하세요.

로그 라우터를 사용하면 AWS에서 로그 분석 및 저장을 위한 다양한 서비스를 사용할 수 있습니다. Fargate에서 Amazon CloudWatch, Amazon OpenSearch Service로 로그를 직접 스트리밍할 수 있습니다. Amazon S3, Amazon Kinesis Data Streams, Amazon Data Firehose를 통한 파트너 도구 등의 대상으로 로그를 스트리밍할 수도 있습니다.

필수 조건

로그 라우터 구성

로그 라우터 구성하기

다음 단계에서 모든 example value를 고유한 값으로 바꿉니다.

  1. aws-observability로 이름이 지정된 전용 Kubernetes 네임스페이스를 생성합니다.

    1. 다음 콘텐츠를 컴퓨터에 aws-observability-namespace.yaml이라는 파일에 저장합니다. name의 값은 aws-observability여야 하며 aws-observability: enabled 레이블이 필요합니다.

      kind: Namespace apiVersion: v1 metadata: name: aws-observability labels: aws-observability: enabled
    2. 네임스페이스를 생성합니다.

      kubectl apply -f aws-observability-namespace.yaml
  2. Fluent Conf 데이터 값을 사용하여 ConfigMap을 생성함으로써 컨테이너 로그를 대상에 전달합니다. Fluent Conf는 Fluent Bit입니다. 이는 원하는 로그 대상에 컨테이너 로그를 라우팅하는 데 사용되는 빠르고 가벼운 로그 프로세서 구성 언어입니다. 자세한 내용을 알아보려면 Fluent Bit 설명서의 구성 파일을 참조하세요.

    중요

    일반적인 Fluent Conf에 포함된 주요 단원은 Service, Input, Filter, Output입니다. 하지만 Fargate 로그 라우터는 다음 부분만 수락합니다.

    • FilterOutput 부분입니다.

    • Parser 부분.

    기타 부분을 제공하는 경우 해당 부분은 거부됩니다.

    Fargate 로그 라우터에서는 ServiceInput 부분을 관리합니다. 여기에는 수정할 수 없고 ConfigMap에서 필요하지 않은 다음과 같은 Input 부분이 있습니다. 그러나 메모리 버퍼 제한과 로그에 적용된 태그와 같은 인사이트를 얻을 수 있습니다.

    [INPUT] Name tail Buffer_Max_Size 66KB DB /var/log/flb_kube.db Mem_Buf_Limit 45MB Path /var/log/containers/*.log Read_From_Head On Refresh_Interval 10 Rotate_Wait 30 Skip_Long_Lines On Tag kube.*

    ConfigMap 생성 시에는 Fargate가 필드를 검증하는 데 사용하는 다음 규칙을 고려하세요.

    • [FILTER], [OUTPUT], [PARSER]는 각 해당 키 아래에 지정되어야 합니다. 예를 들어 filters.conf[FILTER]에 있어야 합니다. filters.conf에 하나 이상의 [FILTER]가 있을 수 있습니다. [OUTPUT][PARSER] 부분도 해당 키 아래에 있어야 합니다. 여러 개의 [OUTPUT] 부분을 지정하여 로그를 여러 대상으로 동시에 라우팅할 수 있습니다.

    • Fargate는 각 섹션에 필요한 키를 검증합니다 Namematch[FILTER][OUTPUT]에 각각 필요합니다. Nameformat[PARSER]에 각각 필요합니다. 태그는 대/소문자를 구분합니다.

    • ${ENV_VAR}과 같은 환경 변수는 ConfigMap에서 허용되지 않습니다.

    • 들여쓰기는 각 filters.conf, output.conf, parsers.conf 내의 지시문 또는 키 값 페어에 대해 동일해야합니다. 키 값 페어는 지시문보다 들여 써야 합니다.

    • Fargate는 grep, parser, record_modifier, rewrite_tag, throttle, nest, modify, kubernetes 등의 지원 필터에 대해 검증을 실시합니다.

    • Fargate는 다음과 같은 지원되는 출력에 대해 검증합니다. es, firehose, kinesis_firehose, cloudwatch, cloudwatch_logskinesis.

    • 로깅을 사용 설정하려면 ConfigMap에서 지원되는 Output 플러그 인이 1개 이상 제공되어야 합니다. FilterParser는 로깅을 사용 설정하는 데 필요하지 않습니다.

    검증에서 발생하는 문제를 해결하기 위해 원하는 구성을 사용하여 Amazon EC2에서 Fluent Bit를 실행할 수 있습니다. 다음 예 중 하나를 사용하여 ConfigMap을 생성합니다.

    중요

    Amazon EKS Fargate 로깅은 ConfigMaps의 동적 구성을 지원하지 않습니다. ConfigMaps의 모든 변경 사항은 새 Pods에만 적용됩니다. 기존 Pods에는 변경 사항이 적용되지 않습니다.

    원하는 로그 대상에 대한 예제를 사용하여 ConfigMap을 생성합니다.

    참고

    로그 대상에 Amazon Kinesis Data Streams를 사용할 수도 있습니다. Kinesis Data Streams를 사용하는 경우 포드 실행 역할에 kinesis:PutRecords 권한이 부여되었는지 확인하세요. 자세한 내용은 Fluent Bit: Official Manual의 Amazon Kinesis Data Streams Permissions를 참조하세요.

    CloudWatch

    CloudWatch의 ConfigMap를 생성하는 방법

    CloudWatch를 사용할 때는 다음 두 가지 출력 옵션이 있습니다.

    다음 예에서는 cloudwatch_logs 플러그 인을 사용하여 CloudWatch로 로그를 전송하는 방법을 보여줍니다.

    1. 다음 콘텐츠를 aws-logging-cloudwatch-configmap.yaml이라는 파일에 저장합니다. region-code를 클러스터가 있는 AWS 리전으로 바꿉니다. [OUTPUT] 아래의 파라미터는 필수입니다.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: flb_log_cw: "false" # Set to true to ship Fluent Bit process logs to CloudWatch. filters.conf: | [FILTER] Name parser Match * Key_name log Parser crio [FILTER] Name kubernetes Match kube.* Merge_Log On Keep_Log Off Buffer_Size 0 Kube_Meta_Cache_TTL 300s output.conf: | [OUTPUT] Name cloudwatch_logs Match kube.* region region-code log_group_name my-logs log_stream_prefix from-fluent-bit- log_retention_days 60 auto_create_group true 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
    2. 매니페스트를 클러스터에 적용합니다.

      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
    3. CloudWatch IAM 정책을 컴퓨터에 다운로드합니다. GitHub에서 정책을 볼 수도 있습니다.

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

    Amazon OpenSearch Service에 대한 ConfigMap 생성

    Amazon OpenSearch Service로 로그를 전송하려는 경우 C로 작성된 플러그 인인 es 출력을 사용할 수 있습니다. 다음 예에서는 플러그 인을 사용하여 OpenSearch로 로그를 전송하는 방법을 보여줍니다.

    1. 다음 콘텐츠를 aws-logging-opensearch-configmap.yaml이라는 파일에 저장합니다. 모든 example value를 고유한 값으로 바꿉니다.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name es Match * Host search-example-gjxdcilagiprbglqn42jsty66y.region-code.es.amazonaws.com Port 443 Index example Type example_type AWS_Auth On AWS_Region region-code tls On
    2. 매니페스트를 클러스터에 적용합니다.

      kubectl apply -f aws-logging-opensearch-configmap.yaml
    3. OpenSearch IAM 정책을 컴퓨터에 다운로드합니다. GitHub에서 정책을 볼 수도 있습니다.

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

      OpenSearch Dashboard의 액세스 컨트롤이 제대로 구성되어 있는지 확인합니다. OpenSearch Dashboard의 all_access role에는 Fargate Pod 실행 역할과 IAM 역할이 매핑되어야 합니다. security_manager 역할에 대해서도 동일한 매핑이 수행되어야 합니다. 이전 매핑을 추가하려면 Menu, Security, Roles를 차례로 선택한 다음 해당 역할을 선택합니다. 자세한 내용은 CloudWatch Logs가 내 Amazon ES 도메인으로 스트리밍되도록 문제를 해결하려면 어떻게 해야 하나요? 부분을 참조하세요.

    Firehose

    Firehose용 ConfigMap을 생성하려면

    Firehose로 로그를 전송할 때는 다음과 같은 두 가지 출력 옵션이 있습니다.

    다음 예에서는 kinesis_firehose 플러그 인을 사용하여 Firehose로 로그를 전송하는 방법을 보여줍니다.

    1. 다음 콘텐츠를 aws-logging-firehose-configmap.yaml이라는 파일에 저장합니다. region-code를 클러스터가 있는 AWS 리전으로 바꿉니다.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name kinesis_firehose Match * region region-code delivery_stream my-stream-firehose
    2. 매니페스트를 클러스터에 적용합니다.

      kubectl apply -f aws-logging-firehose-configmap.yaml
    3. Firehose IAM 정책을 컴퓨터에 다운로드합니다. GitHub에서 정책을 볼 수도 있습니다.

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
  3. 이전 단계에서 다운로드한 정책 파일에서 IAM 정책을 만듭니다.

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
  4. 다음 명령을 사용하여 Fargate 프로필에 대해 지정된 포드 실행 역할에 IAM 정책을 연결합니다. 111122223333을 계정 ID로 바꿉니다. AmazonEKSFargatePodExecutionRole을 Pod 실행 역할로 바꿉니다(자세한 내용은 Fargate Pod 실행 역할 생성 참조).

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \ --role-name AmazonEKSFargatePodExecutionRole

Kubernetes 필터 지원

이 기능을 사용하려면 다음과 같은 최소 Kubernetes 버전 및 플랫폼 수준 이상이 필요합니다.

Kubernetes 버전 플랫폼 수준
1.23 이상 eks.1

Fluent Bit Kubernetes 필터를 사용하면 로그 파일에 Kubernetes 메타데이터를 추가할 수 있습니다. 필터에 대한 자세한 내용은 Fluent Bit 설명서의 Kubernetes를 참조하세요. API 서버 엔드포인트를 사용하여 필터를 적용할 수 있습니다.

filters.conf: | [FILTER] Name kubernetes Match kube.* Merge_Log On Buffer_Size 0 Kube_Meta_Cache_TTL 300s
중요
  • Kube_URL, Kube_CA_File, Kube_Token_CommandKube_Token_File은 서비스 소유 구성 파라미터이므로 지정하면 안 됩니다. Amazon EKS Fargate가 이러한 값을 채웁니다.

  • Kube_Meta_Cache_TTL은 Fluent Bit가 최신 메타데이터에 대해 API 서버와 통신할 때까지 대기하는 시간입니다. Kube_Meta_Cache_TTL을 지정하지 않으면 Amazon EKS Fargate는 API 서버의 로드를 줄이기 위해 기본값 30분을 추가합니다.

계정에 Fluent Bit 프로세스 로그 전송

다음 ConfigMap을 사용하여 Fluent Bit 프로세스 로그를 Amazon CloudWatch로 선택적으로 전송할 수 있습니다. Fluent Bit 프로세스 로그를 CloudWatch로 전송하려면 추가 로그 수집 및 스토리지 비용이 필요합니다. region-code를 클러스터가 있는 AWS 리전으로 바꿉니다.

kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability labels: data: # Configuration files: server, input, filters and output # ====================================================== flb_log_cw: "true" # Ships Fluent Bit process logs to CloudWatch. output.conf: | [OUTPUT] Name cloudwatch Match kube.* region region-code log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group true

로그는 CloudWatch 아래에 클러스터가 있는 AWS 리전에 있습니다. 로그 그룹 이름은 my-cluster-fluent-bit-logs이고 Fluent Bit 로그스트림 이름은 fluent-bit-podname-pod-namespace입니다.

참고
  • 프로세스 로그는 Fluent Bit 프로세스가 성공적으로 시작된 경우에만 전송됩니다. Fluent Bit를 시작하는 동안 오류가 발생하면 프로세스 로그가 누락됩니다. CloudWatch에는 프로세스 로그만 전송할 수 있습니다.

  • 계정으로 프로세스 로그 전송을 디버깅하려면 이전 ConfigMap을 적용하여 프로세스 로그를 가져올 수 있습니다. Fluent Bit가 시작하지 못하는 것은 대개 시작하는 동안 Fluent Bit에 의해 구문 분석 또는 수락되지 않은 ConfigMap 때문입니다.

Fluent Bit 프로세스 로그 전송을 중지하려면

Fluent Bit 프로세스 로그를 CloudWatch로 전송하려면 추가 로그 수집 및 스토리지 비용이 필요합니다. 기존 ConfigMap 설정에서 프로세스 로그를 제외하려면 다음 단계를 수행하세요.

  1. Fargate 로깅을 활성화한 후 Amazon EKS 클러스터의 Fluent Bit 프로세스 로그에 대해 자동으로 생성된 CloudWatch 로그 그룹을 찾습니다. 형식 {cluster_name}-fluent-bit-logs을 따릅니다.

  2. CloudWatch 로그 그룹에서 각 Pod's의 프로세스 로그에 대해 생성된 기존 CloudWatch 로그 스트림을 삭제합니다.

  3. ConfigMap을 편집하고 flb_log_cw: "false"를 설정합니다.

  4. 클러스터의 기존 Pods를 다시 시작합니다.

애플리케이션 테스트

  1. 샘플 Pod를 배포합니다.

    1. 다음 콘텐츠를 컴퓨터에 sample-app.yaml이라는 파일에 저장합니다.

      apiVersion: apps/v1 kind: Deployment metadata: name: sample-app namespace: same-namespace-as-your-fargate-profile spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - name: http containerPort: 80
    2. 매니페스트를 클러스터에 적용합니다.

      kubectl apply -f sample-app.yaml
  2. ConfigMap에서 구성한 대상을 사용하여 NGINX 로그를 봅니다.

크기 조정 고려 사항

로그 라우터에 대해 최대 50MB의 메모리를 계획하는 것이 좋습니다. 애플리케이션에서 매우 높은 처리량으로 로그를 생성할 것으로 예상되는 경우 최대 100MB까지 계획해야 합니다.

문제 해결

잘못된 ConfigMap과 같은 원인으로 로깅 기능이 사용 또는 사용 중지되었는지 여부와 잘못된 이유를 확인하려면 kubectl describe pod pod_name을 사용하여 Pod 이벤트를 살펴봅니다. 출력에는 다음 예제 출력과 같이 로깅의 사용 여부를 명확히 하는 Pod 이벤트가 포함될 수 있습니다.

[...] Annotations: CapacityProvisioned: 0.25vCPU 0.5GB Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND kubernetes.io/psp: eks.privileged [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning LoggingDisabled <unknown> fargate-scheduler Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found

Pod 이벤트는 설정에 따라 기간이 정해진 일시적인 이벤트입니다. 또한 kubectl describe pod pod-name을 사용하여 Pod's 주석을 볼 수 있습니다. Pod 주석에는 로깅 기능이 사용 또는 사용 중지되었는지 여부와 이유에 대한 정보가 있습니다.