본문 바로가기

k8s 실전 프로젝트/3. 모니터링 환경 구축

FluentD를 활용, EKS로그를 Cloudwatch에 저장

# EKS에서 생성되는 로그를 Cloudwatch 서비스 로그 그룹으로 저장하는 방법에 대해서 알아본다. FluentD를 설치하여 작업을 진행한다.

* 사전 준비사항

새로운 작업을 할 때 가장 고려해야 할 사항은 보안과 권한 문제이다.

EKS 자원을 CloudWatch에서 모니터링하기 위해서는 모니터링 대상이 CloudWatch에 접근할 수 있는 권한이 존재해야 한다. 여기서는 Node Group 인스턴스가 될 것이다.

Node Group의 IAM 권한을 확인한다. EC2 인스턴스로 접근하여 IAM 권한을 확인하면 아래와 같다.

해당 IAM으로 접근하여 우측 상단에 권한 추가 → 정책 연결을 클릭하여 CloudWatchAgentServerPolicy 권한을 아래와 같이 부여한다.

여기까지 완료가 되었다면, 아래의 작업을 진행하면 된다.

* FluentD란 무엇인가?

Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data.

플루언트d는 오픈소스 로그 수집기 이며, 이를 통해 데이터 수집 및 소비를 통합하고 데이터를 더 잘 사용하고 이해할 수 있다. 라고 공식사이트에 나와있다.

1. NameSpace를 생성한다.

kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/master/k8s-yaml-templates/cloudwatch-namespace.yaml

2. IAM 서비스 어카운트를 생성한다.

eksctl create iamserviceaccount --name cwagent-prometheus --namespace amazon-cloudwatch --cluster <cluster-name> --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy --approve --override-existing-serviceaccounts

3. configmap을 생성한다.

kubectl create configmap cluster-info --from-literal=cluster.name=<cluster name> --from-literal=logs.region=<region-code> -n amazon-cloudwatch

4. FluentD를 배포한다.

혹시 아래의 명령어를 이용하여 배포를 수행 후 Cloudwatch 로그그룹에 로그가 보이지 않을 경우 아래의 URL 파일을 직접 열고 내용을 복사 후 yaml파일을 생성, kubectl apply -f <파일명>으로 배포하면 정상적으로 로그가 보이는 경우가 있으니 참고한다.

kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/master/k8s-yaml-templates/fluentd/fluentd.yaml

FluentD파일을 다운받는 명령어는 아래와 같다.

wget https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/master/k8s-yaml-templates/fluentd/fluentd.yaml

5. 모든것이 정상적으로 진행됐다면, EKS에서 서비스가 정상적으로 동작하고 있는지 확인한다.

cloudwatch-agent pod 2개와 fluentd-* pod2개가 정상적으로 실행되고 있음을 알 수 있다.

만약 RESTARTS에 숫자가 올라가고 있거나 RESTARTS기록이 존재 한다면 log를 확인하고 문제가 있는지 확인하고 넘어가야 한다.

kubectl get pod -n amazon-cloudwatch
NAME                       READY   STATUS    RESTARTS   AGE
cloudwatch-agent-hvrfr     1/1     Running   0          136m
cloudwatch-agent-hzj86     1/1     Running   0          136m
fluentd-cloudwatch-dwthb   1/1     Running   0          90m
fluentd-cloudwatch-fmhdx   1/1     Running   0          90m

확인한 김에 1개의 pod에 대해 로그를 확인해보자.

kubectl logs <fluentd-pod명> -n amazon-cloudwatch -f

참고로, -f 옵션은 실시간으로 로그를 확인하는 옵션이다. 로그가 쌓이는 대로 화면에 보이게 된다.
아래처럼 로그가 정상적으로 쌓이고 있는 모습을 볼 수 있다.

kubectl logs fluentd-cloudwatch-dwthb -n amazon-cloudwatch -f
...
2022-03-10 08:08:58 +0000 [info]: #0 [filter_kube_metadata_fluentd] stats - namespace_cache_size: 1, pod_cache_size: 1, namespace_cache_api_updates: 1, pod_cache_api_updates: 1, id_cache_miss: 1
2022-03-10 08:09:02 +0000 [info]: #0 Timeout flush: var.log.containers.nginx-66b6c48dd5-4wwz9_default_nginx-39eab6a54d44e5a188e9603897ee13c0d8fdfce1e27bae68441f5df71079e193.log:default
2022-03-10 08:09:13 +0000 [info]: #0 Timeout flush: var.log.containers.nginx-66b6c48dd5-4qttm_default_nginx-22d45a19ea7865f60062112abd0dfd227b6eda6703fac95ee2fcfa530c9ba32c.log:default
2022-03-10 08:09:17 +0000 [info]: #0 Timeout flush: var.log.containers.nginx-66b6c48dd5-4wwz9_default_nginx-39eab6a54d44e5a188e9603897ee13c0d8fdfce1e27bae68441f5df71079e193.log:default

6. Cloudwatch 서비스의 로그 그룹에서 수집된 로그를 확인한다.

아래처럼 로그그룹에 정상적으로 로그 폴더가 생성된 것을 확인할 수 있다.

*/appication 폴더로 들어가서 파일을 확인해 보면 아래와 같다.

내용을 확인해보면 pod의 로그들이 파일마다 쌓이고 있는 모습니다.

*/dataplane 폴더로 들어가서 파일을 확인해보면 아래와 같다.

해당 내용은 노드들의 로그를 수집하여 기록하고 있는 모습니다.

*/host 폴더로 이동하여 파일을 확인해보면 아래와 같다.

내용을 보면 노드들의 hosting 내용을 기록한 것이라고 볼 수 있다.

*/performance 폴더로 이동하여 파일을 확인해보면 아래와 같다.

내용을 보면 인스턴스의 활동들을 기록한 것이라고 볼 수 있다.

FluentD를 통해 log를 로그그룹에 저장을 하면, 저장된 로그를 S3로 이동하거나,

별도의 사용자가 원하는 파일로 저장하여 로그 분석 등에 활용을 할 수 있을거 같다.

 

- 끝 -