기술 이모저모/[K8s] Kubernetes

[k8s] Kubernetes Container Resources request, limit 방법

Kobby 2022. 10. 10. 19:12

k8s를 사용하는 구조에서는 많은 Container pod가 배포되고 이에 따라 적절하게 Resouces를 관리해야 한다.

 

그리고 pod를 schedule 할 때, pod 내의 application이 동작할 수 있을만큼의 자원(CPU, Memory)가 확보되어야 한다.

물론, 별도 Limit 없이 무제한으로 할당할 수 있지만 이는 특정 pod가 문제가 되면 다른 pod도 모두 영향을 받으므로 제한하는것이 좋은 방법이다.

- k8s 1.9 버전에서는 CPU, Memory 자원에 대해서만 제한이 가능하다.

 

k8s Resouces 단위

k8s에서 Resouces를 정의하는 기본 단위는 ms(밀리 세컨드)이다. 대략 1000ms = 1vCPU이다.

 

CPU, Limit Resources 자원 할당 방법

k8s를 만들 때, Request & Limit 옵션으로 pod 별로 Resouces를 제한할 수 있다.

Request는 pod가 생성될 때 기본적으로 요청하는 양이며, Limit은 Resouces가 더 필요한 경우의 상한선이다.

그렇기때문에 pod의 Resouces가 Limit을 넘으면 문제가 발생한다.

k8s Resources 제한

 

Container별 Resources 제한

CPU, Memory 제한은 아래와 같이 yaml 파일을 만들 때 간단하게 정할 수 있으며, pod, Namespace별로 지정할 수 있다.

...생략...
spec:
 containers:
 -name: test
  image: nginx
  resources:
   requests:
    memory:"64Mi"
    cpu: "250m"
   limis:
    memoty: "128Mi"
    cpu: "500m"
...생략...

 

Resource Quota = Namespace별 Resources 제한

Resource Quota는 Namespace별로 전체 CPU, Memory를 제한할 수 있다. 아래 예는 CPU 500m ~ 700m, Memoty 100Mi ~ 500Mi로 제한하는 양식이다. 팀 또는 서비스 기준으로 Namespace를 구분한다면 이 방법도 좋다.

apiVersion: v1
kind: ResourceQuota
metadata:
 name: test
spec:
 hard:
  requests.cpu: 500m
  requests.memoty: 100Mib
  limits.cpu: 700m
  limis.memoty: 500Mib

 

Limit Range = Container별 Resources 제한

개별 Container별로 Resouces를 제한하는 방법도 있고, 위 Resouce Quota에 비해 많은 파라미터가 있다.

  • default : limit을 따로 지정하지 않을 때 사용하는 default limit이다.
  • defaultRequest : request를 따로 지정하지 않을 때의 default request이다.
  • max : limit을 지정할 때, 설정 가능한 최대치이다.
  • min : limit을 지정할 때, 설정 가능한 최소치이다.
apiVersion: v1
kind: LimitRange
metadata:
 name: test
spec:
 limis:
  - default:
   cpu: 600m
   memoty: 100Mib
  defaultRequest:
   cpu: 100m
   memory: 50Mib
  max:
   cpu: 1000m
   memory: 200Mib
  min:
   cpu: 10m
   memory: 10Mib

 

Container가 Requests 량을 초과하게된다면?

Container가 request 이상의 자원을 요청하더라도 문제는 없다. 다만, 이 경우 해당 Pod는 퇴거(Eviction)상태가 되고 다른 node로 재배치 된다. 근데 또!! 만약 모든 node의 자원이 부족하다면 pod는 Pending 상태가 된다.

 

Container가 Limit 량을 초과하게된다면?

Limit 이상의 자원을 요청하게되면 문제가 발생한다. Limit 양 이상의 자원을 요청하는 경우를 overcommitted 상태라고 한다.

이 경우 CPU의 경우 request로 정의된 양만큼 낮추고 상태를 지켜본다. 반면 Memory는 즉시 Eviction 대상이 된다. 최악의 경우는 OOM 상태로 빠져서 Container가 구동되지 않는다.

 

그렇다면, CPU & Memory를 제한하지 않는다면?

기본적으로 1vCPU, 512Mi이 할당되며 Limit은 존재하지 않는다. 즉, 필요한만큼 계속해서 늘어난다.

 

 

위 기술내용을 보면 CPU & Memory를 작게 제한할 수도 없고, 그렇다고 제한하지 않는것은 잠재적인 문제를 유발할 수 있다.

그렇기 때문에 각 Container 또는 Namespace별로 적절하게 제한하는것이 중요하다. 또한 자원 현황이 계속해서 고점유하고 있다면 Pod Scaling을 설정하여 자동으로 스케일링을 하도록 하는것도 방법이다!!