1. Control Plane 로깅 확인
이번 실습은 4장 Amazon EKS 원클릭 배포 환경에서 진행합니다.
그리고 새롭게 인프라를 배포하면 아래 기본 설정 명령을 입력 후 진행 바랍니다.
기본 설정 명령어
1.1. Control Plane 로깅 활성화
Amazon EKS Control Plane 로깅 활성화
aws eks describe-cluster \
--region $AWS_DEFAULT_REGION \
--name $CLUSTER_NAME \
--query "cluster.logging.clusterLogging" \
--output json | jq
Bash
복사
# 최초 Amazon EKS Control Plane 로깅 상태
aws eks update-cluster-config \
--region $AWS_DEFAULT_REGION \
--name $CLUSTER_NAME \
--logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}'
Bash
복사
# Amazon EKS Control Plane 로깅 활성화 설정
로그 그룹 및 로그 스트림 확인
aws logs describe-log-groups | jq
Bash
복사
# CloudWatch의 로그 그룹 생성 확인
aws logs describe-log-streams \
--log-group-name /aws/eks/${CLUSTER_NAME}/cluster | grep logStreamName
Bash
복사
# 로그 그룹에 구성된 로그 스트림 확인
1.2. Control Plane 로그 확인
awscli로 Control Plane 로그 확인
aws logs tail /aws/eks/$CLUSTER_NAME/cluster | more
Bash
복사
# 10분 동안 Control Plane 로그 확인(more 옵션)
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --follow
Bash
복사
# 신규 로그 바로 출력
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 1h
Bash
복사
# 시간 지정해서 Control Plane 로그 확인
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 30m --format short
Bash
복사
aws logs tail /aws/eks/$CLUSTER_NAME/cluster \
--log-stream-name-prefix kube-controller-manager \
--follow
Bash
복사
# 로그 스트림 대상 지정 (kube-controller-mananger)
kubectl scale deployment \
-n kube-system coredns \
--replicas=1
Bash
복사
# [신규 터미널] coreDNS 수량 조정 (replicas 1)
kubectl scale deployment \
-n kube-system coredns \
--replicas=2
Bash
복사
# [신규 터미널] coreDNS 수량 조정 (replicas 2)
CloudWatch 로그 인사이트에서 쿼리하기
•
관리 콘솔에서 [CloudWatch] → [로그] → [Logs Insights]에 진입합니다.
◦
시간대: 현지 시간대
◦
선택 기준: /aws/eks/myeks/cluster
◦
쿼리 실행 (Button Click)
fields userAgent, requestURI, @timestamp, @message
| filter @logStream ~= "kube-apiserver-audit"
| stats count(userAgent) as count by userAgent
| sort count desc
Bash
복사
# kube-apiserver-audit 로그에서 UserAgent 정렬 후 카운트 값 (내림차순)
fields @timestamp, @message
| filter @logStream ~= "kube-apiserver"
| sort @timestamp desc
Bash
복사
# kube-apiserver 로그에서 timestamp로 정렬 (내림차순, 최신순)
fields @timestamp, @message
| filter @logStream ~= "authenticator"
| sort @timestamp asc
Bash
복사
# authenticator 로그에서 timestamp로 정렬 (오름차순, 오래된순)
fields @timestamp, @message
| filter @logStream ~= "kube-controller-manager"
| sort @timestamp desc
Bash
복사
# kube-controller-manager 로그에서 timestamp로 정렬 (내림차순, 최신순)
1.3. Control Plane 로깅 비활성화
Control Plane 로깅 비활성화
eksctl utils update-cluster-logging \
--cluster $CLUSTER_NAME \
--region $AWS_DEFAULT_REGION \
--disable-types all \
--approve
Bash
복사
# EKS Control Plane 로깅 비활성화
aws eks describe-cluster \
--region $AWS_DEFAULT_REGION \
--name $CLUSTER_NAME \
--query "cluster.logging.clusterLogging" \
--output json | jq
Bash
복사
# Amazon EKS Control Plane 로깅 상태 확인
aws logs delete-log-group \
--log-group-name /aws/eks/$CLUSTER_NAME/cluster
aws logs describe-log-groups | jq
Bash
복사
# EKS Control Plane 로그 그룹 삭제 및 확인
2. Application 로깅 직접 확인
2.1. NGINX 웹 서버 배포
노드 1에 라벨 구성
kubectl get nodes -o name \
| grep ip-192-168-1- \
| xargs -I {} \
kubectl label {} role=nginx-node --overwrite
Bash
복사
# 노드 1에 “nginx-node” 라벨 추가
Helm으로 bitnami nginx 설치
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
Bash
복사
# helm repository 추가
cat <<EOT > nginx-values.yaml
service:
type: NodePort
networkPolicy:
enabled: false
resourcesPreset: "nano"
nodeSelector:
role: nginx-node
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
cat nginx-values.yaml | yh
Bash
복사
# nginx-values 파일 생성
helm install nginx bitnami/nginx \
--version 20.0.0 \
-f nginx-values.yaml
Bash
복사
# nginx 배포 (helm)
생성 정보 확인
kubectl get ingress,deploy,svc,ep nginx
Bash
복사
# ingress, deployment, service, endpoint nginx 확인
kubectl get targetgroupbindings
Bash
복사
# alb targetgroupbinding 확인
2.2. Application 로그 확인
HTTP, HTTPS 접속 확인
curl -s https://nginx.$MyDomain
Bash
복사
# HTTPS로 접속
curl -s http://nginx.$MyDomain
Bash
복사
# HTTP로 접속
curl -vs http://nginx.$MyDomain
Bash
복사
# HTTP로 접속할 때 상세 로그 설정
curl -L http://nginx.$MyDomain
Bash
복사
# HTTP로 접속할 때 리다이렉션 location 정보 출력
MyDomain=<자신의 도메인>
while true; do curl -s https://nginx.$MyDomain -I | head -n 1; date; sleep 1; done
Bash
복사
# [신규 터미널] 반복 접속 모니터링
컨테이너 로그 확인
kubectl logs deploy/nginx -c nginx -f
Bash
복사
# 컨테이너 로그 확인
kubectl exec -it deploy/nginx -c nginx -- ls -l /opt/bitnami/nginx/logs/
Bash
복사
# 컨테이너 로그 파일 위치 확인
Note:
bitnami nginx 빌드 정보 링크에서 access.log와 error.log 정보를 확인합니다.
노드에서 컨테이너 로그 확인
ssh ec2-user@$N1 \
sudo tree -C /var/log/containers
Bash
복사
# /var/log/containers tree 확인 (nginx 파드가 생성된 노드 지정)
ssh ec2-user@$N1 \
sudo tree -C /var/log/pods
Bash
복사
# /var/log/pods tree 확인 (nginx 파드가 생성된 노드 지정)
ssh ec2-user@$N1 sudo tail -f <XXXXXXXXX>
ssh ec2-user@$N1 sudo head <XXXXXXXXX>
Bash
복사
# /var/log/pods에서 로그 직접 확인 (nginx 로그 뒤에 삽입)
kubelet의 컨테이너 로그 최대 사이즈
ssh ec2-user@$N1 \
journalctl -u kubelet | grep FLAG | grep container-log-max
Bash
복사
# 노드에서 kubelet 컨테이너 로그 최대 사이즈 확인
3. FluentBit를 활용한 중앙 집중형 로깅 확인
3.1. 노드에서 로그 소스 확인
Application 로그 소스
for node in $N1 $N2 $N3; \
do \
echo ">>>>> $node <<<<<"; \
ssh ec2-user@$node sudo tree /var/log/containers; \
echo; done
Bash
복사
# application 로그 소스 확인 (containers)
for node in $N1 $N2 $N3; \
do \
echo ">>>>> $node <<<<<"; \
ssh ec2-user@$node sudo tree /var/log/pods; \
echo; done
Bash
복사
# application 로그 소스 확인 (pods)
Host 로그 소스
for node in $N1 $N2 $N3; \
do \
echo ">>>>> $node <<<<<"; \
ssh ec2-user@$node sudo tree /var/log/ -L 1; \
echo; done
Bash
복사
# host 로그 소스 (/var/log/dmesg, /var/log/secure, /var/log/messages), 노드(호스트) 로그
for log in dmesg secure messages; \
do \
echo ">>>>> Node1: /var/log/$log <<<<<"; \
ssh ec2-user@$N1 sudo tail /var/log/$log; \
echo; done
Bash
복사
# 노드 1에 dmesg, secure, messages 로그 확인
Dataplane 로그 소스
for node in $N1 $N2 $N3; \
do \
echo ">>>>> $node <<<<<"; \
ssh ec2-user@$node sudo tree /var/log/journal -L 1; \
echo; done
Bash
복사
# dataplane 로그 소스, 쿠버네티스 데이터플레인 로그
ssh ec2-user@$N1 \
sudo journalctl -u kubelet -x -n 200
Bash
복사
# journal 로그 확인 (kubelet 정보 - 최근 200 라인)
ssh ec2-user@$N1 \
sudo journalctl -u kubelet -f
Bash
복사
# journal 로그 확인 (kubelet 정보 - 실시간)
3.2. FluentBit 설치 및 확인
네임 스페이스 생성
kubectl create ns amazon-cloudwatch
kubectl label ns amazon-cloudwatch name=amazon-cloudwatch
Bash
복사
# amazon-cloudwatch 네임스페이스 생성
kubectl get ns
Bash
복사
# 네임스페이스 확인
FluentBit ConfigMap 생성
FluentBitHttpServer='On'
FluentBitHttpPort='2020'
FluentBitReadFromHead='Off'
FluentBitReadFromTail='On'
Bash
복사
# 변수 선언
kubectl create configmap fluent-bit-cluster-info \
--from-literal=cluster.name=${CLUSTER_NAME} \
--from-literal=http.server=${FluentBitHttpServer} \
--from-literal=http.port=${FluentBitHttpPort} \
--from-literal=read.head=${FluentBitReadFromHead} \
--from-literal=read.tail=${FluentBitReadFromTail} \
--from-literal=logs.region=${AWS_DEFAULT_REGION} \
-n amazon-cloudwatch
Bash
복사
# FluentBit ConfigMap 생성
FluentBit 생성
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit.yaml
Bash
복사
# FluentBit 생성
kubectl get ds,pod,cm,sa -n amazon-cloudwatch
Bash
복사
# FluentBit 생성 확인
FluentBit ConfigMap 확인
kubectl get cm fluent-bit-cluster-info -n amazon-cloudwatch -o yaml | yh
Bash
복사
# FluentBit Configmap 확인
kubectl describe cm fluent-bit-config -n amazon-cloudwatch
Bash
복사
# FluentBit ConfigMap 상세 - 로그 INPUT/FILTER/OUTPUT 설정 확인
Note:
[설정 구성]
application-log.conf, dataplane-log.conf, fluent-bit.conf, host-log.conf, parsers.conf
FluentBit DaemonSet 확인
kubectl describe ds fluent-bit -n amazon-cloudwatch
Bash
복사
# FluentBit Daemonset
ssh ec2-user@$N1 sudo tree /var/log
Bash
복사
# tree 명령으로 /var/log 확인
Note:
[파드가 수집하는 방법]
Volumes에 HostPath 확인
3.3. CloudWatch 로그 확인
신규 터미널 모니터링
kubectl logs deploy/nginx -f
Bash
복사
# [신규 터미널] nginx 파드 로그 확인 (실시간)
부하 발생
yum install -y httpd
Bash
복사
# httpd 설치
ab -c 500 -n 30000 https://nginx.$MyDomain/
Bash
복사
# 대상 파드에 부하 발생
Application Log Group 확인
•
관리 콘솔에서 [CloudWatch] → [로그] → [로그 그룹] → […/application]에 진입합니다.
◦
정확히 일치 (Check)
◦
로그 스트림 검색: nginx (Select)
▪
이벤트 필터링: ApacheBench
Log Insight 정보 확인
ab -c 500 -n 30000 https://nginx.$MyDomain/notfound
Bash
복사
# 대상 파드에 부하 발생 (에러 유발)
•
관리 콘솔에서 [CloudWatch] → [로그] → [Logs Insights]에 진입합니다.
◦
시간대: 현지 시간대
◦
선택 기준: /aws/eks/myeks/cluster/application
◦
쿼리문: 아래
stats count() as error_count by kubernetes.container_name
| filter stream="stderr"
| sort error_count desc
Bash
복사
# Log Insight 컨테이너 이름별 애플리케이션 로그 오류 카운트
◦
쿼리 실행 (Button Click)
kubectl exec deploy/nginx -c nginx -- kill -s SIGINT 1
Bash
복사
# 컨테이너 프로세스 강제 종료
•
관리 콘솔에서 [CloudWatch] → [로그] → [Logs Insights]에 진입합니다.
◦
시간대: 현지 시간대
◦
선택 기준: /aws/eks/myeks/cluster/host
◦
쿼리문: 아래
fields @timestamp, @message, ec2_instance_id
| filter message like 'level=error' or message like 'level=warning'
| stats count(*) as error_count by ec2_instance_id
Bash
복사
# 노드에서 컨테이너 에러 카운트
◦
쿼리 실행 (Button Click)
3.4. 실습 자원 삭제
실습 종료 후 자원 삭제
kubectl delete ds fluent-bit -n amazon-cloudwatch \
&& kubectl delete cm fluent-bit-cluster-info -n amazon-cloudwatch \
&& kubectl delete cm fluent-bit-config -n amazon-cloudwatch \
&& kubectl delete sa fluent-bit -n amazon-cloudwatch
Bash
복사
# fluent-bit 삭제
helm uninstall nginx
Bash
복사
# bitnami nginx 삭제
aws logs delete-log-group \
--log-group-name /aws/containerinsights/$CLUSTER_NAME/application
aws logs delete-log-group \
--log-group-name /aws/containerinsights/$CLUSTER_NAME/dataplane
aws logs delete-log-group \
--log-group-name /aws/containerinsights/$CLUSTER_NAME/host
Bash
복사
# 로그 그룹 삭제 (application, dataplane, host)
Warning:
다음 섹션의 실습을 이어서 진행할 것으로 Amazon EKS 원클릭 배포를 유지합니다.
혹시나 다음 섹션을 진행하지 않을 경우 4장 Amazon EKS 원클릭 배포를 삭제해 주길 바랍니다.
여기까지 4장의 Amazon EKS 로깅 구성하기 실습을 마칩니다.
수고하셨습니다 :)