본문 바로가기

Develop/DevOps

[Kubernetes] OOM관련 내용 정리하기 (singleprocessOOMKill)

반응형

 

쿠버네티스를 사용하면서 resources를 효율적으로 사용하기 위해 requests, limits을 적용하여 사용하는 경우가 많을텐데. 가끔 의도치않게 메모리를 많이 먹는 작업을 하게 되어 OOMKilled가 발생하여 해당 pod내부에서 설치한(또는 저장한) 요소들이 다 날라가는 경우가 있다.

 

만일 "OOM이 발생하면 Pod(Container)가 내려가는것이 아닌 OOM을 유발한 프로세스만 종료시킬순없을까?" 라는 궁금증에서 조사했고. 다음과같은 결과가 나왔다.

 

쿠버네티스에서는 Pod을 생성할 때, resource를 설정하게 된다면 pod이 생성되는 노드에 아래와같은 예시 경로로 cgroup설정 파일들이 생성되게 됨.

  • /sys/fs/cgroup/kubepods_slice/kubepods-burstable.slice/kubepods-burstable-pod{HASH-ID}.slice/cri-containerd-{CONTAINER-ID}
    • resource.limit을 설정하게되면 burstable 경로에 생성되고, 설정하지않으면 besteffort라는 경로에 생성된다.

해당 경로에 들어가게 되면, memory.oom.group이라는 파일이 존재하는데, 기본적으로 1로 세팅되어있다.

  • 1로 설정 할 경우: OOM인 상황이 발생하면 cgroup에 존재하는 모든 프로세스(컨테이너)를 내리게됨
  • 0으로 설정 할 경우: OOM인 상황이 발생하면 OOM을 유발하는 프로세스만 종료하게됨.

따라서, 만약에 해당 파일(memory.oom.group)내용을 1이 아닌 0으로 수정하게된다면, 이 글의 처음에 시작한 궁금증이 해결된다.

하지만, 매번 이렇게 일일이 수정하는 번거로움이 존재하고 또한 수정을 위해서는 사용자에게 높은 권한(privileged)을 부여하여 적용하기가 어렵다.

memory.oom.group내용을 0으로 수정하고 프로그램을 실행하면 OOM을 유발하는 프로세스만 죽는걸 확인 할 수 있다.

 

이러한 번거로움을 해결하기 위해서 다행히 해결방안이 있는데 만약 당신이 쿠버네티스 1.32버전 이후를 사용하고 있다면 kubelet에 singleprocessOOMKill이라는 옵션을 활성화 해주면 해결된다.

https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/

 

Kubelet Configuration (v1beta1)

Resource Types CredentialProviderConfig KubeletConfiguration SerializedNodeConfigSource FormatOptions Appears in: LoggingConfiguration FormatOptions contains options for the different logging formats. FieldDescription text [Required] TextOptions [Alpha] Te

kubernetes.io

 

참고로 singleprocessOOMKill PR은 다음과같다

https://github.com/kubernetes/kubernetes/pull/126096

 

kubelet: new kubelet config option for disabling group oom kill by utam0k · Pull Request #126096 · kubernetes/kubernetes

What type of PR is this? /kind feature What this PR does / why we need it: There is a difference in the OOM behavior between cgroup v1 and v2 by default. It's important to note that in cgroup v...

github.com

 

반응형