(선택 사항) Fluentd를 DaemonSet로 설정하여 CloudWatch Logs에 로그 전송 - Amazon CloudWatch

(선택 사항) Fluentd를 DaemonSet로 설정하여 CloudWatch Logs에 로그 전송

주의

Fluentd에 대한 Container Insights 지원은 현재 유지 관리 모드에 있습니다. 즉, AWS는 Fluentd에 대한 추가 업데이트를 제공하지 않으며 가까운 시일 내에 Fluentd를 사용 중지할 계획입니다. 또한 Container Insights의 현재 Fluentd 구성은 최신 개선 사항 및 보안 패치가 없는 이전 버전의 Fluentd 이미지인 fluent/fluentd-kubernetes-daemonset:v1.10.3-debian-cloudwatch-1.0을 사용하고 있습니다. 오픈 소스 커뮤니티에서 지원하는 최신 Fluentd 이미지는 fluentd-kubernetes-daemonset를 참조하세요.

가능하면 Container Insights와 함께 FluentBit를 사용하도록 마이그레이션하는 것이 좋습니다. FluentBit를 Container Insights의 로그 전달자로 사용하면 상당한 성능 향상을 얻을 수 있습니다.

자세한 내용은 Fluent Bit를 DaemonSet로 설정하여 CloudWatch Logs에 로그 전송 이미 Fluentd를 사용 중인 경우 차이점 섹션을 참조하세요.

Fluentd를 설정하여 컨테이너에서 로그를 수집하려면 Amazon EKS 및 Kubernetes에서 Container Insights의 빠른 시작 설정의 절차를 따르거나 이 섹션의 절차를 따르면 됩니다. 다음 단계에서는 FluentD를 DaemonSet로 설정하여 CloudWatch Logs에 로그를 전송합니다. 이 단계가 완료되고 로그 그룹이 아직 존재하지 않으면 Fluentd가 다음과 같이 로그 그룹을 생성합니다.

로그 그룹 이름 로그 소스

/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에서의 로그.

1단계: CloudWatch의 네임스페이스 생성

다음 단계를 통해 CloudWatch에 대해 amazon-cloudwatch라는 Kubernetes 네임스페이스를 생성합니다. 이 네임스페이스를 이미 생성했다면 이 단계를 건너뛸 수 있습니다.

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단계: Fluentd 설치

Fluentd를 다운로드하여 이 프로세스를 시작합니다. 이러한 단계를 완료하면 배포된 에이전트에서 클러스터에 대해 다음과 같은 리소스가 생성됩니다.

  • amazon-cloudwatch 네임스페이스의 fluentd이라는 서비스 계정. 이 서비스 계정은 Fluentd DaemonSet를 실행하는 데 사용됩니다. 자세한 내용은 Kubernetes 참조 문서의 서비스 계정 관리를 참조하세요.

  • amazon-cloudwatch 네임스페이스의 fluentd이라는 클러스터 역할. 이 클러스터 역할은 fluentd 서비스 계정에 대해 Pod 로그에서 get, listwatch 권한을 부여합니다. 자세한 내용은 Kubernetes 참조 문서의 API 개요를 참조하세요.

  • amazon-cloudwatch 네임스페이스의 fluentd-config이라는 ConfigMap. 이 ConfigMap에는 Fluentd에서 사용되는 구성이 포함되어 있습니다. 자세한 내용은 Kubernetes 작업 설명서의 ConfigMap을 사용하도록 Pod 구성을 참조하세요.

Fluentd를 설치하려면
  1. 클러스터 이름과 로그가 전송될 AWS 리전을 포함하여 cluster-info이라는 ConfigMap을 생성합니다. 다음 명령을 실행하여 클러스터와 리전 이름으로 자리표시자를 업데이트합니다.

    kubectl create configmap cluster-info \ --from-literal=cluster.name=cluster_name \ --from-literal=logs.region=region_name -n amazon-cloudwatch
  2. 다음 명령을 실행하여 Fluentd DaemonSet를 다운로드한 후 클러스터에 배포합니다. 올바른 아키텍처의 컨테이너 이미지를 사용하고 있는지 확인합니다. 매니페스트 예는 x86 인스턴스에서만 작동하므로 클러스터에 Advanced RISC Machine(ARM) 인스턴스가 있는 경우 CrashLoopBackOff를 입력합니다. Fluentd DaemonSet에는 여러 기본 이미지에 대해 하나의 태그를 사용하고 컨테이너 런타임이 올바른 이미지를 가져오도록 하는 공식 다중 아키텍처 도커 이미지가 없습니다. Fluentd ARM 이미지는 arm64 접미사가 있는 다른 태그를 사용합니다.

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluentd/fluentd.yaml
    참고

    Fluentd 구성을 최적화하고 Kubernetes API 엔드포인트에 대한 Fluentd API 요청의 영향을 최소화하기 위한 최근 변경으로 인해 Kubernetes 필터에 대한 ‘Watch’ 옵션이 기본적으로 사용 중지되었습니다. 자세한 내용은 fluent-plugin-kubernetes_metadata_filter를 참조하세요.

  3. 다음 명령을 실행하여 배포를 확인합니다. 각 노드에는 fluentd-cloudwatch-*라는 이름의 Pod가 하나 포함되어야 합니다.

    kubectl get pods -n amazon-cloudwatch

3단계: Fluentd 설정 확인

다음 단계를 이용하여 Fluentd 설정을 확인합니다.

Container Insights를 위한 Fluentd 설정을 확인하려면
  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. 탐색 창에서 로그 그룹을 선택합니다. 컨테이너에 Fluentd를 배포한 리전에 있는지 확인합니다.

    해당 리전의 로그 그룹 목록에서 다음을 확인해야 합니다.

    • /aws/containerinsights/Cluster_Name/application

    • /aws/containerinsights/Cluster_Name/host

    • /aws/containerinsights/Cluster_Name/dataplane

    이러한 로그 그룹을 보면 Fluentd 설정이 확인됩니다.

여러 줄 로그 지원

2019년 8월 19일에 Fluentd에서 수집한 로그에 대한 여러 줄 로그 지원을 추가했습니다.

기본적으로 여러 줄 로그 항목 스타터는 공백이 포함되지 않은 임의의 문자입니다. 이는 공백이 포함되지 않은 문자로 시작하는 모든 로그 행이 새로운 여러 줄 로그 항목으로 간주됨을 뜻합니다.

자체 애플리케이션 로그에서 다른 여러 줄 스타터를 사용하는 경우 fluentd.yaml 파일에서 두 가지 사항을 변경하여 이를 지원할 수 있습니다.

먼저 fluentd.yamlcontainers 섹션에 있는 exclude_path 필드에 로그 파일의 경로 이름을 추가하여 기본 여러 줄 지원에서 해당 로그를 제외합니다. 다음은 예입니다.

<source> @type tail @id in_tail_container_logs @label @containers path /var/log/containers/*.log exclude_path ["full_pathname_of_log_file*", "full_pathname_of_log_file2*"]

그 다음 로그 파일에 대한 블록을 fluentd.yaml 파일에 추가합니다. 아래 예는 타임스탬프 정규 표현식을 여러 줄 스타터로 사용하는 CloudWatch 에이전트의 로그 파일에 사용됩니다. 이 블록을 복사하여 fluentd.yaml에 추가할 수 있습니다. 표시된 줄을 변경하여 사용하려는 애플리케이션 로그 파일 이름과 여러 줄 스타터를 반영하게 합니다.

<source> @type tail @id in_tail_cwagent_logs @label @cwagentlogs path /var/log/containers/cloudwatch-agent* pos_file /var/log/cloudwatch-agent.log.pos tag * read_from_head true <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source>
<label @cwagentlogs> <filter **> @type kubernetes_metadata @id filter_kube_metadata_cwagent </filter> <filter **> @type record_transformer @id filter_cwagent_stream_transformer <record> stream_name ${tag_parts[3]} </record> </filter> <filter **> @type concat key log multiline_start_regexp /^\d{4}[-/]\d{1,2}[-/]\d{1,2}/ separator "" flush_interval 5 timeout_label @NORMAL </filter> <match **> @type relabel @label @NORMAL </match> </label>

(선택 사항) Fluentd의 로그 볼륨 축소

기본적으로 CloudWatch에 Fluentd 애플리케이션 로그와 Kubernetes 메타데이터가 전송됩니다. CloudWatch에 전송되는 데이터의 볼륨을 줄이려면 이러한 데이터 원본 중 하나 또는 둘 모두가 CloudWatch에 전송되지 못하게 막으면 됩니다.

Fluentd 애플리케이션 로그를 중단하려면 fluentd.yaml 파일에서 다음 섹션을 제거하세요.

<source> @type tail @id in_tail_fluentd_logs @label @fluentdlogs path /var/log/containers/fluentd* pos_file /var/log/fluentd.log.pos tag * read_from_head true <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source> <label @fluentdlogs> <filter **> @type kubernetes_metadata @id filter_kube_metadata_fluentd </filter> <filter **> @type record_transformer @id filter_fluentd_stream_transformer <record> stream_name ${tag_parts[3]} </record> </filter> <match **> @type relabel @label @NORMAL </match> </label>

Kubernetes 메타데이터를 제거하여 CloudWatch로 전송되는 로그 이벤트에 추가되지 못하게 하려면 fluentd.yaml 파일의 record_transformer 섹션에 한 줄을 추가합니다. 이 메타데이터를 제거하려는 로그 소스에서 다음 줄을 추가합니다.

remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id

예:

<filter **> @type record_transformer @id filter_containers_stream_transformer <record> stream_name ${tag_parts[3]} </record> remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id </filter>

문제 해결

이러한 로그 그룹을 확인하지 않고 올바른 리전을 살펴보고 있는 경우, 오류를 찾으려면 Fluentd DaemonSet Pod에 대한 로그를 확인합니다.

다음 명령을 실행하여 상태가 Running인지 확인합니다.

kubectl get pods -n amazon-cloudwatch

이전 명령의 결과에서 fluentd-cloudwatch로 시작하는 Pod 이름을 적어둡니다. 다음 명령에서 이 Pod 이름을 사용합니다.

kubectl logs pod_name -n amazon-cloudwatch

로그에 IAM 권한과 관련된 오류가 있다면 클러스터 노드에 연결된 IAM 역할을 확인합니다. Amazon EKS 클러스터를 실행하는 데 필요한 권한에 대한 자세한 내용은 Amazon EKS 사용 설명서Amazon EKS IAM 정책, 역할 및 권한 단원을 참조하세요.

Pod 상태가 CreateContainerConfigError이면 다음 명령을 실행하여 정확한 오류를 가져옵니다.

kubectl describe pod pod_name -n amazon-cloudwatch

포드 상태가 CrashLoopBackOff인 경우 Fluentd 컨테이너 이미지의 아키텍처가 Fluentd를 설치한 시점의 노드와 동일한지 확인합니다. 클러스터에 x86 및 ARM64 노드가 모두 있는 경우 kubernetes.io/arch 레이블을 사용하여 이미지를 올바른 노드에 배치할 수 있습니다. 자세한 내용은 kuberntes.io/arch를 참조하세요.