Kubernetes 리소스 CPU/MEM (Request / Limit)
Kubernetes에서 개별 컨테이너에 CPU와 MEM 리소스를 지정할 수 있습니다.
이때 사용하는 CPU와 MEM의 값을 지정하는 방법과 의미하는 바를 정리해보려합니다.
[CPU]
CPU리소스는 CPU 단위로 측정된다.
Kubernetes에서 1CPU = 1 AWS vCPU = 1 GCP Core = 1 Azure vCore = 1 하이퍼스레드
분수값 설정도 가능하다.
0.5CPU 라던가. 접미사 m을 사용하여 밀리(milli)를 표현할 수도 있다.
Ex) 100m CPU = 0.1 CPU로 같다.
1m보다 정밀한 표현은 허용하지 않는다.
만약, 컨테이너가 동작하는 노드가 가진 CPU보다 높은 CPU요청량을 지정할 경우?
> 노드의 CPU 리소스가 부족하여 Pod가 스케줄링 될 수 없음을 보여준다.
Events: Reason Message ------ ------- FailedScheduling No nodes are available that match all of the following predicates:: Insufficient cpu (3). 출처: <https://kubernetes.io/ko/docs/tasks/configure-pod-container/assign-cpu-resource/> |
만약 CPU 상한을 지정하지 않는경우?
> 해당 Pod에 속한 Namespace의 Limit으로 자동 할당된다.
> Namespace에 상한을 지정하지 않았다면? 컨테이너는 실행중인 노드에서 사용 가능한 모든 CPU 리소스를 사용해버릴 수 있다.
흥미로운점은 CPU Limit에 대한 점입니다.
CPU는 "Compressible" 한 리소스로 간주됩니다.
만약 Application이 내가 설정한 CPU Limit을 치게되면, kubernetes는 해당 컨테이너에 Throttling을 시작합니다.
이것이 의미하는 바는 Application 성능을 잠재적으로 저하되도록 만들 수 있다는 것입니다.
그러나, 해당 컨테이너를 종료시키거나(terminated) 혹은 추방(evicted)하지는 않습니다.
---
[Memory]
Memory에 대한 request, limit는 byte 단위로 측정이 됩니다.
수량 접미사 E,P,I,G,M k와 같은 접미사를 사용해서 메모리를 일반 정수 or 소수점으로 표현할 수 있다.
Ei, Pi, Ti, Gi, Mi, Ki와 같은 접미하는 2의 거듭제곱 형태도 사용할 수 있다.
Ex) 121412, 129e6, 123M, 123512300m, 123Mi
주의. 대소문자에 유의해야 한다.
400m = 0.4byte를 요청한것이다.
400megabyte를 요청하려면 400Mi or 400M를 해야 한다.
컨테이너가 limit보다 많은 메모리를 할당받으려고 시도한다면?
리눅스 커널의 메모리부족(Out-Of-Memory)이 발생하여, 컨테이너의 프로세스중 하나를 종료한다.
해당 프로세스 PID가 1이고, restartable로 표시되어 있으면 kubernetes는 컨테이너를 재기동시킨다.
노드가 가진 메모리보다 큰 메모리를 요청(request)하는 경우?
> 노드 내 메모리가 부족하여 Pod가 스케줄링 될 수 없음을 보여준다.
Events: ... Reason Message ------ ------- ... FailedScheduling No nodes are available that match all of the following predicates:: Insufficient memory (3). 출처: <https://kubernetes.io/ko/docs/tasks/configure-pod-container/assign-memory-resource/> |
메모리 limit을 지정하지 않으면?
> 노드에서 사용가능한 메모리를 사용하다가 OOM Killer가 실행될 수 있다.
https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/
https://kubernetes.io/ko/docs/tasks/configure-pod-container/assign-memory-resource/
https://kubernetes.io/ko/docs/concepts/configuration/manage-resources-containers/