쿠버네티스에는 Clouster Autoscaler가 구현된 환경이 많다.
Cluster Autoscaler는 쿠버네티스 클러스터 자체의 오토 스케일링을 의미하며, 수요에 따라 쿠버네티스 노드를 자동으로 추가하는 기능이다.
언뜻 보기에 Cluster Autoscaler는 클러스터 전체나 각 노드의 부하 평균이 높아졌을 때 확장하는 것 처럼 보인다.
그러나 실제 동작은 조금 다르다.
Pending 상태의 파드가 생기는 타이밍에 처음으로 Cluster Autoscaler가 동작하게 된다.
즉, Requests와 Limits를 적절하게 설정하지 않은 상태에서는 실제 노드의 부하 평균이 낮은 상황에서도 스케일 아웃이 되거나, 부하 평균이 높은 상황임에도 스케일 아웃이 되지 않는 상황이 발생한다.
기본적으로 리소스에 의한 스케줄링은 Requests(최소)를 기준으로 이루어진다.
다시 말해, Reqeusts를 초과하여 할당한 경우에는 최소 리소스 요청만으로 리소스가 꽉 차 버려서 신규 노드를 추가해야만 한다.
이때 실제 컨테이너 프로세스가 사용하는 리소스 사용량은 고려되지 않는다.
반대로, Requests를 낮게 설정한 상태에서 Limits 차이가 크게 나는 상황을 생각해보자.
각 컨테이너는 Limits로 할당된 리소스를 최대로 사용한다.
그래서 실제 리소스 사용량이 높아졌더라도 Requests 합계로 보면 아직 스케줄링이 가능하기 때문에 클러스터가 스케일 아웃하지 않는 상황이 발생한다.
기본 정책으로
이 두가지를 명심하자.
실제 값을 정할때, Requests와 Limits를 낮게 설정하고 성능 테스트를 하면서 올려가는 것이 좋다.
메모리의 경우, 낮게 설정하면 부하 테스트에서 OOM으로 프로세스가 Kill(파드가 정지됨) 되게 때문에, 'OOM이 발생하지 않을 정도의 리소스 할당'을 하나의 지표로 생각하면 된다.