🔧 Prometheus 설정 트러블슈팅 기록

목표: Kubernetes 클러스터에 Prometheus 모니터링 스택 구성 환경: macOS M1 + VMware Fusion + Vagrant 결과: ✅ 성공 (5개 이슈 해결)


📊 요약 대시보드

항목상태비고
최초 환경⚠️ M2 노트북 (8GB)메모리 부족으로 실패
마이그레이션⚠️ M1 맥미니 (16GB)VirtualBox 호환성 없음
하이퍼바이저✅ VMware FusionARM64 안정, 헤드리스 불가
클러스터 상태✅ 정상4노드 (1 CP + 3 Worker)
Prometheus✅ 실행중http://192.168.1.11
Node Exporter✅ 실행중3개 Pod (모든 노드)
Kube State Metrics✅ 실행중메트릭 수집 정상
LoadBalancer✅ 정상MetalLB (192.168.1.11-13)

🔴 Issue #0: M2 메모리 부족 → M1 마이그레이션 삽질기 💀

💥 근본 문제: 메모리 부족

# M2 노트북에서 실습 시작
vagrant up --provider=virtualbox
# 4대 VM 구동: CP(2GB) + Worker(2GB × 3) = 8GB
# → 시스템 전체 메모리 부족!
# → VM 끊김, 느려짐, 불안정

증상:

  • Kubernetes Pod들이 무작위로 재시작
  • kubectl 명령어 응답 지연
  • VM 전체가 멈추는 현상 반복

🤔 해결 시도: M1 맥미니로 이주 (16GB RAM)

아이디어: M2 노트북(8GB?) → M1 맥미니(16GB)로 옮기면 해결!

# M1 맥미니에서 동일한 VirtualBox 실행 시도
cd /Users/irix/epix/_Lecture_prom_learning.kit-main/ch2/2.4
vagrant up --provider=virtualbox
 
# ❌ 실패!
# Error: VirtualBox on ARM64 compatibility issues

🔄 ARM64 가상화 호환성 디깅 여정

환경하이퍼바이저메모리호환성헤드리스결과
M2 노트북VirtualBox8GB?⚠️ 메모리 부족
M1 맥미니VirtualBox16GB-ARM64 이슈
M1 맥미니VMware Fusion16GB✅ 최종 선택

🔍 근본 원인 분석

1. ARM64 가상화의 현실

ARM64 (Apple Silicon) 가상화 스택:
┌─────────────────────────────────────┐
│ macOS (ARM64)                       │
├─────────────────────────────────────┤
│ Hypervisor Framework                │
├─────────────────────────────────────┤
│ VirtualBox / VMware / Parallels     │ ← 호환성 차이!
├─────────────────────────────────────┤
│ Guest OS (Ubuntu ARM64)             │
└─────────────────────────────────────┘

VirtualBox의 ARM64 지원 상황:

  • M1 (2020-2021): 베타 수준, 불안정 😰
  • M2 (2022+): 점진적 개선, 여전히 버그 있음 ⚠️
  • M3 (2023+): 안정화 단계 ✅

2. 메모리 압박 문제

# M2 노트북 메모리 상황 (추정)
Total: 8GB
  - macOS System: ~3GB
  - Chrome/Apps: ~2GB
  - Available: ~3GB
 
# Kubernetes 클러스터 요구사항
  - CP: 2GB
  - Worker × 3: 6GB
  - Total: 8GB (오버!)

3. VMware Fusion의 트레이드오프

장점:

  • M1 ARM64 네이티브 지원
  • 안정적인 메모리 관리
  • 16GB 충분히 활용 가능

단점:

  • 헤드리스 모드 불가 (GUI 필수)
  • 백그라운드 실행 제한

✅ 최종 결정: M1 맥미니 + VMware Fusion

# M1 맥미니에서 VMware Fusion 사용
cd /Users/irix/epix/_Lecture_prom_learning.kit-main/ch2/2.4
vagrant up --provider=vmware_desktop
 
# ✅ 성공!
# - 16GB 메모리로 4대 VM 안정적 구동
# - ARM64 네이티브 지원
# - 메모리 스왑 없이 쾌적하게 작동

헤드리스 모드 시도 및 실패

# Vagrantfile에서 시도
config.vm.provider "vmware_desktop" do |v|
  v.gui = false
  v.vmx["headless"] = "TRUE"
end

결과: ❌ 모두 무시됨

  • VMware Fusion on ARM64는 헤드리스 시도는 현상황에서 실패
  • GUI 창 4개가 항상 화면에 표시됨 (최소화 해두고 사용하기 )
  • 백그라운드 실행 불가능

💡 교훈: ARM64 가상화의 고질적 문제들

1. 메모리 계획의 중요성

실습 환경 메모리 계산:
┌──────────────────────────────────────┐
│ Kubernetes 클러스터 (최소)           │
│ - Control Plane: 2GB                 │
│ - Worker Node × 3: 2GB × 3 = 6GB    │
│ - Total VM: 8GB                      │
├──────────────────────────────────────┤
│ 호스트 OS 오버헤드                   │
│ - macOS: 3GB                         │
│ - 앱들: 2GB                          │
│ - Buffer: 1GB                        │
│ - Total Host: 6GB                    │
├──────────────────────────────────────┤
│ 권장 메모리: 14GB 이상               │
│ 안전한 메모리: 16GB 이상 ⭐          │
└──────────────────────────────────────┘

결론: 8GB 노트북으로는 4-node 클러스터 불가능!

2. ARM64 하이퍼바이저 호환성 매트릭스

하이퍼바이저M1 (2020)M2 (2022)M3 (2023)헤드리스비용
VirtualBox❌ 불안정⚠️ 개선중✅ 안정무료
VMware Fusion✅ 안정✅ 안정✅ 안정무료
Parallels Desktop✅ 최상✅ 최상✅ 최상유료
UTM⚠️ 느림⚠️ 느림⚠️ 느림무료

핵심 인사이트:

  • ARM64 가상화는 여전히 발전중인 기술
  • 칩셋 세대별로 호환성이 크게 다름
  • “무료 + 안정 + 헤드리스” 조합은 아직 없음

3. 실전 가상화 환경 선택 기준

나의 상황 → 최적 선택:
┌─────────────────────────────────────────┐
│ M1/M2 + 메모리 8GB                      │
│ → 클러스터 축소 (1 CP + 1 Worker)       │
│   또는 클라우드 사용 (GKE, EKS)        │
├─────────────────────────────────────────┤
│ M1 + 메모리 16GB + 안정성 우선          │
│ → VMware Fusion (GUI 감수) ⭐           │
├─────────────────────────────────────────┤
│ M2/M3 + 메모리 16GB + 헤드리스 필수     │
│ → VirtualBox (안정화 확인 후)           │
├─────────────────────────────────────────┤
│ 예산 있음 + 최고 성능                   │
│ → Parallels Desktop Pro                 │
├─────────────────────────────────────────┤
│ 프로덕션 학습                           │
│ → 클라우드 (실제 환경과 동일)          │
└─────────────────────────────────────────┘

4. 이 삽질에서 얻은 것

기술적 이해:

  • ARM64 아키텍처의 가상화 제약사항
  • 하이퍼바이저별 성숙도 차이
  • 메모리 오버헤드 계산 방법

실무 교훈:

  • 로컬 개발 환경의 한계 인식
  • 클라우드 마이그레이션 시점 판단
  • 하드웨어 투자 vs 클라우드 비용 트레이드오프

🔴 Issue #1: OrbStack 설치 실패

💥 문제 상황

brew install orbstack
# Error: This software does not run on macOS versions older than Sonoma.

🔍 원인

  • 현재 macOS 버전이 Sonoma 미만
  • OrbStack은 macOS Sonoma 이상만 지원

✅ 해결책

# Vagrant + VMware Fusion 조합으로 대체
cd /Users/irix/epix/_Lecture_prom_learning.kit-main/ch2/2.4
vagrant up

교훈: 최신 도구의 시스템 요구사항을 항상 먼저 확인하기


🔴 Issue #2: Vagrant VM 시작 실패 ⚠️

💥 문제 상황

vagrant reload
# Error: The operation was canceled
# Command: ["-T", "fusion", "start", "...", "nogui"]

🔄 시도한 방법들

시도명령어결과
1️⃣vagrant reload❌ VMware vmrun 에러
2️⃣vagrant halt && vagrant up❌ 동일 에러
3️⃣vagrant destroy -f && vagrant up✅ 성공

🔍 근본 원인

  • VMware Fusion의 VM 상태 잠금 문제
  • 네트워크 어댑터 초기화 실패
  • 기존 프로세스의 파일 핸들 미해제

✅ 최종 해결책

# 완전 초기화 후 재생성
vagrant destroy -f
vagrant up
 
# VM 상태 확인
vagrant status

베스트 프랙티스
VM 상태 이슈 발생 시:

  1. vagrant haltvagrant up (소프트 리셋)
  2. vagrant reload (VM 재시작)
  3. vagrant destroy -fvagrant up (완전 재생성) ⭐ 가장 확실

🔴 Issue #3: Helm 명령어 Zsh 파싱 에러

💥 문제 상황

helm install prometheus edu/prometheus \
  --set nodeExporter.tolerations[0].key="node-role.kubernetes.io/master"
 
# zsh: no matches found: nodeExporter.tolerations[0].key=...

🔍 원인

  • Zsh에서 [] 문자를 글로빙 패턴으로 해석
  • Bash와 다른 파싱 동작

✅ 해결책

# 방법 1: 백슬래시 이스케이프
--set nodeExporter.tolerations\[0\].key="node-role.kubernetes.io/master"
 
# 방법 2: 작은따옴표로 감싸기 (추천)
--set 'nodeExporter.tolerations[0].key=node-role.kubernetes.io/master'
 
# 방법 3: values.yaml 파일 사용
cat > values.yaml << 'YAML'
nodeExporter:
  tolerations:
    - key: node-role.kubernetes.io/master
      effect: NoSchedule
      operator: Exists
YAML
 
helm install prometheus edu/prometheus -f values.yaml

Zsh vs Bash

  • Zsh: [] → 글로빙 패턴 (에러 발생)
  • Bash: [] → 일반 문자 (정상 동작)

해결: 항상 따옴표 사용하기!


🔴 Issue #4: kubectl 접근 불가 (kubeconfig 미설정) ⭐

💥 문제 상황

kubectl get po,svc -n monitoring
 
# The connection to the server localhost:8080 was refused
# E1203 23:49:24.398515 memcache.go:265 "Unhandled Error"
# err="couldn't get current server API group list:
# Get \"http://localhost:8080/api?timeout=32s\":
# dial tcp [::1]:8080: connect: connection refused"

🔍 진단 과정

# 1. kubeconfig 파일 확인 시도
cat ~/.kube/config
# cat: /Users/irix/.kube/config: No such file or directory
 
# 2. 디렉토리 존재 확인
ls -la ~/.kube
# ls: /Users/irix/.kube: No such file or directory

근본 원인: ~/.kube 디렉토리 자체가 존재하지 않음!

✅ 완벽한 해결 과정

# Step 1: .kube 디렉토리 생성
mkdir -p ~/.kube
 
# Step 2: Control Plane에서 admin.conf 가져오기
vagrant ssh cp-k8s-1.30.3 -c "sudo cat /etc/kubernetes/admin.conf" > ~/.kube/config
 
# Step 3: 파일 권한 설정 (보안)
chmod 600 ~/.kube/config
 
# Step 4: 접속 테스트
kubectl cluster-info
kubectl get nodes
kubectl get po,svc -n monitoring

✅ 검증 결과

NAME                                                 READY   STATUS    RESTARTS   AGE
pod/prometheus-kube-state-metrics-67b6f4659b-zltbm   1/1     Running   0          10m
pod/prometheus-node-exporter-6c55d                   1/1     Running   0          10m
pod/prometheus-node-exporter-kdhnn                   1/1     Running   0          10m
pod/prometheus-node-exporter-m9d7m                   1/1     Running   0          10m
pod/prometheus-server-549cf9857b-vgqrt               2/2     Running   0          10m
 
NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)        AGE
service/prometheus-kube-state-metrics   ClusterIP      10.101.181.165   <none>         8080/TCP       10m
service/prometheus-node-exporter        ClusterIP      None             <none>         9100/TCP       10m
service/prometheus-server               LoadBalancer   10.107.76.65     192.168.1.11   80:31160/TCP   10m

성공 지표

  • ✅ 모든 Pod가 Running 상태
  • ✅ Prometheus Server가 LoadBalancer로 노출
  • ✅ External IP 할당됨: 192.168.1.11
  • ✅ 브라우저 접속 가능: http://192.168.1.11

📊 최종 인프라 구성

🖥️ 클러스터 정보

Cluster Name: k8s-1.30.3
Kubernetes Version: v1.30.3
 
Nodes:
  Control Plane:
    - Hostname: cp-k8s-1.30.3
    - IP: 192.168.1.10
    - Role: master
 
  Workers:
    - Hostname: w1-k8s-1.30.3
      IP: 192.168.1.11
      Role: worker
 
    - Hostname: w2-k8s-1.30.3
      IP: 192.168.1.12
      Role: worker
 
    - Hostname: w3-k8s-1.30.3
      IP: 192.168.1.13
      Role: worker

🔧 설치된 컴포넌트

컴포넌트버전용도
Calicov3.28CNI (네트워크)
MetalLBv0.14LoadBalancer
NGINX Ingressv1.11Ingress Controller
Metrics Serverv0.7리소스 메트릭
NFS Provisionerv4.0동적 볼륨 프로비저닝

📈 Prometheus 스택

Prometheus Server:
  Type: LoadBalancer
  External IP: 192.168.1.11
  Port: 80 → 9090
 
Node Exporter:
  Type: DaemonSet
  Pods: 3 (모든 Worker 노드)
  Metrics: 시스템 메트릭 수집
 
Kube State Metrics:
  Type: Deployment
  Purpose: Kubernetes 리소스 상태 메트릭
 
Configuration:
  scrape_interval: 15s
  evaluation_interval: 15s
  pushgateway: disabled
  alertmanager: disabled

💡 학습한 교훈

0️⃣ 메모리 부족 → 하드웨어 마이그레이션의 함정 🍎

삽질의 전체 흐름:

  1. M2 노트북(8GB)에서 시작 → 메모리 부족으로 VM 끊김
  2. M1 맥미니(16GB)로 이동 시도 → VirtualBox ARM64 호환성 문제
  3. VMware Fusion으로 해결 → 헤드리스 모드 불가 발견
  4. GUI 4개 창 감수하고 진행 → 최종 성공

핵심 교훈:

하드웨어 문제 해결 시 고려사항:
┌─────────────────────────────────────────┐
│ 1. 메모리는 항상 여유있게 (최소 2배)   │
│ 2. ARM64는 아직 x86_64만큼 성숙 안 됨  │
│ 3. 하이퍼바이저 호환성은 칩셋마다 다름 │
│ 4. 헤드리스는 필수가 아니면 포기 고려  │
└─────────────────────────────────────────┘

ARM64 가상화의 현실:

  • M1 (2020): VirtualBox 불안정, VMware 안정
  • M2 (2022): VirtualBox 개선중, VMware 안정
  • M3 (2023): VirtualBox 안정화 시작
  • 결론: 무료로 안정적인 헤드리스 환경은 아직 없음!

1️⃣ Vagrant VM 관리 전략

핵심 원칙:

  • 🔄 vagrant reload: 설정 변경 시
  • 🔄 vagrant haltvagrant up: 일반적인 재시작
  • 💥 vagrant destroy -fvagrant up: 상태 불일치 발생 시 (가장 확실)

2️⃣ Zsh 환경에서의 안전한 명령어 작성

# ❌ 위험: 대괄호가 글로빙 패턴으로 해석
--set array[0].value=something
 
# ✅ 안전: 작은따옴표로 감싸기
--set 'array[0].value=something'
 
# ✅ 안전: 백슬래시 이스케이프
--set array\[0\].value=something
 
# ✅ 가장 안전: values 파일 사용
helm install -f values.yaml

3️⃣ kubectl 설정 체크리스트

# 1. kubeconfig 파일 존재 확인
ls -la ~/.kube/config
 
# 2. 내용 확인
kubectl config view
 
# 3. 현재 컨텍스트 확인
kubectl config current-context
 
# 4. 클러스터 연결 테스트
kubectl cluster-info
 
# 5. API 서버 접근 테스트
kubectl get nodes

치명적 실수 방지
localhost:8080 에러 = kubeconfig 미설정!

해결:

mkdir -p ~/.kube
vagrant ssh cp-k8s -c "sudo cat /etc/kubernetes/admin.conf" > ~/.kube/config
chmod 600 ~/.kube/config

🔍 유용한 디버깅 명령어

Prometheus 상태 확인

# 전체 리소스 확인
kubectl get all -n monitoring
 
# Prometheus Server 로그
kubectl logs -n monitoring deployment/prometheus-server -c prometheus-server
 
# Node Exporter 로그 (특정 노드)
kubectl logs -n monitoring daemonset/prometheus-node-exporter
 
# 서비스 엔드포인트 확인
kubectl get endpoints -n monitoring
 
# Prometheus ConfigMap 확인
kubectl get cm -n monitoring prometheus-server -o yaml

네트워크 디버깅

# LoadBalancer IP 확인
kubectl get svc -n monitoring prometheus-server
 
# MetalLB 상태 확인
kubectl get ipaddresspool -n metallb-system
kubectl logs -n metallb-system deployment/controller
 
# 직접 curl 테스트
curl http://192.168.1.11/api/v1/status/config
 
# 포트 포워딩으로 로컬 접속
kubectl port-forward -n monitoring svc/prometheus-server 9090:80
# 접속: http://localhost:9090

VM 상태 확인

# Vagrant 전체 상태
vagrant status
 
# 특정 VM SSH 접속
vagrant ssh cp-k8s-1.30.3
 
# VM 내부에서 클러스터 상태 확인
vagrant ssh cp-k8s-1.30.3 -c "kubectl get nodes"
 
# 네트워크 확인
vagrant ssh cp-k8s-1.30.3 -c "ip addr show"

📌 다음 단계 (TODO)

  • Grafana 대시보드 구성

    • Prometheus 데이터소스 연결
    • Kubernetes 클러스터 대시보드 임포트
    • Node Exporter 대시보드 설정
  • AlertManager 설정

    • 알림 규칙 작성
    • Slack/Email 통합
    • 알림 라우팅 구성
  • Custom Metrics 추가

    • 애플리케이션 메트릭 수집
    • ServiceMonitor 리소스 생성
    • 커스텀 대시보드 작성
  • Prometheus Rules 작성

    • Recording Rules (집계)
    • Alerting Rules (경고)
  • 장기 스토리지 고려

    • Thanos 또는 Cortex 검토
    • S3 백엔드 구성

🔗 관련 문서

내부 링크

외부 참고 자료


📊 작업 통계

항목수치
총 소요 시간~4시간
해결한 이슈5개 (VirtualBox M1 포함)
생성된 VM4대
배포된 Pod5개
재시작 횟수3회
성공률100% ✅

🎯 핵심 요약

TL;DR: 진짜 삽질의 여정 0. ⚠️ M2 노트북(8GB) 메모리 부족 → VM 끊김 반복

  1. 💡 M1 맥미니(16GB)로 이동 시도 → ARM64 VirtualBox 호환성 없음
  2. ✅ VMware Fusion 선택 → 헤드리스 불가 감수
  3. ❌ OrbStack 실패 → Vagrant로 대체
  4. ❌ VM 시작 실패 → vagrant destroy -f 후 재생성
  5. ❌ Zsh 파싱 에러 → 따옴표로 감싸기
  6. ❌ kubeconfig 없음 → mkdir ~/.kube + admin.conf 복사

최종 결과: Prometheus @ http://192.168.1.11

가장 큰 교훈:

  • 8GB 메모리로는 4-node 클러스터 불가능
  • ARM64 가상화는 아직 발전중 (무료 헤드리스 없음)
  • 하드웨어 제약은 클라우드로 해결 고려

작성자: irix
마지막 업데이트: 2025-12-03 23:55:00 KST
상태: ✅ 해결 완료
난이도: ⭐⭐⭐ (중)


kubernetes prometheus troubleshooting vagrant devops monitoring