kokbee-Hive
article thumbnail

Kubernetes(K8s)에서 OOM(Out of Memory) kill은 메모리 부족으로 인해 컨테이너가 종료되는 상황을 말한다.

위와 같이 pod 조회를 하면 상태가 OOMKilled 라고 표시된다.
OOM kill은 Linux 운영 체제에서 발생하는 현상으로, K8s는 Linux 컨테이너를 기반으로 동작하기 때문에 이러한 상황이 발생할 수 있다고 한다.

 

 

 

 

그럼 메모리가 부족하게 경우는 뭘까?

이유는 아래와 같다.

  1. Pod에 설정된 메모리보다 더 많은 메모리를 사용할 때
  2. Node에서 가용할 메모리가 없을 때
  3. 메모리 누수가 발생할 경우

 

 

그럼 k8s가 이과정을 실행하는 것 인가?

누가 OOM kill을 수행하는지에 대해서는, Kubernetes 자체적으로 OOM kill을 수행하지는 않는다.
OOM kill은 Linux 운영 체제의 커널이 수행하는 동작이며, 메모리 부족 상황에서 컨테이너를 종료시킨다.

 

 

 

 

발생하는 상황에서의 해결방법은 무엇인가?

간단하게 생각하면, 요청 자체를 잘파악해서 메모리 상한을 잘 조절해주면 된다.

하지만 그렇게만 생각하면 불필요한 리소스를 낭비할 수 있기에,  파드 QoS 클래스 조건을 맞춰서 조절해주는게 베스트다.

 

파드의 QoS 클래스 조건

BestEffort 리소스 요청과 상한 설정을 하지 않은 경우
Bustable BestEffort와 Guaranteed 이외의 경우
Guaranteed - CPU와 메모리 둘 다 Limits가 설정할 경우
- 파드 안의 각각의 컨테이너에 설정할 경우
- CPU와 메모리 설정을 하면서 요청 설정값과 상한 설정값을 같게 설정할 경우


QoS는 어떻게 이용되는가?

가장 우선순위가 낮은것부터 kill 이된다. 

  1. BestEffort
  2. Burstable
  3. Guranteed: 시스템이 메모리를 필요로 하는 경우에만 kill

따라서 BestEffort가 먼저 kill이 된다.

만일 동일한 QoS의 경우 OOM Score에 따라 어떤 프로세스를 kill할지 비교해서 정한다.

 

 

결론

리소스가 부족하여 파드가 삭제될 때의 순서가 정해지므로, 적절한 QoS를 기준으로 리소스를 하는 것이 좋아보임

profile

kokbee-Hive

@콕비

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!