1️⃣ 개요
쿠버네티스에서 Pod의 리소스 관리는 원활한 운영을 위해 필수적인 요소입니다. 단순히 Pod를 배포하는 것만으로 끝이 아니라, 적절한 CPU와 메모리 설정을 하지 않으면 리소스를 과도하게 사용하거나 OOM(Out of Memory) 오류로 인해 컨테이너가 비정상적으로 종료되는 문제를 겪을 수 있습니다.
실무에서는 리소스를 효과적으로 설정하는 것이 중요하며, 적절한 요청(requests)과 제한(limits) 값을 설정하지 않으면 클러스터의 전체적인 안정성을 해칠 수도 있습니다. 저 역시 처음 쿠버네티스를 운영할 때, Pod가 정상적으로 배포되었지만 예상치 못한 OOM 오류로 서비스가 중단되는 경험을 했습니다.
이 글에서는 Pod의 CPU 및 메모리 관리 원리와 OOM 오류의 원인과 해결 방법을 정리해 보겠습니다.
2️⃣ Kubernetes에서 Pod의 리소스 관리 원리
쿠버네티스에서는 Pod가 사용할 수 있는 CPU 및 메모리를 제어하기 위해 requests와 limits 설정을 지원합니다.
✅ 1. 리소스 요청(Requests)과 제한(Limits)의 개념
설정 값 설명
requests | Pod가 실행될 때 보장받아야 하는 최소한의 리소스 |
limits | Pod가 사용할 수 있는 최대 리소스 (초과 시 강제 종료) |
📌 예제: 리소스 요청 및 제한 설정
apiVersion: v1
kind: Pod
metadata:
name: resource-limited-pod
spec:
containers:
- name: my-container
image: my-app:v1
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
✅ requests.memory: 최소 256Mi 메모리가 필요
✅ limits.memory: 512Mi 이상 사용하려 하면 OOM 발생
3️⃣ OOM(Out of Memory) 오류 원인 및 해결 방법
OOM(Out of Memory) 오류는 Pod가 할당된 메모리를 초과하여 사용하려 할 때 발생합니다.
이 오류가 발생하면 컨테이너가 강제 종료되며, kubectl describe pod <pod-name> 실행 시 "OOMKilled" 상태를 확인할 수 있습니다.
OOM 발생의 주요 원인과 해결 방법을 정리해 보겠습니다.
🚨 [문제 1] limits 값이 너무 낮게 설정됨
• 증상:
• kubectl describe pod <pod-name> 실행 시 "OOMKilled" 메시지가 출력됨
• kubectl logs <pod-name>에서 “Killed” 메시지 확인
• 원인:
• limits.memory 값이 너무 낮게 설정되어 있어, Pod가 정상적으로 동작하지 못함.
• 메모리 제한을 초과하면 쿠버네티스가 OOM 이벤트를 감지하고 컨테이너를 강제 종료(OOMKilled) 함.
• 해결 방법:
• limits.memory 값을 증가시켜 Pod가 충분한 메모리를 사용할 수 있도록 조정
• kubectl top pod 명령어를 활용해 현재 메모리 사용량을 모니터링한 후 적절한 값 설정
📌 예제: 메모리 제한을 올려 해결
resources:
requests:
memory: "512Mi"
limits:
memory: "1Gi"
🚨 [문제 2] 메모리 누수 (Memory Leak)로 인한 OOM
• 증상:
• 특정 시간이 지나면 Pod의 메모리 사용량이 계속 증가
• kubectl top pod 실행 시 점진적으로 메모리 사용량 증가
• 원인:
• 애플리케이션에서 불필요한 객체 할당이 지속적으로 발생하여 메모리가 해제되지 않음.
• 특정한 작업을 반복 실행할 때 Garbage Collection이 제대로 수행되지 않음.
• 해결 방법:
• 애플리케이션의 메모리 관리 코드 점검 (Node.js, Java, Python 등 GC 관리 방식 확인)
• livenessProbe와 readinessProbe 설정하여 메모리 누수 발생 시 자동 복구
• kubectl logs와 Prometheus + Grafana 등을 활용해 메모리 사용량을 지속적으로 모니터링
📌 예제: livenessProbe 설정으로 메모리 누수 시 자동 복구
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 3
periodSeconds: 5
🚨 [문제 3] 리소스 경합으로 인해 OOM 발생
• 증상:
• 동일한 노드에서 여러 개의 리소스 집약적인 Pod가 배포됨.
• 노드의 CPU/메모리 사용량이 과도하게 높아짐 (kubectl top nodes 실행).
• 원인:
• 특정 Pod가 과도한 리소스를 사용하여 다른 Pod가 메모리 부족 상태에 빠짐.
• 우선순위가 높은 Pod가 실행될 공간을 확보하기 위해 기존 Pod가 종료됨.
• 해결 방법:
• QoS(Quality of Service) 정책을 활용하여 중요한 Pod를 우선 보호
• CPU/메모리 제한을 명확히 설정하여 특정 Pod가 과도한 리소스를 소비하지 않도록 조정
📌 예제: priorityClass 설정을 통해 중요한 Pod 우선 배포
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for critical workloads."
4️⃣ OOM 방지를 위한 모니터링 및 최적화 방법
✅ 1. 실시간 리소스 모니터링 (kubectl top)
📌 Pod별 CPU & 메모리 사용량 확인
kubectl top pod
📌 클러스터 전체 노드 리소스 확인
kubectl top node
✅ 2. Prometheus + Grafana를 활용한 메모리 모니터링
• Prometheus Metric으로 Pod의 메모리 사용량을 추적
• Grafana에서 OOM 발생 전 경고(Alerting) 설정
✅ 3. Vertical Pod Autoscaler (VPA) 활용하여 자동 조정
• VPA를 사용하면 Pod의 리소스 요청/제한을 자동으로 최적화
• 설정 후 Pod의 CPU/메모리 사용량을 감지하여 조정 가능
📌 예제: VPA 설정
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: my-app
updatePolicy:
updateMode: "Auto"
🔥 5️⃣ 결론
✔ Pod의 requests & limits 설정을 올바르게 구성하면 OOM 오류를 방지할 수 있습니다.
✔ 실시간 모니터링(kubectl top, Prometheus)을 통해 메모리 사용량을 체크하는 것이 중요합니다.
✔ 애플리케이션이 메모리 누수를 일으키지 않도록 코드 최적화를 병행해야 합니다.
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [Pod 심화편 #4] Pod의 장애 복구 및 자동 재시작 전략 (0) | 2025.03.12 |
---|---|
📌 [Pod 심화편 #3] Pod의 네트워크 문제와 디버깅 방법 (0) | 2025.03.12 |
📌 [Pod 심화편 #1] Pod의 생성과 스케줄링 원리 (0) | 2025.03.12 |
Kubernetes 리소스 시리즈 #18: Helm (패키지 관리 및 배포 자동화) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #17: Operator (확장 및 기타 리소스) (0) | 2025.03.05 |