
AWS EKS 환경의 Control Plane의 로깅을 활성화 해보자.
Control Plane의 로깅 기능을 활성화✅ 하면 자동으로 CloudWatch가 생성된다고 이전 글에서 설명한 바가 있다.

Control Plane의 로깅 대상은 API서버, Authenticator, 스케쥴러, 감사, 컨트롤러 관리가 있다.
이제 본격적으로 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}]}'
물론 이렇게 aws 명령어를 사용하지 않고, aws 콘솔 화면에서 조작하는 것도 가능하다.

// CloudWatch의 로그 그룹 생성 확인
aws logs describe-log-groups | jq
// 로그 그룹에 구성된 로그 스트림 확인
aws logs describe-log-streams \
--log-group-name /aws/eks/${CLUSTER_NAME}/cluster | grep logStreamName
CloudWatch에 로그그룹 및 로그스트림이 생성된 것을 확인할 수 있다.

// 10분 동안 Control Plane 로그 확인(more 옵션)
aws logs tail /aws/eks/$CLUSTER_NAME/cluster | more
// 신규 로그 바로 출력
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --follow
//로그 스트림 대상 지정 (kube-controller-mananger)
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --log-stream-name-prefix kube-controller-manager --follow
// 신규 터미널 생성 후 coreDNS 수량 조정
kubectl scale deployment -n kube-system coredns --replicas=1
kubectl scale deployment -n kube-system coredns --replicas=2
kube-controller-mananger의 로그를 확인해보자. controller-manager는 replicaset controller를 관리하므로 파드 수량을 변경시키면 수량 변경에 대한 로그가 찍힐 것이다.
다음과 같이 2 ➡️ 1로 CoreDNS 파드 수량이 감소함에 있어, kube-controller-mananger의 로그가 출력되는 것을 확인할 수 있다.

관리 콘솔에서 CloudWatch 서비스에 로그 영역에서 Logs Insights📊 메뉴로 진입 후, 생성한 로그 그룹을 선택 후 다음 작업을 수행한다.
쿼리문을 살펴볼 것은 아니므로 참고만 하면 된다.
// kube-apiserver-audit 로그에서 UserAgent 정렬 후 카운트 값
fields userAgent, requestURI, @timestamp, @message
| filter @logStream ~= "kube-apiserver-audit"
| stats count(userAgent) as count by userAgent
| sort count desc
// kube-apiserver 로그에서 timestamp로 정렬
fields @timestamp, @message
| filter @logStream ~= "kube-apiserver"
| sort @timestamp desc
// authenticator 로그에서 timestamp로 정렬
fields @timestamp, @message
| filter @logStream ~= "authenticator"
| sort @timestamp desc
다음과 같이 로그를 Logs Insights📊를 통해서 원하는 로그만을 검색하고, 지표화하여 확인할 수 있다.

실습이 끝났다면 로깅을 비활성화하고, CloudWatch에서 로그 그룹을 삭제하자.
// EKS Control Plane 로깅 비활성화
eksctl utils update-cluster-logging \
--cluster $CLUSTER_NAME \
--region $AWS_DEFAULT_REGION \
--disable-types all \
--approve
// Control Plane 로그 그룹 삭제
aws logs delete-log-group --log-group-name /aws/eks/$CLUSTER_NAME/cluster
Apllication 로깅이란 EKS에서 파드에서 동작하는 실제 컨테이너(애플리케이션)📦을 로깅하는 것을 의미한다.

테스트를 위해 NGINX 웹 서버를 배포하고, 실제 접근할 수 있도록 NodePort와 Ingress 형식으로 외부로 노출한다.
// helm repository 추가
helm repo add bitnami https://charts.bitnami.com/bitnami
// 도메인 변수 선언
MyDomain=<자신의 도메인>
// ARN 변수 선언
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`; echo $CERT_ARN
// nginx 파라미터 파일 생성
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
// nginx 배포
helm install nginx bitnami/nginx --version 14.1.0 -f nginx-values.yaml
다음과 같이 Helm 차트를 작성하고 배포해 주도록 하자.

hostname을 보면 Route53 ➡️ ALB로의 A 레코드 또한 생성해서 Route53의 주소로 접속할 수 있도록 했다.
이렇게 노출된 Ingress(ALB) LoadBalancer에는 Route53에서 발급받은 ACM 인증서를 부착하여 HTTPS로의 접근이 가능하도록 구성했다.
또한 SSL-Redirectio : 443 구성을 통해서 HTTP로 접속 시, 자동으로 HTTPS로 리다이렉션하도록 설정하였다.
helm uninstall nginx 명령어 대해서 ingress는 삭제되지 않아 명시적으로 지워줘야 했음.// ingress, deployment, service, endpoint nginx 확인
kubectl get ingress,deploy,svc,ep nginx
// alb targetgroupbinding 확인
kubectl get targetgroupbindings

HTTP:80 리스너
HTTPS(443 포트)로 리다이렉션을 수행하도록 설정됨

HTTPS:443 리스너
HTTPS의 접속 허용 (ACM 부착하여 리스너 규칙 생성)


// HTTPS로 접속 (정상 출력)
curl -s https://nginx.$MyDomain
// HTTP로 접속할 때 상세 로그 설정 (리다이렉션 되었습니다 출력)
curl -vs http://nginx.$MyDomain
// HTTP로 접속할 때 리다이렉션해서 출력 (정상 출력)
curl -L http://nginx.$MyDomain
// 신규 터미널 모니터링 - 반복 접속
MyDomain = <자신의 도메인>
while true; do curl -s https://nginx.$MyDomain -I | head -n 1; date; sleep 1; done
HTTP로 접속하는 경우 301응답으로 https로 리다이렉션 되는 것을 확인할 수 있다. (301은 리다이렉션을 의미)

// 컨테이너 로그 확인
kubectl logs deploy/nginx -c nginx -f
다음과 같이 내 컴퓨터에서 접속한 뒤 로그를 확인해보자.


처음에는 200 응답이 되었다가 이후부터는 304로 응답되는 것을 확인할 수있다. 이는 Not Modified로 클라이언트가 조건부 GET 요청을 했을 때, 클라이언트가 마지막으로 받은 이후로 리소스에 변경사항이 없으면 서버가 리소스의 본문을 다시 보내지 않는 것이다.
🍪 이는 crtl-shift+R로 쿠키를 지우고 다시 요청보내면 마지막으로 받은 리소스가 지워지므로 200 응답이 들어온다.
컨테이너에 들어가 로그가 어떻게 저장되는지 확인해보자.
kubectl exec -it deploy/nginx -c nginx -- ls -l /opt/bitnami/nginx/logs/

bitnami nginx의 경우에는 로그정보를 다음과 같이 심볼릭 링크⤴️를 표준 스트림으로 지정해서 로그를 노드에서 볼 수 있도록 저장하고 있다.
이처럼 컨테이너 내부에서 로그를 확인하는 것 보다, 컨테이너 외부의 노드의 /var/log/* 경로에 심볼릭 링크로 저장한다면 kubectl logs 명령어로 노드에서 명령어를 일괄적으로 뽑아오는 게 가능하다.
⚠️하지만! 결국
심볼릭 링크⤴️를 통해서 포인터 형식으로 참조하고 있는 것이므로 파드가 종료되면 해당 로그는 사라진다.
// /var/log/containers tree 확인 (nginx 파드가 생성된 노드 지정)
ssh ec2-user@$N1 sudo tree -C /var/log/containers
// /var/log/pods tree 확인 (nginx 파드가 생성된 노드 지정)
ssh ec2-user@$N1 sudo tree -C /var/log/pods
// /var/log/pods에서 로그 직접 확인 (nginx 로그 뒤에 삽입)
ssh ec2-user@$N1 sudo tail -f <XXXXXXXXX>
ssh ec2-user@$N1 sudo head <XXXXXXXXX>
노드에 존재하는 모든 컨테이너의 로그를 수집해서 /var/log/containers에 저장하고, 이후 심볼릭 링크➡️를 통해서 /var/log/pods 경로에 해당 로그들을 파드/컨테이너의 디렉토리 형식으로 저장된다.


이렇게 Application의 로깅을 직접 확인하는 것은 컨테이너 개별적인 로그 확인의 불편함과 컨테이너 용량의 한계, 파드가 죽으면 로그가 사라지는 위험성이 있다.
🌟따라서, fluentbit🐦와 같은 중앙집중형 로깅 방식이 나오게 되었다.
다음글 : fluentbit🐦이란?