리소스 Limit

Request & Limit

컨테이너의 자원 요청을 파드에 지정하면, Kube-Scheduler는 이 정보를 사용하여 Pod를 어느 노드에 배치할지 결정한다. 컨테이너에 대한 resource limit를 지정하면, kubelet이 해당 제한을 강제하여 실행 중인 컨테이너가 설정한 제한을 초과하여 해당 리소스를 사용할 수 없도록 한다.

kubelet은 해당 컨테이너가 사용할 수 있도록 시스템 리소스에서 최소한 request한 만큼의 리소스를 예약해 둔다.

파드가 실행 중인 노드에 사용가능한 리소스가 충분한 경우, 컨테이너는 해당 request에서 지정한 것보다 더 많은 리소스를 사용할 수 있다. 그러나 컨테이너는 limit를 초과하여 사용할 수 없다.

CPU는 시스템이 조절하여 지정된 limit를 넘지 않는다.

Memory는 컨테이너는 한도보다 많은 메모리 리소스를 초과하여 쓸 수 있다. 계속해서 limit 보다 많은 메모리를 소모하면 OOM이 발생된다.

CPU

Case1. No Requests / No limit

리소스 limit를 지정하지 않으면, pod 하나가 노드의 모든 cpu 리소스를 소비하고 두 번째 리소스 request도 막을 수 있다.

Available CPU: (Empty)

Limit: X, Request: X
1️⃣: 🔋🔋🔋🔋🔋🔋 
2️⃣: ❌ (사용 불가)

Case2. No Requests / limit

limit가 명시된 경우, 쿠버네티스는 자동으로 요청을 한계와 동일하게 설정한다.

Available CPU: (Empty)

Limit: 3 🔋, Request: (Empty) = Limit
1️⃣: 🔋🔋🔋
2️⃣: 🔋🔋🔋

Case3. Requests / limit

request와 limit가 명시된 경우 각 파드에는 vCPU 하나인 CPU 요청이 보장되고 vCPU 3까지만 사용 가능하다.

비효율이 존재한다.

Available CPU: 🔋🔋

Limit: 3 🔋, Request: 1 🔋
1️⃣: 🔋🔋🔋
2️⃣: 🔋

Case4. Requests / No limit

limit 없이 request 설정할 경우 요청이 정해져 있어서, 각 구역 마다 vCPU 사용을 보장받는다.

사용 가능 시에는 한계가 설정되지 않기 때문에, Pod마다 CPU 사용량을 최대한 많이 사용 가능하다.

Available CPU: 🔋

Limit: (Empty), Request: 1 🔋
1️⃣: 🔋🔋🔋🔋
2️⃣: 🔋

Memory

CASE 1. NO REQUESTS / NO LIMITS

limit가 없어 파드 하나가 노드의 메모리 리소스 전체를 소비할 수 있다.

즉, 다른 파드가 필요한 리소스 사용을 막을 수 있다.

Available Memory: (Empty)

Limit: X, Request: X
1️⃣: 🛢️🛢️🛢️🛢️🛢️🛢️
2️⃣: ❌ (사용 불가)

CASE 2. NO REQUESTS / LIMITS

Request가 구체적으로 명시되지 않고 limit는 명시되어 있는 경우, 컨테이너는 자동으로 request를 한계로 설정된다.

Available Memory: (Empty)

Limit: 3 Gi, Request: (Empty) = Limit
1️⃣: 🛢️🛢️🛢️
2️⃣: 🛢️🛢️🛢️

CASE 3. REQUESTS / LIMITS

request와 limit가 모두 구체적으로 명시된 경우 각 파드에선 request 만큼의 양이 보장되고, limit 까지 사용 가능하다.

Available Memory: 🛢️🛢️

Limit: 3Gi, Request: 1Gi
1️⃣: 🛢️🛢️🛢️
2️⃣: 🛢️

CASE 4. REQUESTS / NO LIMITS

한계가 설정되지 않기 때문에 어떤 포드든 사용 가능한 메모리를 소모할 수 있다.

CPU와는 달리 메모리를 조절할 수 없기 때문에 제공된 메모리보다 더 요청하면 OOM이 발생한다.

Available Memory: (Empty)

Limit: (Empty), Request: 1Gi
1️⃣: 🛢️🛢️🛢️🛢️🛢️ 💥 OOM
2️⃣: 🛢️

LimitRange : Pod Resource Limit

파드 내 컨테이너에 기본으로 설정할 resource limit를 지정할 수 있는데, limit range를 설정해서 가능하다.

limitrange는 하나의 쿠버네티스 객체이며, namespace 레벨에서 생성된다.

pod 정의 파일에 resource나 특정 limit 없이 생성된 컨테이너에 한해, pod 내 모든 컨테이너에 적용된다.

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-resource-constraint
spec:
  limits:
    - default:           # limit
        cpu: 500m
      defaultRequest:    # request
        cpu: 500m
      max:               # limit
        cpu: "1"
      min:               # request
        cpu: 500m
      type: Container

Cluster Limitation : ResourceQuota

쿠버네티스 클러스터에 배포된 앱이 사용할 수 있는 전체 리소스를 제한할 방법이 있다.

Resource Quota는 namespace 레벨에서, Request와 limit의 Hard Limit 값을 설정할 수 있다.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-resource-quota
spec:
  hard:
    request.cpu: 4
    request.memory: 4Gi
    limit.cpu: 10
    limit.memory: 10Gi

Last updated