리소스 쿼터
ResourceQuota는 네임스페이스 별로 총 리소스 사용을 제한하는 제약 조건을 제공하는 쿠버네티스 객체다.
유형 별로 네임스페이스 생성할 수 있는 객체의 수와 자원이 사용할 수 있는 리소스의 총량을 제한할 수 있다.
필요성
쿠버네티스 클러스터에는 여러 네임스페이스가 존재하고, 각 네임스페이스에는 Pod를 포함한 여러 객체가 존재할 수 있다.
Pod는 클러스터 내 자원을 사용해서 동작하는데, 임의의 네임스페이스에서 동작하는 Pod가 클러스터에서 사용할 수 있는 모든 자원을 사용하면 다른 Pod는 사용할 컴퓨팅 자원이 없어 동작할 수 없게 된다.
이런 경우 리소스쿼터를 사용해 네임스페이스별로 사용할 수 있는 자원량을 제한하는 방법으로 서비스 장애를 예방할 수 있다.
동작 방식
쿠버네티스 관리자가 임의의 네임스페이스에 대한 ResoureQuota를 생성하면, 시스템은 네임스페이스 내 사용량을 추적하여 ResoureQuota에 정의된 리소스 제한을 초과하지 않도록 한다.
참고로 CPU, 메모리와 같은 컴퓨팅 자원에 대해 ResoureQuota를 생성하면, Pod 생성 시 해당 리소스에 대한 request와 limit을 지정해야 한다.
만약 리소스 제한 설정이 없으면 쿠버네티스는 Pod 생성 요청에 대한 승인을 거부할 수 있다.
지원 리소스 유형
ResoureQuota로 제한할 수 있는 리소스 유형은 아래와 같다. 일부만 나열한다.
유형 | 설명 |
limits.cpu | non-terminal 상태인 모든 pod의 limits.cpu 총합은 해당 값을 초과할 수 없음 |
limits.memory | non-terminal 상태인 모든 pod의 limits. memory 총합은 해당 값을 초과할 수 없음 |
requests.cpu | non-terminal 상태인 모든 pod의 requests.cpu 총합은 해당 값을 초과할 수 없음 |
requests.memory | non-terminal 상태인 모든 pod의 requests.cpu 총합은 해당 값을 초과할 수 없음 |
cpu | requests.cpu와 동일 |
memory | requests.memory와 동일 |
requests.storage | 모든 PVC의 requests.storage 총합이 해당 값을 초과할 수 없음 |
persistentvolumeclaims | 네임스페이스에 존재할 수 있는 PVC의 수 |
<storage-class-name>.storageclass.storage.k8s.io/requests.storage | 해당 스토리지클래스인 모든 PVC의 requests.storage 총합이 해당 값을 초과할 수 없음 |
<storage-class-name>.storageclass.storage.k8s.io/persistentvolumeclaims | 해당 스토리지클래스로 네임스페이스에 존재할 수 있는 PVC의 수 |
count/services | 네임스페이스에 존재할 수 있는 서비스의 수 |
count/deployments.apps | 네임스페이스에 존재할 수 있는 Deployment의 수 |
뿐만 아니라 nvidia.com/gpu와 같은 확장된 리소스에 대한 지원도 추가되었다.
또한 ResoureQuota로 수를 제한할 수 있는 객체는 namespaced 객체이며 core 그룹인 리소스는 count/<resource>으로, core 그룹이 아닌 리소스는 count/<resource>.<group> 지정한다. configmaps, persistentvolumeclaims, pods, resourcequotas와 같은 리소스는 리소스 이름만 지정하여 수를 제한할 수도 있다.
리소스쿼터 생성
다른 리소스와 동일하게 create 명령으로 생성할 수 있다.
kubectl create quota my-quota --hard=cpu=1,memory=1G,pods=2,services=3
또는 yaml 형식으로 생성할 수도 있다.
cat <<EOF > compute-resources.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
requests.nvidia.com/gpu: 4
EOF
kubectl create -f ./compute-resources.yaml --namespace=myspace
리소스쿼터 확인
get 명령어로 정보를 확인하면 이름, request 자원 유형, limit 자원 유형 및 각 자원의 사용량 등을 확인할 수 있다.
kubectl get quota -n <NAMESPACE>
참고 문서
https://kubernetes.io/ko/docs/concepts/policy/resource-quotas/
https://kubernetes.io/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/
https://dev-youngjun.tistory.com/23