1. Control Plane 로깅 확인
이번 실습은 4장 Amazon EKS 원클릭 배포 환경에서 진행합니다.
그리고 새롭게 인프라를 배포하면 아래 기본 설정 명령을 입력 후 진행 바랍니다.
기본 설정 명령어
1.1. Control Plane 로깅 활성화
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 --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 메뉴로 진입합니다.
Select up to 50 log groups에 생성한 로그 그룹을 선택 후 다음 작업을 수행합니다.
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 desc
Bash
복사
# authenticator 로그에서 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 logs delete-log-group --log-group-name /aws/eks/$CLUSTER_NAME/cluster
Bash
복사
# EKS Control Plane 로그 그룹 삭제
2. Application 로깅 직접 확인
2.1. NGINX 웹 서버 배포
Helm으로 bitnami nginx 설치
helm repo add bitnami https://charts.bitnami.com/bitnami
Bash
복사
# helm repository 추가
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
cat nginx-values.yaml | yh
Bash
복사
# nginx-values 파일 생성
helm install nginx bitnami/nginx --version 14.1.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
복사
# 컨테이너 로그 파일 위치 확인
노드에서 컨테이너 로그 확인
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 로그 소스 (Logs from /var/log/dmesg, /var/log/secure, and /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 로그 소스(/var/log/journal for kubelet.service, kubeproxy.service, and docker.service), 쿠버네티스 데이터플레인 로그
ssh ec2-user@$N3 sudo journalctl -u kubelet -x -n 200
Bash
복사
# journal 로그 확인 (kubelet 정보 - 최근 200 라인)
ssh ec2-user@$N3 sudo journalctl -u kubelet -f
Bash
복사
# journal 로그 확인 (kubelet 정보 - 실시간)
3.2. 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/cloudwatch-namespace.yaml
Bash
복사
# 네임스페이스 생성
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
복사
# 대상 파드에 부하 발생
Log Insight 정보 확인
Note: 관리 콘솔에 CloudWatch 로그 그룹에서 application 로그 그룹을 선택 –> 로그 스트림 필터링 nginx –> ApacheBench 필터링 후 확인합니다.
stats count() as error_count by kubernetes.container_name
| filter stream="stderr"
| sort error_count desc
Bash
복사
# Log Insight 컨테이너 이름별 애플리케이션 로그 오류 카운트
⇒ 로그 그룹 선택 : /aws/containerinsights/<CLUSTER_NAME>/application
kubectl exec deploy/nginx -c nginx -- kill -s SIGINT 1
Bash
복사
# 컨테이너 프로세스 강제 종료
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
복사
# 노드에서 컨테이너 에러 카운트
⇒ 로그 그룹 선택 : /aws/containerinsights/<CLUSTER_NAME>/host
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
aws logs delete-log-group --log-group-name /aws/containerinsights/$CLUSTER_NAME/performance
Bash
복사
# 로그 그룹 삭제 : 데이터 플레인
Warning: 다음 섹션의 실습을 이어서 진행할 것으로 Amazon EKS 원클릭 배포를 유지합니다. 혹시나 다음 섹션을 진행하지 않을 경우 4장 Amazon EKS 원클릭 배포를 삭제해 주길 바랍니다.
여기까지 4장의 Amazon EKS 로깅 구성하기 실습을 마칩니다.
수고하셨습니다 :)