리소스 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: ContainerCluster 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: 10GiLast updated