Kubernetes 클러스터 운영이 주 업무는 아니지만 SRE팀에서 Kubernetes에 앱을 배포하는 시스템을 만들고 있다보니 최근 Kubernetes를 많이 보게 됩니다. Kubernetes를 자세히 알지는 못하기 때문에 이슈 상황마다 하나씩 공부를 하고 있습니다. 최근 CPU 리소스를 어떻게 관리하는지에 관해 공부했는데 이 글에서 OOM에 관련한 정보를 얻을 수 있었습니다. 애플리케이션이 할당된 메모리보다 많이 사용하거나 워커 인스턴스의 메모리가 부족한 경우 OOMKilled로 컨테이너가 죽게 되는데 이때 누구를 죽일지 선택해야 하므로 리눅스 커널의 OOM Killer가 이 일을 합니다. OOM Killer는 시스템에 가장 영향을 적게 주기 위해 가장 적은 수의 프로세스를 죽이면서 최대 메모리를 다시 확보하기 위해서 어떤 프로세스를 죽이는게 맞는지를 선택합니다. 이 선택을 위해서 내부적으로 oom_score를 관리해서 oom_score가 높은 프로세스를 죽이게 됩니다. oom_score는 oom_score_adj로 조정할 수 있도록 제공하고 있으므로 Kubernetes도 우선 숭위를 조정하기 위해 oom_score_adj를 사용하게 됩니다. Kuberntes에서는 Pod을 관리하기 위해 QoS 클래스가 있으므로 Guaranteed 팟은 -998로, BestEffort는 1000으로 Burstable은 min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999) 로 보여하게 됩니다. 결국 BestEffort를 먼저 죽이고 Guaranteed는 나중에 죽이도록 전수 조정을 해주게 됩니다.

OOMKilled & Kubernetes QoS

CloudYuga

OOMKilled & Kubernetes QoS

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2023년 3월 11일 오전 11:14

댓글 0