CloudNet@ 팀의 가시다님께서 Leading 하시는 AEWS Study 4주차 스터디 내용 정리
이번 포스팅에서는 CloudWatch Insight 를 사용하여 EKS 의 로그를 확인하는 방법에 대해 알아보겠습니다.
1. EKS Control Plane Logging
EKS Control Plane 로그를 수집하기 위해서는 EKS 의 로깅 기능을 활성화해야 합니다.
EKS 의 Default 설정은 해당 기능을 비활성화입니다.
1.1. EKS Control Plane 로깅 활성화
- 로깅은 AWS 콘솔 혹은 AWS CLI 를 통해 활성화 할 수 있습니다.
aws eks update-cluster-config --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME \
--logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}'
각 로그를 활성화하면, /aws/eks/<cluster-name>/cluster 로그 그룹에 각각 LogStream 이 생성됩니다.
- api –
kube-apiserver-<nnn...>
- audit –
kube-apiserver-audit-<nnn...>
- authenticator –
authenticator-<nnn...>
- controllerManager –
kube-controller-manager-<nnn...>
- scheduler –
kube-scheduler-<nnn...>
1.2. CloudWatch Logs Insights 테스트
CloudWatch Logs Insights 는 CloudWatch Logs 내의 로그 데이터를 대화식으로 검색해 분석할 수 있는 서비스입니다.
기능
- 한 번의 요청으로 최대 50개의 로그 그룹 쿼리 가능
- 쿼리가 완료되지 않았을 경우, 60분 후에 Time Out
- 쿼리 결과는 7일 간 사용 가능
- 생성 쿼리 저장 기능 제공
Logs Insight Field
기본적으로 로그 인사이트는 다음의 5개 필드를 자동으로 생성합니다.
- @message : CloudWatch Logs 의 Message
- @timestamp : CloudWatch Logs 의 timestamp
- @ingestionTime : CloudWatch Logs 가 로그 이벤트를 수신한 시간
- @logStream : CloudWatch Logs 의 로그 스트림 이름
- @log : 로그 그룹 식별자
CloudWatch Logs Insight 참고 문서
다음의 쿼리 예제를 통해 EKS 로그 그룹을 쿼리할 수 있습니다.
- @timestamp , @message 필드 출력
- authenticator 로그 스트림을 filtering
- @timestamp 를 기준으로 내림차순 정렬
- 최신 20개 로그만 쿼리
fields @timestamp, @message
| filter @logStream ~= "authenticator"
| sort @timestamp desc
| limit 20
2. EKS Application Logging
AWS 에서는 CloudWatch Logs Container Insight 를 통해 EKS 에 배포된 Application 메트릭 확인이 가능합니다.
2.1. Test Nginx Pod 배포
helm repo add bitnami https://charts.bitnami.com/bitnami
MyDomain=<Route53 Domain>
CERT_ARN=<ACM CERT>
cat <<EOT > nginx-values.yaml
service:
type: NodePort
ingress:
enabled: true
ingressClassName: alb
hostname: nginx.$MyDomain
path: /*
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
alb.ingress.kubernetes.io/success-codes: 200-399
alb.ingress.kubernetes.io/load-balancer-name: $CLUSTER_NAME-ingress-alb
alb.ingress.kubernetes.io/group.name: study
alb.ingress.kubernetes.io/ssl-redirect: '443'
EOT
helm install nginx bitnami/nginx --version 14.1.0 -f nginx-values.yaml
2.2. CloudWatch Agent / Fluent Bit 배포
플루언트 비트와 클라우드 와치 에이전트를 데몬셋 형태로 동작하여
다음 CloudWatch Logs Group 에 저장하면 Container Insight 를 활용할 수 있습니다.
- /aws/containerinsights/<Cluster_Name>/application : 컨테이너/파드 로그
- /aws/containerinsights/<Cluster_Name>/host : 노드(호스트) 로그
- /aws/containerinsights/<Cluster_Name>/dataplane : 데이터플레인 로그
- AWS 에서는 CloudWatch Agent 와 Fluent Bit 이 통합된 Yaml 파일을 제공합니다.
FluentBitHttpServer='On'
FluentBitHttpPort='2020'
FluentBitReadFromHead='Off'
FluentBitReadFromTail='On'
curl -s https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/quickstart/cwagent-fluent-bit-quickstart.yaml | sed 's/{{cluster_name}}/'${CLUSTER_NAME}'/;s/{{region_name}}/'${AWS_DEFAULT_REGION}'/;s/{{http_server_toggle}}/"'${FluentBitHttpServer}'"/;s/{{http_server_port}}/"'${FluentBitHttpPort}'"/;s/{{read_from_head}}/"'${FluentBitReadFromHead}'"/;s/{{read_from_tail}}/"'${FluentBitReadFromTail}'"/' | kubectl apply -f -
CloudWatch Log Group 을 확인해보면 다음과 같은 4개 로그 그룹이 생성된 것을 알 수 있습니다.
2.3. Container Insight 확인
Container Map
EKS 오브젝트에 대한 간략한 구성도를 볼 수 있습니다.
Resource Metrics / Monitoring
EKS 에 배포된 오브젝트에 대한 Monitoring 이 가능합니다.
참고 문서
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/control-plane-logs.html
https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html
https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html
https://aws.amazon.com/ko/blogs/containers/fluent-bit-integration-in-cloudwatch-container-insights-for-eks/