LimitRange를 사용하면 파드 등에 대해 CPU나 메모리 리소스의 최솟값과 최댓값, 기본값 등을 설정할 수 있다.
LimitRange가 네임스페이스에 제한을 주려면 네임스페이스마다 설정이 필요하다.
또, LimitRange는 신규로 파드를 생성할 떄 사용되므로 기존 파드에는 영향을 주지 않는다.
제한 가능한 항목은 기본 Requests/Limits와 그 비율, 최대/최소 리소스 이렇게 총 5가지이다.
설정 항목 | 개요 |
---|---|
default | 기본 Limits |
defaultRequests | 기본 Requests |
max | 최대 리소스 |
min | 최소 리소스 |
maxLimitRequestRatio | Limits/Reqeusts의 비율 |
LimitRange를 설정할 수 있는 리소스는 파드/컨테이너/PVC 세가지다.
파드에서는 max/min/maxLimitReqeustsRatio를,
PVC에서는 max/min만 설정 가능하다.
파드의 경우에는 파드 내부에서 사용되는 컨테이너 리소스 합계 제한으로 max,min을 사용하고,
PVC에서는 요청 가능한 스토리지 사이즈를 제한한다.
또한 하나의 LimitRange로 여러 타입에 제한을 설정할 수도 있다.
타입 | 사용 가능한 설정 항목 |
---|---|
컨테이너 | default/defaultRequests/max/min/maxLimitRequestRatio |
파드 | max/min/maxLimitRequestRatio |
PVC | max/min |
파드나 컨테이너에 대해 리소스 제한을 전혀 하지 않을 경우, 실제 노드 부하와 관계없이 계속 파드를 스케줄링한다.
스케줄러는 Requests에서 지정한 리소스를 확보할 수 있을지에 따라 스케줄링 여부를 판단한다.
그래서 모든 파드에 Requests를 지정하지 않았을 경우, 스케줄러는 계속 그 노드에 스케줄링하게 된다!!...
리소스 소비가 과도하게 많아지면, 메모리는 OOM Killer 에 의해 프로세스가 정지되지만, CPU는 전체 동작이 느려져 최악의 경우 운영체제가 동작하지 않게 된다.
-> 그래서 일부 환경에서는 기본 CPU Requests(최소)를 설정하는 LimitRange가 생성되어 있다.
컨테이너 리소스를 제한하는 경우 type: Container
의 LimitRange로 설정한다.
개별적으로 컨테이너에 대해 리소스 제한을 정의하지 않고 기본 설정을 정의할 수도 있으며,
컨테이너에 허용하는 최대/최소 리소스 제한을 설정할 수도 있다.
또 maxLimitRequestRatio를 설정하면 Requests와 Limits의 차이에 따른 과도한 오버커밋도 피할 수 있다.
OverCommit ?
node를 결정할때는 requests값을 사용하지만, 실제 실행될때는 limits 값을 사용한다. 이로 인해 (limits의 합) > (node의 Allocatable한 리소스 양) 이 되고 문제가 발생할 수 있다. 이를 overcommit 상태라고 한다.
컨테이너에 리소스 제한을 하는 LimitRange 예제
apiVersion: apps/v1
kind: LimitRange
metadata:
name: limitrange-container
namespace: test
spec:
limits:
- type: Container
default:
memory: 512Mi
cpu: 500m
defaultRequests:
memory: 256Mi
cpu: 250m
max:
memory: 1024Mi
cpu: 1000m
mix:
memory: 128Mi
cpu: 125m
maxLimitRequestRatio:
memory: 2
cpu: 2
이 limitRange를 설정한 상태에서, 리소스 제한을 하지 않은 파드를 기동해보면 LimitRange 값으로 설정된 것을 확인할 수 있다.
파드에 대해 리소스를 제한하려는 경우에는 type: Pod의 LimitRange로 설정한다.
컨테이너에서 사용하는 리소스 합계로 최대/최소를 제한한다.
apiVersion: apps/v1
kind: LimitRange
metadata:
name: limitrange-pod
namespace: test
spec:
limits:
- type: Pod
max:
memory: 2048Mi
cpu: 2000m
mix:
memory: 128Mi
cpu: 125m
maxLimitRequestRatio:
memory: 1.5
cpu: 21.5
클라우드 환경에서는 DynamicProvisioning으로 간단히 영구 볼륨을 생성할 수 있지만, LimitRange를 설정해 놓으면 일정 용량 이상으로 볼륨을 생성하지 못하게 할 수 있다.
apiVersion: apps/v1
kind: LimitRange
metadata:
name: limitrange-pvc
namespace: test
spec:
limits:
- type: PersistentVolumeClaim
max:
storage: 20Gi
min:
storage: 3Gi
위 샘플에서는, 예를 들어 25Gi 의 pvc를 생성하려고 해도 용량 초과로 생성할 수 없다.