88. Logging and Monitoring - Section Introduction
- 클러스터 컴포넌트 및 애플리케이션 모니터링 방법
- 클러스터 컴포넌트 및 애플리케이션 로그 관리 방법
- Practice Lab을 통한 실습
89. Monitor Cluster Components
모니터링 대상
| 레벨 | 메트릭 |
|---|---|
| Node Level | 노드 수, 노드 상태(Healthy), CPU 사용률, Memory 사용률, Network I/O, Disk 사용률 |
| Pod Level | Pod 수, CPU 사용량, Memory 사용량 |
Kubernetes에는 종합적인 built-in 모니터링 솔루션이 없음 → 외부 도구 필요
모니터링 솔루션
| 구분 | 도구 |
|---|---|
| 오픈소스 | Metrics Server, Prometheus, Elastic Stack |
| 상용 | Datadog, Dynatrace |
Heapster → Metrics Server
- Heapster: 과거 Kubernetes 모니터링 표준 → Deprecated
- Metrics Server: Heapster의 후속, 현재 표준
- 클러스터당 1개 배포
- In-Memory 저장 → 과거 데이터 조회 불가
- 단기 모니터링 + 빠른 인사이트 용도
메트릭 수집 흐름
Pod → cAdvisor (Kubelet 내장) → Kubelet API → Metrics Server → kubectl top
- cAdvisor (Container Advisor): Kubelet 내부에서 실행되며 Pod의 성능 메트릭 수집
- Metrics Server가 Kubelet API를 통해 각 노드의 cAdvisor 데이터를 조회/집계
왜 이런 구조인가?
- cAdvisor: 각 노드에서 컨테이너 단위 CPU/메모리 수집하는 전문가 (원래 Google이 Docker용으로 개발)
- Metrics Server: 여러 노드의 cAdvisor 데이터를 클러스터 전체로 집계하는 관리자
- kubectl top: 이 집계된 데이터를 사용자에게 보여주는 창구
cAdvisor는 kubelet 안에 묻혀있어서 별도 설치 불필요. 반면 Metrics Server는 따로 설치 필요 (한 번만 deploy하면 됨).
Metrics Server 설치
# Minikube 환경
minikube addons enable metrics-server
# 일반 클러스터
# 방법 A
git clone https://github.com/kubernetes-incubator/metrics-server.git
kubectl create -f deploy/1.8+/
# 방법 B
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
리소스 사용량 확인
# 노드별 CPU/Memory 사용량
kubectl top node
# 출력 예시:
# NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
# kubemaster 166m 8% 1337Mi 70%
# kubenode1 36m 1% 1046Mi 55%
# kubenode2 39m 1% 1048Mi 55%
# Pod별 CPU/Memory 사용량
kubectl top pod
# 출력 예시:
# NAME CPU(cores) MEMORY(bytes)
# nginx 166m 1337Mi
# redis 36m 1046Mi
kubectl top은 Metrics Server가 설치되어 있어야 동작. 설치 후 데이터 수집까지 잠시 시간이 필요함
Metrics Server 설치 후 자주 겪는 트러블슈팅
증상 1: kubectl top 이 에러 반환
kubectl top nodes
# error: Metrics API not available
# 또는
# error: Metrics API returned ... unable to fetch metrics from Kubelet...진단 순서
# 1. Metrics Server 파드 상태 확인
kubectl get pods -n kube-system | grep metrics-server
# READY 가 0/1이면 문제 있음
# 2. 파드 로그 확인
kubectl logs -n kube-system deploy/metrics-server
# 흔한 에러:
# - "x509: cannot validate certificate for 192.168.x.x because it doesn't contain any IP SANs"
# - "unable to fetch node metrics"
# - "TLS handshake error"
# 3. Metrics API 등록 확인
kubectl get apiservice v1beta1.metrics.k8s.io
# AVAILABLE 이 False면 문제해결 1: --kubelet-insecure-tls 플래그 추가 (가장 흔한 케이스)
kubeadm이나 자체 서명 인증서를 쓰는 환경에서 발생.
# Deployment 편집
kubectl edit deploy -n kube-system metrics-server
# spec.template.spec.containers.args 아래 추가:
# - --kubelet-insecure-tls
# - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname또는 patch 명령으로 한 번에:
kubectl patch deploy -n kube-system metrics-server --type='json' -p='[
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}
]'
# 적용 후 재시작
kubectl rollout restart deploy/metrics-server -n kube-system해결 2: Hostname 해결 안 될 때
# --kubelet-preferred-address-types 플래그로 IP 우선 사용
kubectl patch deploy -n kube-system metrics-server --type='json' -p='[
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname"}
]'해결 3: 수집까지 대기 시간
# 설치/재시작 후 메트릭이 모이기까지 보통 30초~2분 대기
kubectl top nodes -w자주 쓰는 top 조합
# ── 정렬 ──────────────────────────────────────────────────
kubectl top pod --sort-by=cpu
kubectl top pod --sort-by=memory
kubectl top pod -A --sort-by=memory # 모든 namespace
kubectl top node --sort-by=cpu
# ── 라벨 필터 ──────────────────────────────────────────────
kubectl top pod -l app=web
kubectl top pod -l tier=front -n prod
# ── 컨테이너별 (멀티 컨테이너 Pod 분석) ────────────────────
kubectl top pod --containers
# ── 가장 많이 쓰는 Pod TOP 5 ──────────────────────────────
kubectl top pod -A --sort-by=memory | head -6
# ── 리소스 초과 감지용 (Pod spec의 limits 대비) ───────────
kubectl top pod <pod-name>
kubectl describe pod <pod-name> | grep -A3 Limits90-91. Labs - Monitoring Cluster Components
# Metrics Server 상태 확인
kubectl top node
kubectl top pod
# 가장 CPU를 많이 사용하는 pod 찾기
kubectl top pod --sort-by=cpu
# 가장 메모리를 많이 사용하는 pod 찾기
kubectl top pod --sort-by=memory
# 특정 namespace의 pod 리소스 사용량
kubectl top pod -n kube-system
# 모든 namespace의 pod 리소스 사용량
kubectl top pod -A92. Managing Application Logs
공식문서: Logging Architecture
Docker 로깅
# 포그라운드 실행 → 로그가 터미널에 바로 출력
docker run kodekloud/event-simulator
# 백그라운드 실행 → 로그 스트리밍으로 확인
docker run -d kodekloud/event-simulator
docker logs -f <container_id>Kubernetes 로깅
apiVersion: v1
kind: Pod
metadata:
name: event-simulator-pod
spec:
containers:
- name: event-simulator
image: kodekloud/event-simulator# Pod 로그 확인 (실시간 스트리밍)
kubectl logs -f event-simulator-pod
# 출력 예시:
# 2018-10-06 15:57:15,937 - root - INFO - USER1 logged in
# 2018-10-06 15:57:16,943 - root - INFO - USER2 logged out
# 2018-10-06 15:57:17,944 - root - INFO - USER3 is viewing page3Multi-Container Pod 로깅
apiVersion: v1
kind: Pod
metadata:
name: event-simulator-pod
spec:
containers:
- name: event-simulator
image: kodekloud/event-simulator
- name: image-processor
image: some-image-processor# ❌ 컨테이너 미지정 → 에러 발생
kubectl logs -f event-simulator-pod
# Error: Pod has more than one container...
# ✅ 컨테이너 이름 지정 필수
kubectl logs -f event-simulator-pod event-simulator
kubectl logs -f event-simulator-pod image-processorMulti-container Pod에서
kubectl logs사용 시 반드시 컨테이너 이름을 지정해야 함
유용한 로그 명령어
# 최근 N줄만 보기
kubectl logs --tail=20 event-simulator-pod
# 최근 1시간 로그만 보기
kubectl logs --since=1h event-simulator-pod
# 이전 컨테이너 로그 (재시작된 경우)
kubectl logs --previous event-simulator-pod
# 모든 컨테이너 로그 한번에 보기
kubectl logs event-simulator-pod --all-containers=true93-94. Labs - Monitor Application Logs
# Pod 내 컨테이너 목록 확인
kubectl describe pod <pod-name> | grep -A5 "Containers:"
# 특정 컨테이너 로그 확인
kubectl logs <pod-name> <container-name>
# 실시간 로그 모니터링 + 컨테이너 지정
kubectl logs -f <pod-name> <container-name>핵심 명령어 요약
| 명령어 | 용도 |
|---|---|
kubectl top node | 노드 리소스 사용량 확인 |
kubectl top pod | Pod 리소스 사용량 확인 |
kubectl top pod --sort-by=cpu | CPU 사용량 기준 정렬 |
kubectl logs -f <pod> | Pod 로그 실시간 스트리밍 |
kubectl logs -f <pod> <container> | 특정 컨테이너 로그 확인 |
kubectl logs --tail=N <pod> | 최근 N줄 로그 |
kubectl logs --since=1h <pod> | 최근 1시간 로그 |
kubectl logs --previous <pod> | 이전(재시작 전) 로그 |
모니터링 아키텍처 전체 흐름
graph TB subgraph Cluster["Kubernetes Cluster"] subgraph N1["Node 1"] P1A["Pod"] P1B["Pod"] CA1["cAdvisor (Kubelet)"] P1A --> CA1 P1B --> CA1 end subgraph N2["Node 2"] P2A["Pod"] P2B["Pod"] CA2["cAdvisor (Kubelet)"] P2A --> CA2 P2B --> CA2 end CA1 --> MS["Metrics Server (In-Memory)"] CA2 --> MS MS <-.-> KT["kubectl top"] end MS -..->|"장기 데이터 필요 시"| EXT["Prometheus / Elastic Stack / Datadog"]