IT Knowledge/Kubernetes

Kubernetes 리소스 CPU/MEM (Request / Limit)

Seok. 2024. 7. 4. 16:31
반응형

 

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/

https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-resource-requests-and-limits?hl=en

반응형