EKS Log 관리에 대한 방법을 알아봅니다.
- 수집 : Fluentd 컨테이너를 데몬셋으로 동작시킨 후 파드의 로그를 CloudWatch Logs에 전송
- 저장 : CloudWatch Logs에 로그를 저장하도록 설정
- 모니터링 : 메트릭 디렉토리를 설정하고 CloudWatch 사용자 메트릭을 생성하여 그 메트릭의 결보를 생성함.
- 시각화 : CloudWatch의 Logs Insights를 사용하여 대상 로그를 분석하고 CloudWatch의 대시보드를 시각화
원래 애플리케이션 로그는 어디에 저장해야 할까요?
- 표준 출력으로 구성하는 것을 추천합니다.
- kubectl logs <파드 이름> 명령으로 파드가 표준 출력한 정보를 참조할 수 있습니다.
목차
ToggleEKS LOG 수집
- CloudWatch Logs 서비스는 애플리케이션이 출력한 로그를 수집하는 구조입니다.
- 일반적으로 EC2에 CloudWatch 에이전트를 설치하고 수집 대상 로그 파일을 설정하면 AWS 로그 저장 공간으로 전송 가능합니다.
- EKS도 위 방법이 가능하지만 데몬셋으로 플루언트디 컨테이너를 동작시켜 파드 각각의 표준 출력한 로그를 확인, CloudWatch Logs로 수집, 관리하는 방법입니다.
데이터 노드의 IAM 역할에 정책 추가
- EKS에서 배포한 데몬셋에서 CloudWatch Logs에 로그를 전송하려면 데이터 플레인에 연결된 IAM 역할에 IAM 정책을 연결해야 합니다.
- EKS 클러스터 데이터 노드에 해당하는 EC2 ‘인스턴스 ID’ 중 하나를 선택 → 상세 정보 중에 ‘IAM 역할’ 아래의 링크 클릭합니다.
- ‘요약’ 페이지에서 <정책 연결> 버튼을 클릭합니다.
- ‘정책 이름’ 목록 → ‘CloudWatchAgentServerPolicy’ 선택 → <정책 연결> 클릭합니다.
CloudWatch용 네임스페이스 생성
#네임스페이스 생성용 매니페스트 다운로드
curl -0 <https://s3.amazonaws.com/cloudwatch-agent-k8s-yaml/> \\
> kubernetesmonitorsing/cloudwatch-namespace.yaml
# 네임스페이스 생성
kubectl apply -f cloudwatch-namespace.yaml
namespace/amazon-Cloudwatch created
플루언트디 컨테이너를 데몬셋으로 동작시키기
- 플루언트디 컨테이너를 설치할 매니페스트 다운로드
- 플루언트디 컨테이너를 데몬셋으로 동작시킴
# 플루언트디 컨테이너에서 사용할 컨피그맵 생성
kubectl create configmap cluster-info \\
--from-literal=cluster.name=eks-work-cluster \\
--from-literal=logs.region=ap-north-east-2 -n amazon-cloudwatch
# 플루언트디 컨테이너를 설치할 매니페스트 다운로드
curl -0 <https://raw.githubsercontent.com/aws-samples/> \\
amazon-clouldwatchcontainer-insights/latest/k8s-deployment-manifest-templates/ \\
deployment-mode/daemonset/container-insights-monitoring/fluentd/fluentd.yaml
# 플로언트디 컨테이너를 데몬셋으로 동작시킴
kubectl apply -f fluentd.yaml
- CloudWatch Logs에 아래와 같은 로그 그룹 생성
- /aws/containerinsights/eks-work-cluster/application
- /aws/containerinsights/eks-work-cluster/host
- /aws/containerinsights/eks-work-cluster/dataplane
로그 저장
- CloudWatch Logs로 전송된 로그는 기간 제한 없이 저장, 로그 용량에 따라 과금이 발생. 용도에 맞게 저장 기간을 설정해서 사용.
- 목표 : 로그 저장 기간 설정(비용 감소)
CloudWatch Logs에서 보관 기간 설정
- CloudWatch Logs에서는 로그 그룹 단위로 로그 저장 기간 설정
- application, host, dataplane 단위로 설정 가능
- 각각의 application 단위로 설정은 불가능
로그 모니터링
CloudWatch 경보를 사용한 통지
- 메트릭 필터에서 에러 대상 로그를 추출 → 그것을 CloudWatch 메트릭으로 등록 → 메트릭 경보를 생성하면 통지를 보낼 수 있음.
- 메트릭 필터 조건을 ‘ERROR’로 설정하고 출력 횟수를 메트릭에 등록
- 출력 횟수 메트릭 통보 생성(예를 들어 5분간 1회 이상 발생하면 통지 등)
- ‘어떤 애플리케이션에서 발생한 에러인지’에 대해 미리 추출 조건을 포함시켜야 함.
- 메트릭 필터를 설정하면 CloudWatch 사용자 메트릭이 증가하여 그만큼 비용이 발생함.
CloudWatch Logs 이벤트 검색을 이용한 디버그 예.
- batch-app 에러 검색
- CloudWatch 페이지 왼쪽 메뉴 ‘로그 그룹’ 선택 → /aws/containerinsights/eks-work-cluster/application 클릭
- 로그 스트림 목록이 표시된 페이지 → <Search log group> 버튼 클릭
# 이벤트 검색 조건 예 # '애플리케이션 로그 AND 애플리케이션 이름이 backend-app AND "WARN"이나 # "error"가 포함된다'라는 조건 { $.log != "[*" &&.kubernetes.container_name = "backend-app" && ( $.log = "*WARN*" || $.log = "*error*" ) }
로그의 시각화와 분석
- CloudWatch Logs Insights
- CloudWatch ‘로그 그룹’ 목록 페이지 → 원하는 그룹 선택 → 왼쪽 위 <Logs Insights에서 보기> 버튼 클릭
액세스 로그 확인
- ‘어느 정도의 접속이 있었는지’, ‘어떤 애플리케이션에서 얼마만큼의 에러가 발생하고 있는지’ 등
- 쿼리를 사용해 위와 같은 정보를 수집할 수 있음.
# 예제 애플리케이션에 어느 정도의 접속이 있었는지 확인
stats count(*) as ACCESS_COUNT
| filter ( kubernetes.container_name = "backend-app")
| filter ( log not like /^\\[/ and (log like /Health GET API called./ or log like /
REGION GET ALL API/ or log like /LOCATION LIST BY REGION ID API/ )
# 어떤 애플리케이션에서 얼마만틈의 에러가 발생하고 있는지 확인
stats count(*) as ERROR_COUNT by kubenetes.container_name as APP
| filter ( log not like /^\\[/ and (log like /WARN/ or log like /error/) )
쿼리 결과를 대시보드에 저장
- 수집할 정보를 매번 하나씩 쿼리로 입력하는 것은 비효율적임. 여러 쿼리 결과를 대시보드에 저장해두면 전체적인 상황을 파악할 수 있음.
- 쿼리 실행 결과 페이지 → <대시보드에 추가> 버튼 클릭
이상으로 로그 운영 방식에 대해 알아보았습니다.