리소스 할당량(resource quota)은 애플리케이션이 사용할 수 있는 CPU 또는 메모리 양을 제어하여 리소스 경합 및 '랜드 그랩(토지수탈?)'을 방지합니다.
간단히 말해 리소스 할당량(resource quota)은 네임스페이스당 리소스 사용을 제한하는 제약 조건을 제공합니다. 네임스페이스 수준에서만 적용될 수 있으므로 컴퓨팅 리소스에 적용하여 네임스페이스 내의 개체 수를 제한할 수 있다.
쿠버네티스 리소스 할당량은 리소스쿼터(ResourceQuota) 오브젝트에 의해 정의된다. 네임스페이스에 적용하면 CPU 및 메모리와 같은 컴퓨팅 리소스는 물론 다음 오브젝트의 생성을 제한할 수 있다:
쿠버네티스는 컴퓨팅 리소스를 관리하기 위해 두 가지 유형의 CPU 및 메모리 쿼터를 지원한다. 이는 리밋레인지 문서에서 설명하는 것처럼 리밋과 요청을 통해 제어된다.
간단히 말해, 요청(request)은 컨테이너에 대해 보장된 CPU 또는 메모리 리소스를 정의하는 반면, 제한(limit)은 다른 컨테이너의 사용량에 따라 컨테이너가 사용할 수 있는 메모리 또는 CPU 임계값을 의미합니다.
아래 이미지는 쿠버네티스 리소스 쿼터에서 요청과 제한의 차이를 보여줍니다.
Kubernetes resource quota에서 request와 limit의 차이
quota-test namespace 생성
$ kubectl create namespace quota-test
namespace/quota-test created
cpu-quota.yaml 파일 작성
apiVersion: v1
kind: ResourceQuota
metadata:
name: test-cpu-quota
** namespace: quota-test
**spec:
hard:
requests.cpu: "100m"
limits.cpu: "200m"
cpu-quota.yaml Kubernetes cluster에 적용
$ kubectl apply -f cpu-qouta.yaml
resourcequota/test-cpu-quota created
kubectl describe command로 확인
$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name: test-cpu-quota
Namespace: quota-test
Resource Used Hard
-------- ---- ----
limits.cpu 0 200m
requests.cpu 0 100m
이제 할당량을 정의했으니 테스트. 이 예제에서는 동일한 네임스페이스에 서로 다른 세 개의 파드를 배포하여 정의한 제한에 따라 리소스 사용량을 제어할 수 있는지 확인. 세 개의 파드는 다음과 같습니다:
PodA: 가장 먼저 인스턴스화되는 이 파드는 사용 가능한 CPU의 50%를 사용.
PodB: 이 파드는 사용 가능한 CPU의 나머지 50%를 사용하며, 두 번째로 인스턴스화된 파드이다.
파드C: 정의된 할당량으로 인해 이 세 번째 파드가 배포되지 않아야 한다.
$ kubectl create -n quota-test -f- <<EOF
> apiVersion: v1
> kind: Pod
> metadata:
> name: poda
> spec:
> containers:
> - name: quota-test
> image: busybox
> imagePullPolicy: IfNotPresent
> command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
> resources:
> requests:
> cpu: "50m"
> limits:
> cpu: "100m"
> restartPolicy: Never
> EOF
pod/poda created
$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name: test-cpu-quota
Namespace: quota-test
Resource Used Hard
-------- ---- ----
limits.cpu 100m 200m
requests.cpu 50m 100m
[root@k8s-master qouta]# kubectl create -n quota-test -f- <<EOF
> apiVersion: v1
> kind: Pod
> metadata:
> name: podb
> spec:
> containers:
> - name: quota-test
> image: busybox
> imagePullPolicy: IfNotPresent
> command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
> resources:
> requests:
> cpu: "50m"
> limits:
> cpu: "100m"
> restartPolicy: Never
> EOF
pod/podb created
$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name: test-cpu-quota
Namespace: quota-test
Resource Used Hard
-------- ---- ----
limits.cpu 200m 200m
requests.cpu 100m 100m
$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name: test-cpu-quota
Namespace: quota-test
Resource Used Hard
-------- ---- ----
limits.cpu 200m 200m
requests.cpu 100m 100m
[root@k8s-master qouta]# kubectl create -n quota-test -f- <<EOF
> apiVersion: v1
> kind: Pod
> metadata:
> name: podc
> spec:
> containers:
> - name: quota-test
> image: busybox
> imagePullPolicy: IfNotPresent
> command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
> resources:
> requests:
> cpu: "5m"
> limits:
> cpu: "10m"
> restartPolicy: Never
> EOF
Error from server (Forbidden): error when creating "STDIN": pods "podc" is forbidden: exceeded quota: test-cpu-quota, requested: limits.cpu=10m,requests.cpu=5m, used: limits.cpu=200m,requests.cpu=100m, limited: limits.cpu=200m,requests.cpu=100m
🥕Quota를 초과하는 리소스를 사용하려하여 Pod 생성이 안된다는 메시지 출력
Error from server (Forbidden): error when creating "STDIN": pods "podc" is forbidden: exceeded quota: test-cpu-quota, requested: limits.cpu=10m,requests.cpu=5m, used: limits.cpu=200m,requests.cpu=100m, limited: limits.cpu=200m,requests.cpu=100m
$ kubectl delete -n quota-test