리소스를 지정하지 않으면 왜 문제가 생길까
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에 대한 이해는 필수다.