88. Logging and Monitoring - Section Introduction

  • 클러스터 컴포넌트 및 애플리케이션 모니터링 방법
  • 클러스터 컴포넌트 및 애플리케이션 로그 관리 방법
  • Practice Lab을 통한 실습

89. Monitor Cluster Components

모니터링 대상

레벨메트릭
Node Level노드 수, 노드 상태(Healthy), CPU 사용률, Memory 사용률, Network I/O, Disk 사용률
Pod LevelPod 수, CPU 사용량, Memory 사용량

Kubernetes에는 종합적인 built-in 모니터링 솔루션이 없음 → 외부 도구 필요

모니터링 솔루션

구분도구
오픈소스Metrics Server, Prometheus, Elastic Stack
상용Datadog, Dynatrace

Heapster → Metrics Server

  • Heapster: 과거 Kubernetes 모니터링 표준 → Deprecated
  • Metrics Server: Heapster의 후속, 현재 표준
    • 클러스터당 1개 배포
    • In-Memory 저장 → 과거 데이터 조회 불가
    • 단기 모니터링 + 빠른 인사이트 용도

메트릭 수집 흐름

PodcAdvisor (Kubelet 내장) → Kubelet APIMetrics Serverkubectl 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 Limits

90-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 -A

92. 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 page3

Multi-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-processor

Multi-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=true

93-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 podPod 리소스 사용량 확인
kubectl top pod --sort-by=cpuCPU 사용량 기준 정렬
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"]