Hunny's Daily

개발과 일상에서의 달콤한 순간들을 기록하며, 유용한 팁과 인사이트를 공유합니다.

Kubernetes requests / limits 개념 정리

리소스를 지정하지 않으면 왜 문제가 생길까

Kubernetes에서 Pod를 배포할 때 requests와 limits 설정은 선택 사항처럼 보이지만, 실제 운영 환경에서는 필수에 가깝다. 이 설정을 이해하지 못하면 Scale Out이 제대로 동작하지 않거나, Pod가 예기치 않게 종료되는 문제를 겪게 된다. 이 글에서는 Kubernetes requests와 limits의 개념과 역할을 중심으로 정리한다.


requests와 limits는 무엇인가

Kubernetes에서 requests와 limits는 Pod가 사용할 리소스의 기준값을 정의한다.

  • requests
    • Pod가 필요로 하는 최소 리소스
    • 스케줄링 기준으로 사용
  • limits
    • Pod가 사용할 수 있는 최대 리소스
    • 런타임 제한 기준

이 두 값은 CPU와 메모리에 각각 설정할 수 있다.


requests의 역할

requests는 Kubernetes가 Pod를 어느 노드에 배치할지 결정하는 기준이다.

스케줄러는 다음 질문에 답한다.

  • 이 Pod를 실행할 수 있는 노드가 있는가
  • 해당 노드에 requests만큼의 여유 리소스가 있는가

requests가 설정되지 않으면, 스케줄러는 정확한 판단을 할 수 없다.


requests를 설정하지 않으면 생기는 문제

requests가 없거나 너무 작으면 다음 문제가 발생할 수 있다.

  • 한 노드에 Pod가 과도하게 몰림
  • 노드 리소스 고갈
  • 전체 성능 저하

겉보기에는 Pod가 잘 떠 있는 것처럼 보여도, 실제로는 불안정한 상태가 된다.


limits의 역할

limits는 Pod가 사용할 수 있는 리소스의 상한선이다.

  • CPU limits
    • 초과 시 CPU 사용이 제한됨
  • 메모리 limits
    • 초과 시 Pod가 종료됨

limits는 다른 Pod를 보호하기 위한 안전장치 역할을 한다.


limits를 설정하지 않으면 생기는 문제

limits가 없으면 다음 문제가 발생할 수 있다.

  • 특정 Pod가 리소스를 독점
  • 다른 Pod의 성능 저하
  • 노드 전체 장애 가능성 증가

특히 메모리는 한 Pod의 문제가 전체 노드에 영향을 줄 수 있다.


CPU limits와 메모리 limits의 차이

CPU와 메모리는 동작 방식이 다르다.

  • CPU
    • limits 초과 시 스로틀링 발생
    • Pod는 종료되지 않음
  • 메모리
    • limits 초과 시 OOMKill 발생
    • Pod 즉시 종료

이 차이를 이해하지 못하면 원인 파악이 어려워진다.


OOMKill이 발생하는 이유

OOMKill은 Pod가 메모리 limits를 초과했을 때 발생한다.

이 경우 Kubernetes는 다음과 같이 동작한다.

  • Pod 종료
  • ReplicaSet이 새 Pod 생성
  • 반복되면 재시작 루프 발생

메모리 limits는 특히 신중하게 설정해야 한다.


HPA와 requests의 관계

HPA는 limits가 아니라 requests를 기준으로 동작한다.

예를 들면 다음과 같다.

  • requests: CPU 500m
  • 현재 사용량: 500m

이 경우 CPU 사용률은 100%로 계산된다.

requests를 잘못 설정하면 HPA는 잘못된 판단을 하게 된다.


requests / limits가 Scale Out에 미치는 영향

Scale Out이 제대로 동작하려면 다음이 충족되어야 한다.

  • requests가 실제 사용량과 유사할 것
  • limits가 비정상 사용을 막을 것
  • 노드 리소스 여유 확보

requests와 limits는 Scale Out의 기초 설정이다.


적절한 설정을 위한 기본 원칙

일반적인 권장 원칙은 다음과 같다.

  • requests는 평균 사용량 기준
  • limits는 피크 사용량 기준
  • CPU limits는 유연하게
  • 메모리 limits는 보수적으로

정답은 없지만, 기준은 필요하다.


requests와 limits를 함께 봐야 하는 이유

두 설정은 독립적으로 보이지만 함께 작동한다.

  • requests
    • 배치 판단 기준
  • limits
    • 실행 중 보호 장치

하나만 설정하면 구조는 불완전해진다.


실무에서 자주 발생하는 설정 실수

다음과 같은 실수가 자주 발생한다.

  • requests를 너무 낮게 설정
  • limits를 과도하게 설정
  • CPU와 메모리 동일하게 취급
  • 환경별 설정 분리 실패

이로 인해 Scale Out이 기대와 다르게 동작한다.


언제 requests / limits를 꼭 설정해야 하는가

다음 상황에서는 반드시 설정해야 한다.

  • HPA를 사용하는 경우
  • 여러 서비스가 한 클러스터를 공유하는 경우
  • 운영 환경 배포

개발 환경과 운영 환경의 기준은 다를 수 있다.


정리

Kubernetes의 requests와 limits는 리소스 관리의 핵심 설정이다. requests는 Pod 배치와 HPA 판단의 기준이 되고, limits는 실행 중 리소스 사용을 제한한다. 이 두 값을 올바르게 설정하지 않으면 Scale Out, 안정성, 성능 모두에 문제가 발생할 수 있다. Kubernetes에서 안정적인 운영을 위해 requests와 limits에 대한 이해는 필수다.