pod로깅이란?
pod로깅은 data plane 노드 로그와 노드에서 실행 중인 pod로그를 말합니다. pod로깅은 EKS설정을 지원하지 않습니다. 사용자가 도구를 선택해서 pod로그 수집과 저장을 해야 합니다. AWS공식문서에서는 Fluentbit또는 FlunetD를 사용하여 pod를 수집하고 cloudwatch에 전송하는 예제를 제공합니다
fargate는 eks 공식문서를 참조하시길 바랍니다.
설치방법
IAM policy 설정
worker node IAM role에 “CloudWatchAgentServerPolicy” policy를 부여해야합니다. worker node가 cloudwatch에 접근할 때 권한이 필요합니다.
worker node IAM role은 [EKS 대시보드 -> compute]에서 설정할 수 있습니다.
node group을 선택하고 IAM role을 클릭합니다.
CloudWatchAgentServerPolicy IAM policy를 추가합니다.
fluentbit 설치
AWS 공식문서에서 제공하는 fluentbit manifest를 생성합니다.
먼저 namespace를 생성합니다.
# namespace생성
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
그 다음 configmap을 생성합니다.
# configmap생성
ClusterName=cluster-name
RegionName=cluster-region
FluentBitHttpPort='2020'
FluentBitReadFromHead='Off'
[[ ${FluentBitReadFromHead} = 'On' ]] && FluentBitReadFromTail='Off'|| FluentBitReadFromTail='On'
[[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer='Off' || FluentBitHttpServer='On'
kubectl create configmap fluent-bit-cluster-info \
--from-literal=cluster.name=${ClusterName} \
--from-literal=http.server=${FluentBitHttpServer} \
--from-literal=http.port=${FluentBitHttpPort} \
--from-literal=read.head=${FluentBitReadFromHead} \
--from-literal=read.tail=${FluentBitReadFromTail} \
--from-literal=logs.region=${RegionName} -n amazon-cloudwatch
마지막으로 fluenetbit를 생성합니다.
# fluenetbit 생성
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
설치확인
fluentbit를 생성하면 amazon-cloudwatch namespace가 생성되고 쿠버네티스 리소스가 생성됩니다. 아래 예제는 worker node가 1개여서 pod도 1개만 생성되었습니다.
kubectl -n amazon-cloudwatch get ds,po,configmap
fluentbit pod로그를 조회할 때 오류가 없어야 합니다. 만약 오류가 있다면 IAM policy가 올바르게 추가되었는지 확인해보세요.
kubectl -n amazon-cloudwatch logs -l k8s-app=fluent-bit -f
AWS cloudwatch에서는 fluenetbit이 전송한 pod로그가 보입니다.
configmap설정 살펴보기
AWS공식문서에서 제공하는 manifest는 configmap으로 fluenetbit설정을 했습니다. configmap에는 EKS pod로그와 worker node 정보를 수집하고 cloudwatch에 전송하는 설정이 있습니다. pod에 속한 컨테이너 로그는 pod를 실행하는 worker node 특정경로(/var/log/conatiners/)에 저장됩니다. fluenetbit은 해당 경로에 있는 로그를 전부 수집합니다.
pod로그 확인 예제
1초마다 hello world문자열을 출력하는 pod를 배포하고 cloudwatch에 보이는지 확인해보겠습니다. 아래 manifest를 갖는 pod를 배포합니다.
apiVersion: v1
kind: Pod
metadata:
name: busybox-pod
spec:
containers:
- name: busybox
image: busybox
resources:
requests:
cpu: "100m"
memory: "64Mi"
limits:
cpu: "100m"
memory: "64Mi"
args:
- /bin/sh
- -c
- >
while true; do
echo "Hello World!";
sleep 1;
done
그리고 몇 초 뒤 cloudwatch를 확인하면 busybox log stream이 보입니다. logstream이름이 busybox인 이유는, pod이름이 busybox이기 때문입니다. log stream을 클릭하여 로그를 확인하면 hello world문자열이 잘 보입니다.
log insight로 확인하면 시간대별로 쌓인 pod로그를 볼 수 있습니다.
참고자료
- aws fluentbit 설치 공식문서: https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-logs-FluentBit.html#Container-Insights-FluentBit-setup
- eks workshop: https://www.eksworkshop.com/docs/observability/logging/pod-logging/
이하여백
'연재 시리즈' 카테고리의 다른 글
EKS 스터디 - 5주차 1편 - VPA (2) | 2023.05.21 |
---|---|
EKS 스터디 - 4주차 3편 - AMP에 EKS메트릭 저장 (0) | 2023.05.14 |
EKS 스터디 - 4주차 1편 - 컨트롤 플레인 로깅 (0) | 2023.05.07 |
EKS 스터디 - 3주차 2편 - EKS Fargate와 원리 (0) | 2023.04.30 |
EKS 스터디 - 3주차 1편 - EKS가 AWS스토리지를 다루는 원리 (0) | 2023.04.28 |