OOM(Out of Memory) Killed는 쿠버네티스 클러스터 내에서 일부 컨테이너에 할당된 가용 메모리의 한계가 초과되어 시스템이 해당 컨테이너를 강제로 종료시키는 상황을 의미합니다.
이는 컨테이너에서 사용하는 메모리가 할당량 대비 지나치게 많거나 충분하지 않은 메모리 제한을 두었을 때 발생할 수 있습니다. 쿠버네티스는 컨테이너에서 OOM Killed 이벤트가 감지되면 같은 업무를 수행하는 Pod를 빠르게 재배포하여 기존 컨테이너의 서비스가 중단되지 않도록 합니다.
OOM Killed가 발생하는 주요 원인과 해결 방법을 알아보겠습니다.
apiVersion:apps/v1kind:Deploymentmetadata:name:example-deploymentspec:replicas:1selector:matchLabels:app:example-apptemplate:metadata:labels:app:example-appspec:containers:-name:example-containerimage:your_container_image:latestresources:requests:memory:"100Mi"# 메모리 요청 (request)limits:memory:"120Mi"# 메모리 제한 (limit)
위 예시에서는 example-deployment라는 이름의 Deployment를 생성할 때 resources 항목 아래 requests에서 컨테이너가 실행되기 위한 최소 메모리를 ‘100Mi’로 지정했습니다. 그러면 ‘100Mi’의 여유가 있는 노드에 Deployment가 배정되게 됩니다.
resources 항목 아래 limits는 위에서 Deployment 된 컨테이너가 사용할 수 있는 최대 메모리 설정입니다. ‘120Mi’로 설정하였기 때문에 컨테이너가 이를 초과할 수 없습니다.
여기서 limits에 설정된 값이 실제 애플리케이션이 필요로 하는 메모리 대비 부족하다면 OOM Killed가 발생할 수 있습니다. OOM Killed가 얼마나 자주 발생하는지, 현재 설정이 적절하게 자원이 배정된 것인지 등을 모니터링 하면 쿠버네티스의 자원을 획기적으로 관리할 수 있습니다.
애플리케이션의 메모리 누수는 OOM Killed의 주요 원인 중 하나입니다. 메모리 누수는 보통 메모리를 사용한 후 반환하는 과정에 오류가 있어, 사용 중인 메모리가 계속 불어나게 되는 현상입니다.
이는 점차 잠식되다 결국 시스템 자원을 모두 소모하게 됩니다. 메모리 누수를 수정하지 않으면 애플리케이션이 지속적으로 더 많은 메모리를 요청하여 OOM Killed 상태에 빠질 수 있습니다. 정기적인 모니터링과 트랜잭션 트레이스로 메모리 누수를 찾아내고 수정하는 것이 중요합니다.
Deployment의 requests 및 limit 확인에서 컨테이너의 자원 할당량을 설정하는 방법을 알려드렸습니다. 그런데 resources 항목 자체를 정의하지 않았다면 어떤 일이 발생할까요?
apiVersion:apps/v1kind:Deploymentmetadata:name:example-deploymentspec:replicas:1selector:matchLabels:app:example-apptemplate:metadata:labels:app:example-appspec:containers:-name:example-containerimage:your_container_image:latest
이러한 상태는 쿠버네티스가 컨테이너들 간에 자원과 리소스 제한을 할 수 없게 됩니다.
컨테이너는 노드의 모든 사용 가능한 메모리를 사용하려고 할 수 있습니다. 이때 컨테이너가 메모리를 끊임없이 점유하려 한다면 노드 전체 성능에 영향을 미칠 수 있는 상황으로 번질 수 있습니다. 따라서 쿠버네티스에서는 컨테이너의 리소스 요청(requests)과 제한(limit)을 적절히 설정하는 것이 중요합니다.
메모리 요구 사항과 애플리케이션의 특성을 고려하여 적절한 값을 지정하면, 리소스 사용의 예측 가능성이 높아지고 OOM Killed와 같은 문제를 미리 방지할 수 있습니다.
와탭 쿠버네티스 모니터링을 이용하여 컨테이너 맵을 관찰해보면 전체 클러스터의 다양한 자원 사용량을 한눈에 파악할 수 있습니다. 이번에는 컨테이너의 메모리 사용량에 대해 모니터링해보겠습니다.
이미지에 표시된 컨테이너 맵 내 2가지 버튼을 클릭하여 모니터링 할 자원을 선택해보겠습니다.
목록에서 리소스를 선택합니다.
선택된 리소스의 임계치(%) 지정할 수 있습니다.
이 상태에서 Namespace로 그룹화까지 하면 업무 단위로 컨테이너 메모리 사용량을 명확하게 파악할 수 있습니다.