7장. 할당량
7.1. 프로젝트당 리소스 할당량
ResourceQuota
오브젝트로 정의하는 리소스 할당량은 프로젝트당 집계 리소스 사용을 제한하는 제약 조건을 제공합니다. 이를 통해 프로젝트에서 생성할 수 있는 오브젝트의 수량을 유형별로 제한하고 해당 프로젝트의 리소스에서 사용할 수 있는 컴퓨팅 리소스 및 스토리지의 총량도 제한할 수 있습니다.
이 가이드에서는 리소스 할당량이 작동하는 방식, 클러스터 관리자가 프로젝트별로 리소스 할당량을 설정하고 관리하는 방법, 개발자와 클러스터 관리자가 이를 확인하는 방법을 설명합니다.
7.1.1. 할당량으로 관리하는 리소스
다음 내용에서는 할당량으로 관리할 수 있는 컴퓨팅 리소스 및 오브젝트 유형 세트를 설명합니다.
status.phase in (Failed, Succeeded)
이 True인 경우 Pod는 터미널 상태에 있습니다.
리소스 이름 | 설명 |
---|---|
|
터미널이 아닌 상태에서 모든 Pod의 CPU 요청 합계는 이 값을 초과할 수 없습니다. |
|
터미널이 아닌 상태에서 모든 Pod의 메모리 요청 합계는 이 값을 초과할 수 없습니다. |
|
터미널이 아닌 상태에서 모든 Pod의 CPU 요청 합계는 이 값을 초과할 수 없습니다. |
|
터미널이 아닌 상태에서 모든 Pod의 메모리 요청 합계는 이 값을 초과할 수 없습니다. |
| 터미널이 아닌 상태에서 모든 Pod의 CPU 제한 합계는 이 값을 초과할 수 없습니다. |
| 터미널이 아닌 상태에서 모든 Pod의 메모리 제한 합계는 이 값을 초과할 수 없습니다. |
리소스 이름 | 설명 |
---|---|
| 상태와 관계없이 모든 영구 볼륨 클레임의 스토리지 요청 합계는 이 값을 초과할 수 없습니다. |
| 프로젝트에 존재할 수 있는 총 영구 볼륨 클레임 수입니다. |
| 상태와 관계없이 일치하는 스토리지 클래스가 있는 모든 영구 볼륨 클레임의 스토리지 요청 합계는 이 값을 초과할 수 없습니다. |
| 프로젝트에 존재할 수 있는, 일치하는 스토리지 클래스가 있는 총 영구 볼륨 클레임 수입니다. |
|
터미널이 아닌 상태에서 모든 Pod의 로컬 임시 스토리지 요청 합계는 이 값을 초과할 수 없습니다. |
|
터미널이 아닌 상태에서 모든 Pod의 임시 스토리지 요청 합계는 이 값을 초과할 수 없습니다. |
| 터미널이 아닌 상태에서 모든 Pod의 임시 스토리지 제한 합계는 이 값을 초과할 수 없습니다. |
리소스 이름 | 설명 |
---|---|
| 프로젝트에 존재할 수 있는 터미널이 아닌 상태의 총 Pod 수입니다. |
| 프로젝트에 존재할 수 있는 총 복제 컨트롤러 수입니다. |
| 프로젝트에 존재할 수 있는 총 리소스 할당량 수입니다. |
| 프로젝트에 존재할 수 있는 총 서비스 수입니다. |
|
프로젝트에 존재할 수 있는 |
|
프로젝트에 존재할 수 있는 |
| 프로젝트에 존재할 수 있는 총 시크릿 수입니다. |
|
프로젝트에 존재할 수 있는 총 |
| 프로젝트에 존재할 수 있는 총 영구 볼륨 클레임 수입니다. |
| 프로젝트에 존재할 수 있는 총 이미지 스트림 수입니다. |
7.1.2. 할당량 범위
각 할당량에는 일련의 관련 범위가 있을 수 있습니다. 특정 할당량은 열거된 범위의 교집합과 일치하는 경우에만 리소스 사용량을 측정합니다.
할당량에 범위를 추가하면 할당량을 적용할 수 있는 리소스 세트가 제한됩니다. 허용된 설정을 벗어난 리소스를 지정하면 검증 오류가 발생합니다.
범위 | 설명 |
|
|
|
|
|
|
|
|
BestEffort
범위는 할당량을 제한하여 다음 리소스를 제한합니다.
-
pods
Terminating
, NotTerminating
, NotBestEffort
범위는 할당량을 제한하여 다음 리소스를 추적합니다.
-
pods
-
memory
-
requests.memory
-
limits.memory
-
cpu
-
requests.cpu
-
limits.cpu
7.1.3. 할당량 적용
프로젝트에 대한 리소스 할당량이 처음 생성되면 프로젝트에서 업데이트된 사용량 통계를 계산할 때까지 할당량 제약 조건을 위반할 수 있는 새 리소스 생성 기능을 제한합니다.
할당량이 생성되고 사용량 통계가 업데이트되면 프로젝트에서 새 콘텐츠 생성을 허용합니다. 리소스를 생성하거나 수정할 때는 리소스 생성 또는 수정 요청에 따라 할당량 사용이 즉시 증가합니다.
리소스를 삭제할 때는 프로젝트에 대한 다음 할당량 통계 전체 재계산 중 할당량 사용이 감소합니다. 구성 가능한 시간에 따라 현재 관찰되는 시스템 값으로 할당량 사용을 줄이는 데 걸리는 시간이 결정됩니다.
프로젝트 수정이 할당량 사용 제한을 초과하면 서버에서 작업을 거부하고 사용자에게 할당량 제약 조건 위반에 대해 설명하는 적절한 오류 메시지와 현재 시스템에서 관찰되는 사용 통계를 반환합니다.
7.1.4. 요청과 제한 비교
컴퓨팅 리소스를 할당할 때 각 컨테이너에서 CPU, 메모리, 임시 스토리지 각각에 대한 요청 및 제한 값을 지정할 수 있습니다. 할당량은 이러한 값 중을 제한할 수 있습니다.
할당량에 requests.cpu
또는 requests.memory
에 대해 지정된 값이 있는 경우 들어오는 모든 컨테이너에서 해당 리소스를 명시적으로 요청해야 합니다. 할당량에 limits.cpu
또는 limits.memory
에 대해 지정된 값이 있는 경우 들어오는 모든 컨테이너에서 해당 리소스에 대한 제한을 명시적으로 지정해야 합니다.
7.1.5. 리소스 할당량 정의의 예
core-object-counts.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: core-object-counts spec: hard: configmaps: "10" 1 persistentvolumeclaims: "4" 2 replicationcontrollers: "20" 3 secrets: "10" 4 services: "10" 5 services.loadbalancers: "2" 6
openshift-object-counts.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: openshift-object-counts
spec:
hard:
openshift.io/imagestreams: "10" 1
- 1
- 프로젝트에 존재할 수 있는 총 이미지 스트림 수입니다.
compute-resources.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: compute-resources spec: hard: pods: "4" 1 requests.cpu: "1" 2 requests.memory: 1Gi 3 limits.cpu: "2" 4 limits.memory: 2Gi 5
besteffort.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: besteffort spec: hard: pods: "1" 1 scopes: - BestEffort 2
compute-resources-long-running.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: compute-resources-long-running spec: hard: pods: "4" 1 limits.cpu: "4" 2 limits.memory: "2Gi" 3 scopes: - NotTerminating 4
compute-resources-time-bound.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: compute-resources-time-bound spec: hard: pods: "2" 1 limits.cpu: "1" 2 limits.memory: "1Gi" 3 scopes: - Terminating 4
storage-consumption.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: storage-consumption spec: hard: persistentvolumeclaims: "10" 1 requests.storage: "50Gi" 2 gold.storageclass.storage.k8s.io/requests.storage: "10Gi" 3 silver.storageclass.storage.k8s.io/requests.storage: "20Gi" 4 silver.storageclass.storage.k8s.io/persistentvolumeclaims: "5" 5 bronze.storageclass.storage.k8s.io/requests.storage: "0" 6 bronze.storageclass.storage.k8s.io/persistentvolumeclaims: "0" 7 requests.ephemeral-storage: 2Gi 8 limits.ephemeral-storage: 4Gi 9
- 1
- 프로젝트의 총 영구 볼륨 클레임 수
- 2
- 프로젝트의 모든 영구 볼륨 클레임에서 요청된 스토리지 합계는 이 값을 초과할 수 없습니다.
- 3
- 프로젝트의 모든 영구 볼륨 클레임에서 골드 스토리지 클래스에 요청된 스토리지 합계는 이 값을 초과할 수 없습니다.
- 4
- 프로젝트의 모든 영구 볼륨 클레임에서 실버 스토리지 클래스에 요청된 스토리지 합계는 이 값을 초과할 수 없습니다.
- 5
- 프로젝트의 모든 영구 볼륨 클레임에서 실버 스토리지 클래스의 총 클레임 수는 이 값을 초과할 수 없습니다.
- 6
- 프로젝트의 모든 영구 볼륨 클레임에서 브론즈 스토리지 클래스에 요청된 스토리지 합계는 이 값을 초과할 수 없습니다. 이 값을
0
으로 설정하면 브론즈 스토리지 클래스에서 스토리지를 요청할 수 없습니다. - 7
- 프로젝트의 모든 영구 볼륨 클레임에서 브론즈 스토리지 클래스에 요청된 스토리지 합계는 이 값을 초과할 수 없습니다. 이 값을
0
으로 설정하면 브론즈 스토리지 클래스에서 클레임을 생성할 수 없습니다. - 8
- 터미널이 아닌 상태에서 모든 Pod의 임시 스토리지 요청 합계는 2Gi를 초과할 수 없습니다.
- 9
- 터미널이 아닌 상태에서 모든 Pod의 임시 스토리지 제한 합계는 4Gi를 초과할 수 없습니다.
7.1.6. 할당량 생성
할당량을 생성하여 지정된 프로젝트에서 리소스 사용량을 제한할 수 있습니다.
프로세스
- 파일에 할당량을 정의합니다.
이 파일을 사용하여 할당량을 생성하고 프로젝트에 적용합니다.
$ oc create -f <file> [-n <project_name>]
예를 들면 다음과 같습니다.
$ oc create -f core-object-counts.yaml -n demoproject
7.1.6.1. 오브젝트 수 할당량 생성
모든 OpenShift Container Platform 표준 네임스페이스 리소스 유형(예: BuildConfig
, DeploymentConfig
개체)에 대해 오브젝트 수 할당량을 생성할 수 있습니다. 오브젝트 할당량 수는 모든 표준 네임스페이스 리소스 유형에 정의된 할당량을 지정합니다.
리소스 할당량을 사용할 때 오브젝트는 생성 시 할당량에 대해 부과됩니다. 이러한 유형의 할당량은 스토리지 소진을 방지하는 데 유용합니다. 할당량은 프로젝트 내에 충분한 예비 리소스가 있는 경우에만 생성할 수 있습니다.
프로세스
리소스에 대한 오브젝트 수 할당량을 구성하려면 다음을 수행합니다.
다음 명령을 실행합니다.
$ oc create quota <name> \ --hard=count/<resource>.<group>=<quota>,count/<resource>.<group>=<quota> 1
- 1
<resource>
변수는 리소스 이름이고<group>
은 API 그룹입니다(해당하는 경우). 리소스 및 관련 API 그룹 목록에oc api-resources
명령을 사용합니다.
예를 들면 다음과 같습니다.
$ oc create quota test \ --hard=count/deployments.extensions=2,count/replicasets.extensions=4,count/pods=3,count/secrets=4
출력 예
resourcequota "test" created
이 예제에서는 나열된 리소스가 클러스터에 있는 각 프로젝트의 하드 제한으로 제한됩니다.
할당량이 생성되었는지 확인합니다.
$ oc describe quota test
출력 예
Name: test Namespace: quota Resource Used Hard -------- ---- ---- count/deployments.extensions 0 2 count/pods 0 3 count/replicasets.extensions 0 4 count/secrets 0 4
7.1.6.2. 확장 리소스에 대한 리소스 할당량 설정
확장 리소스에는 리소스 과다 할당이 허용되지 않으므로 할당량의 해당 확장 리소스에 requests
및 limits
를 지정해야 합니다. 현재는 확장 리소스에 접두사 requests.
가 있는 할당량 항목만 허용됩니다. 다음은 GPU 리소스 nvidia.com/gpu
에 대한 리소스 할당량을 설정하는 방법에 대한 예제 시나리오입니다.
프로세스
클러스터의 노드에서 사용 가능한 GPU 수를 결정합니다. 예를 들면 다음과 같습니다.
# oc describe node ip-172-31-27-209.us-west-2.compute.internal | egrep 'Capacity|Allocatable|gpu'
출력 예
openshift.com/gpu-accelerator=true Capacity: nvidia.com/gpu: 2 Allocatable: nvidia.com/gpu: 2 nvidia.com/gpu 0 0
이 예에서는 GPU 2개를 사용할 수 있습니다.
네임스페이스
nvidia
에 할당량을 설정합니다. 이 예에서 할당량은1
입니다.# cat gpu-quota.yaml
출력 예
apiVersion: v1 kind: ResourceQuota metadata: name: gpu-quota namespace: nvidia spec: hard: requests.nvidia.com/gpu: 1
할당량을 생성합니다.
# oc create -f gpu-quota.yaml
출력 예
resourcequota/gpu-quota created
네임스페이스에 올바른 할당량이 설정되어 있는지 확인합니다.
# oc describe quota gpu-quota -n nvidia
출력 예
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 0 1
단일 GPU를 요청하는 Pod를 정의합니다. 다음 예제 정의 파일은
gpu-pod.yaml
이라고 합니다.apiVersion: v1 kind: Pod metadata: generateName: gpu-pod- namespace: nvidia spec: restartPolicy: OnFailure containers: - name: rhel7-gpu-pod image: rhel7 env: - name: NVIDIA_VISIBLE_DEVICES value: all - name: NVIDIA_DRIVER_CAPABILITIES value: "compute,utility" - name: NVIDIA_REQUIRE_CUDA value: "cuda>=5.0" command: ["sleep"] args: ["infinity"] resources: limits: nvidia.com/gpu: 1
Pod를 생성합니다.
# oc create -f gpu-pod.yaml
Pod가 실행 중인지 확인합니다.
# oc get pods
출력 예
NAME READY STATUS RESTARTS AGE gpu-pod-s46h7 1/1 Running 0 1m
할당량
Used
의 카운터가 올바른지 확인합니다.# oc describe quota gpu-quota -n nvidia
출력 예
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 1 1
nvidia
네임스페이스에서 두 번째 GPU Pod를 생성합니다. 노드에 GPU가 2개 있으므로 기술적으로 가능합니다.# oc create -f gpu-pod.yaml
출력 예
Error from server (Forbidden): error when creating "gpu-pod.yaml": pods "gpu-pod-f7z2w" is forbidden: exceeded quota: gpu-quota, requested: requests.nvidia.com/gpu=1, used: requests.nvidia.com/gpu=1, limited: requests.nvidia.com/gpu=1
이 허용되지 않음 오류 메시지는 할당량이 GPU 1개이고 이 Pod에서 할당량을 초과하는 두 번째 GPU를 할당하려고 했기 때문에 예상된 것입니다.
7.1.7. 할당량 보기
웹 콘솔에서 프로젝트의 할당량 페이지로 이동하면 프로젝트 할당량에 정의된 모든 하드 제한과 관련된 사용량 통계를 볼 수 있습니다.
CLI를 사용하여 할당량 세부 정보를 볼 수도 있습니다.
프로세스
프로젝트에 정의된 할당량 목록을 가져옵니다. 예를 들어
demoproject
라는 프로젝트의 경우 다음과 같습니다.$ oc get quota -n demoproject
출력 예
NAME AGE besteffort 11m compute-resources 2m core-object-counts 29m
관심 있는 할당량을 입력합니다. 예를 들어
core-object-counts
할당량은 다음과 같습니다.$ oc describe quota core-object-counts -n demoproject
출력 예
Name: core-object-counts Namespace: demoproject Resource Used Hard -------- ---- ---- configmaps 3 10 persistentvolumeclaims 0 4 replicationcontrollers 3 20 secrets 9 10 services 2 10
7.1.8. 명시적 리소스 할당량 구성
새 프로젝트에 특정 리소스 할당량을 적용하려면 프로젝트 요청 템플릿에서 명시적 리소스 할당량을 구성합니다.
사전 요구 사항
- cluster-admin 역할을 가진 사용자로 클러스터에 액세스합니다.
-
OpenShift CLI(
oc
)를 설치합니다.
프로세스
프로젝트 요청 템플릿에 리소스 할당량 정의를 추가합니다.
클러스터에 프로젝트 요청 템플릿이 없는 경우 다음을 수행합니다.
부트스트랩 프로젝트 템플릿을 생성하고
template.yaml
이라는 파일에 출력합니다.$ oc adm create-bootstrap-project-template -o yaml > template.yaml
template.yaml
에 리소스 할당량 정의를 추가합니다. 다음 예제에서는 'storage-consumption'이라는 리소스 할당량을 정의합니다. 정의는 템플릿의parameters:
섹션 앞에 추가해야 합니다.- apiVersion: v1 kind: ResourceQuota metadata: name: storage-consumption namespace: ${PROJECT_NAME} spec: hard: persistentvolumeclaims: "10" 1 requests.storage: "50Gi" 2 gold.storageclass.storage.k8s.io/requests.storage: "10Gi" 3 silver.storageclass.storage.k8s.io/requests.storage: "20Gi" 4 silver.storageclass.storage.k8s.io/persistentvolumeclaims: "5" 5 bronze.storageclass.storage.k8s.io/requests.storage: "0" 6 bronze.storageclass.storage.k8s.io/persistentvolumeclaims: "0" 7
- 1
- 프로젝트의 총 영구 볼륨 클레임 수입니다.
- 2
- 프로젝트의 모든 영구 볼륨 클레임에서 요청된 스토리지 합계는 이 값을 초과할 수 없습니다.
- 3
- 프로젝트의 모든 영구 볼륨 클레임에서 골드 스토리지 클래스에 요청된 스토리지 합계는 이 값을 초과할 수 없습니다.
- 4
- 프로젝트의 모든 영구 볼륨 클레임에서 실버 스토리지 클래스에 요청된 스토리지 합계는 이 값을 초과할 수 없습니다.
- 5
- 프로젝트의 모든 영구 볼륨 클레임에서 실버 스토리지 클래스의 총 클레임 수는 이 값을 초과할 수 없습니다.
- 6
- 프로젝트의 모든 영구 볼륨 클레임에서 브론즈 스토리지 클래스에 요청된 스토리지 합계는 이 값을 초과할 수 없습니다. 이 값을
0
으로 설정하면 브론즈 스토리지 클래스에서 스토리지를 요청할 수 없습니다. - 7
- 프로젝트의 모든 영구 볼륨 클레임에서 브론즈 스토리지 클래스에 요청된 스토리지 합계는 이 값을 초과할 수 없습니다. 이 값을
0
으로 설정하면 브론즈 스토리지 클래스에서 클레임을 생성할 수 없습니다.
openshift-config
네임스페이스의 수정된template.yaml
파일에서 프로젝트 요청 템플릿을 생성합니다.$ oc create -f template.yaml -n openshift-config
참고구성을
kubectl.kubernetes.io/last-applied-configuration
주석으로 포함하려면oc create
명령에--save-config
옵션을 추가합니다.기본적으로 이 템플릿을
project-request
라고 합니다.
클러스터에 프로젝트 요청 템플릿이 이미 있는 경우 다음을 수행합니다.
참고구성 파일을 사용하여 클러스터 내의 오브젝트를 선언적 또는 명령적으로 관리하는 경우 대신 해당 파일을 통해 기존 프로젝트 요청 템플릿을 편집합니다.
openshift-config
네임스페이스의 템플릿을 나열합니다.$ oc get templates -n openshift-config
기존 프로젝트 요청 템플릿을 편집합니다.
$ oc edit template <project_request_template> -n openshift-config
-
위의
storage-consumption
예제와 같이 기존 템플릿에 리소스 할당량 정의를 추가합니다. 정의는 템플릿의parameters:
섹션 앞에 추가해야 합니다.
프로젝트 요청 템플릿을 생성한 경우 클러스터의 프로젝트 구성 리소스에서 해당 템플릿을 참조합니다.
편집할 프로젝트 구성 리소스에 액세스합니다.
웹 콘솔 사용:
-
관리
클러스터 설정으로 이동합니다. - 전역 구성을 클릭하여 모든 구성 리소스를 확인합니다.
- 프로젝트 항목을 찾아 YAML 편집을 클릭합니다.
-
관리
CLI 사용:
다음과 같이
project.config.openshift.io/cluster
리소스를 편집합니다.$ oc edit project.config.openshift.io/cluster
projectRequestTemplate
및name
매개변수를 포함하도록 프로젝트 구성 리소스의spec
섹션을 업데이트합니다. 다음 예제에서는 기본 프로젝트 요청 템플릿 이름project-request
를 참조합니다.apiVersion: config.openshift.io/v1 kind: Project metadata: ... spec: projectRequestTemplate: name: project-request
프로젝트가 생성될 때 리소스 할당량이 적용되는지 확인합니다.
프로젝트를 생성합니다.
$ oc new-project <project_name>
프로젝트의 리소스 할당량을 나열합니다.
$ oc get resourcequotas
리소스 할당량을 자세히 설명합니다.
$ oc describe resourcequotas <resource_quota_name>