LimitRange 사용 목적?
- 네임스페이스에 대한 리소스의 기본 cpu, 메모리 요청량(request)과 상한(limit)을 구성하는것
- 최대, 최소값으로 pod 생성시 필요 조건을 체크할 수 있음
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- max:
cpu: "2"
min:
cpu: "200m"
- default:
cpu: 1
memory: 512Mi
defaultRequest:
cpu: 0.5
memory: 256Mi
type: Container
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo
spec:
containers:
- name: default-mem-demo-ctr
image: nginx
----
결과
containers:
- image: nginx
imagePullPolicy: Always
name: default-mem-demo-ctr
resources:
limits:
cpu: 1
memory: 512Mi
requests:
cpu: 0.5
memory: 256Mi
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo-3
spec:
containers:
- name: default-mem-demo-3-ctr
image: nginx
resources:
requests:
cpu: 1
memory: "128Mi"
---
결과
resources:
limits:
cpu: 1
memory: 512Mi
requests:
cpu: 1
memory: 128Mi
Resource Quota 사용 목적?
- LimitRange는 클러스터 내에서 네임스페이스별 리소스마다의 개별 이라면,
- Resource Quota는 클러스터 내에서 네임스페이스별 총 리스소를 제한한 제약 조건을 제공
- 유형별로 네임스페이스에서 만들수 있는 오브젝트 수와 리소스가 사용할 수 있는 총 컴퓨트 리소스의 양을 제한할 수 있음
Resource Quota 동작 방식
- API 서버에 --enable-admission-plugins= 플래그의 인수 중 하나로 ResourceQuota가 있는 경우 활성화
- 각 네임스페이스에서 동작
- ACL을 통해서 필수 사항을 적용하기 위한 지원이 계획
- 관리자는 각 네임스페이스에 대해 하나의 리소스 쿼터를 생성
- 사용자는 네임스페이스에 리소스를 생성하고, 쿼터 시스템은 사용량을 추적하여 리소스쿼터에 정의된 하드 리소스 제한을 초과하지 않도록한다.
- 네임스페이스에 리소스 생성에 대한 쿼터 제약 조건을 위반하면 위반된 제약조건을 설명하는 메시지와 함께 HTTP 403 FORBIDDEN으로 요청이 실패
- 네임스페이스에 CPU, MEMROY와 같은 리소스에 대해 쿼터가 활성화된 경우 사용자는 CPU, MEMORY값에 request, limit을 지정해야함.
- request, limit값이 없으면 시스템이 파드 생성을 거부할 수 있음
- 컴퓨트 리소스 요구사항이 없는 파드를 기본값으로 설정하려면, LimitRanger admission controller를 사용하면된다.
사용
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
namespace: quota-mem-cpu-example
spec:
hard:
pods: "2" # pod 갯수 제한
requests.cpu: "1" # cpu request 제한
requests.memory: 1Gi # memory request 제한
requests.nvidia.com/gpu: "1" # gpu request 제한
limits.cpu: "2" # cpu limit 제한
limits.memory: 2Gi # memory limit 제한
limits.nvidia.com/gpu: "2" # gpu limit 제한
$ kubectl get resourcequota
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
namespace: quota-mem-cpu-example
spec:
hard:
pods: "2"
limits.cpu: "1"
limits.memory: 1Gi
limits.nvidia.com/gpu: "1"
requests.cpu: "2"
requests.memory: 2Gi
requests.nvidia.com/gpu: "2"
status:
hard:
pods: "2"
limits.cpu: "1"
limits.memory: 1Gi
limits.nvidia.com/gpu: "1"
requests.cpu: "2"
requests.memory: 2Gi
requests.nvidia.com/gpu: "2"
used:
pods: "0"
limits.cpu: "0"
limits.memory: "0"
requests.cpu: "0"
requests.memory: "0"
requests.nvidia.com/gpu: "0"
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo
namespace: quota-mem-cpu-example
spec:
containers:
- name: quota-mem-cpu-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
cpu: "800m"
requests:
memory: "600Mi"
cpu: "400m"
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo-2
namespace: quota-mem-cpu-example
spec:
containers:
- name: quota-mem-cpu-demo-2-ctr
image: redis
resources:
limits:
memory: "1Gi"
cpu: "800m"
requests:
memory: "700Mi"
cpu: "400m"
Error from server (Forbidden): error when creating "examples/admin/resource/quota-mem-cpu-pod-2.yaml":
pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo,
requested: requests.memory=700Mi,used: requests.memory=600Mi, limited: requests.memory=1Gi
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-quota-demo
namespace: quota-mem-cpu-example
spec:
selector:
matchLabels:
purpose: quota-demo
replicas: 3
template:
metadata:
labels:
purpose: quota-demo
spec:
containers:
- name: pod-quota-demo
image: nginx
spec:
...
replicas: 3
...
status:
availableReplicas: 2
...
lastUpdateTime: 2017-07-07T20:57:05Z
message: 'unable to create pods: pods "pod-quota-demo-1650323038-" is forbidden:
exceeded quota: pod-demo, requested: pods=1, used: pods=2, limited: pods=2'