Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Medium Level #17] 쿠버네티스 클러스터에서 발생하는 OutOfMemory(OOM) 문제 해결

ygtoken 2025. 3. 17. 12:02
728x90

 

쿠버네티스 환경에서 Pod이 과도한 메모리를 사용하여 OOM(Out of Memory) 문제가 발생하면, 애플리케이션이 강제 종료되거나 클러스터 전체의 안정성이 저하될 수 있습니다.

이 글에서는 OOM 문제의 원인을 분석하고, 리소스 요청(Request) 및 제한(Limit) 설정을 통해 이를 방지하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1. Pod이 과도한 메모리를 사용하여 OOMKilled 상태가 되는 문제 해결

2. 리소스 요청 및 제한을 설정하여 메모리 사용량을 제어하는 방법

3. kubectl 및 메모리 사용량 모니터링 도구를 활용한 트러블슈팅 방법

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ Pod이 과도한 메모리를 사용하여 OOMKilled 상태가 되는 문제 해결

 

❓ 문제 상황

 

운영팀에서 애플리케이션이 실행 중 갑자기 종료되며, kubectl describe pod 명령어를 실행해보니 “OOMKilled” 상태가 발생했습니다.

이는 Pod이 할당된 메모리보다 더 많은 메모리를 사용하여 커널이 프로세스를 강제 종료했기 때문입니다.

문제 발생 Pod: high-memory-app

원인: 리소스 제한(Limit)이 없고, 메모리 사용량이 폭증

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. kubectl describe pod 명령어를 사용하여 OOMKilled 상태를 확인합니다.

 

2. kubectl logs 명령어를 활용하여 애플리케이션의 로그를 분석합니다.

 

3. 메모리 사용량을 제한하도록 Pod의 리소스 제한(Limit)을 설정합니다.

 


✅ OOMKilled 상태 확인 및 원인 분석

 

🔹 OOMKilled 상태 확인

kubectl describe pod high-memory-app

 

💡 예상 출력 값

State:        Terminated
Reason:       OOMKilled
Exit Code:    137

 

🔹 애플리케이션 로그 분석

kubectl logs high-memory-app

 

💡 예상 출력 값

Error: process out of memory

OOMKilled 상태가 발생한 Pod을 확인하고, 원인을 분석함

 


2️⃣ 리소스 요청 및 제한을 설정하여 메모리 사용량을 제어하는 방법

 

❓ 문제 상황

 

운영팀에서 OOMKilled 문제를 방지하기 위해 애플리케이션의 메모리 사용량을 제어해야 합니다.

이를 위해 Pod의 리소스 요청(Request) 및 제한(Limit)을 설정하여, 허용된 메모리 범위 내에서 실행되도록 해야 합니다.

Pod의 최소 요청 메모리: 512Mi

Pod의 최대 사용 가능 메모리: 1Gi

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. resources.requests를 설정하여 기본적으로 보장할 메모리 크기를 지정합니다.

 

2. resources.limits를 설정하여 최대 사용할 수 있는 메모리를 제한합니다.

 


✅ 정답 Manifest (리소스 제한 설정)

 

🔹 OOMKilled 문제 방지를 위한 리소스 제한 적용

apiVersion: v1
kind: Pod
metadata:
  name: high-memory-app
spec:
  containers:
  - name: memory-intensive
    image: python:3.9
    command: ["python", "-c", "a = ' ' * 1024 * 1024 * 900"]
    resources:
      requests:
        memory: "512Mi"
      limits:
        memory: "1Gi"

이제 Pod은 최대 1Gi까지만 메모리를 사용하도록 제한됨

 


📌 적용 후 예상 결과 값

 

1. Pod의 리소스 설정 확인

kubectl describe pod high-memory-app

 

💡 예상 출력 값

Limits:
  memory: 1Gi
Requests:
  memory: 512Mi

Pod이 메모리 사용량을 제한하여 OOMKilled 문제를 방지할 수 있음

 


3️⃣ kubectl 및 메모리 사용량 모니터링 도구를 활용한 트러블슈팅 방법

 

❓ 문제 상황

 

운영팀에서 현재 실행 중인 Pod들의 메모리 사용량을 확인하고, OOMKilled 문제가 발생할 가능성이 있는 Pod을 사전에 점검해야 합니다.

kubectl 및 Prometheus를 활용하여 현재 메모리 사용량을 모니터링하고 이상 징후를 감지해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. kubectl top pod 명령어를 사용하여 실시간으로 메모리 사용량을 조회합니다.

 

2. Prometheus 및 Grafana를 활용하여 장기적인 메모리 사용량을 모니터링합니다.

 


✅ 실시간 메모리 사용량 확인 명령어

 

🔹 현재 Pod의 메모리 사용량 조회

kubectl top pod

 

💡 예상 출력 값

NAME                  CPU(cores)   MEMORY(bytes)
high-memory-app       100m         900Mi
web-app               50m          200Mi

 

🔹 특정 Pod의 상세 리소스 사용량 확인

kubectl describe pod high-memory-app

 

💡 예상 출력 값

Limits:
  memory: 1Gi
Requests:
  memory: 512Mi
Usage:
  memory: 900Mi

현재 실행 중인 Pod들의 메모리 사용량을 모니터링하여 OOM 위험을 사전에 감지 가능

728x90