8.3. 제한 범위를 사용하여 리소스 사용 제한
기본적으로 컨테이너는 OpenShift Container Platform 클러스터에서 바인딩되지 않은 컴퓨팅 리소스와 함께 실행됩니다. 제한 범위를 사용하면 프로젝트에서 특정 오브젝트에 대한 리소스 사용을 제한할 수 있습니다.
- Pod 및 컨테이너: Pod 및 해당 컨테이너의 CPU 및 메모리에 대한 최소 및 최대 요구사항을 설정할 수 있습니다.
-
이미지 스트림:
ImageStream
오브젝트에서 이미지 및 태그 수에 대한 제한을 설정할 수 있습니다. - 이미지: 내부 레지스트리로 내보낼 수 있는 이미지 크기를 제한할 수 있습니다.
- PVC(영구 볼륨 클레임): 요청할 수 있는 PVC 크기를 제한할 수 있습니다.
Pod가 제한 범위에 따라 적용된 제약 조건을 충족하지 않는 경우에는 네임스페이스에 Pod를 생성할 수 없습니다.
8.3.1. 제한 범위 정보
LimitRange
오브젝트에서 정의하는 제한 범위는 프로젝트의 리소스 사용을 제한합니다. 프로젝트에서는 Pod, 컨테이너, 이미지 스트림 또는 PVC(영구 볼륨 클레임)에 대한 특정 리소스 제한을 설정할 수 있습니다.
리소스 생성 및 수정을 위한 모든 요청은 프로젝트의 각 LimitRange
오브젝트에 대해 평가됩니다. 리소스가 열거된 제약 조건을 위반하는 경우 해당 리소스는 거부됩니다.
다음은 모든 구성 요소의 제한 범위 오브젝트(Pod, 컨테이너, 이미지, 이미지 스트림 또는 PVC)를 보여줍니다. 동일한 오브젝트에서 이러한 구성 요소의 일부 또는 모두에 대한 제한을 구성할 수 있습니다. 리소스를 제어하려는 각 프로젝트에 대해 서로 다른 제한 범위 오브젝트를 생성합니다.
컨테이너의 제한 범위 오브젝트 샘플
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" spec: limits: - type: "Container" max: cpu: "2" memory: "1Gi" min: cpu: "100m" memory: "4Mi" default: cpu: "300m" memory: "200Mi" defaultRequest: cpu: "200m" memory: "100Mi" maxLimitRequestRatio: cpu: "10"
8.3.1.1. 구성 요소 제한 정보
다음 예제에서는 각 구성 요소에 대한 제한 범위 매개변수를 보여줍니다. 해당 예제는 명확성을 위해 분류되어 있습니다. 필요에 따라 일부 또는 모든 구성 요소에 대해 단일 LimitRange
오브젝트를 생성할 수 있습니다.
8.3.1.1.1. 컨테이너 제한
제한 범위를 사용하면 Pod의 각 컨테이너에서 특정 프로젝트에 대해 요청할 수 있는 최소 및 최대 CPU 및 메모리를 지정할 수 있습니다. 프로젝트에서 컨테이너가 생성되면 Pod
사양의 컨테이너 CPU 및 메모리 요청이 LimitRange
오브젝트에 설정된 값을 준수해야 합니다. 그러지 않으면 Pod가 생성되지 않습니다.
-
컨테이너 CPU 또는 메모리에 대한 요청 및 제한이
LimitRange
오브젝트에 지정된 컨테이너의min
리소스 제약 조건보다 크거나 같아야 합니다. 컨테이너 CPU 또는 메모리 요청 및 제한이
LimitRange
오브젝트에 지정된 컨테이너의max
리소스 제약 조건보다 작거나 같아야 합니다.LimitRange
오브젝트에서max
CPU를 정의하는 경우Pod
사양에 CPUrequest
값을 정의할 필요가 없습니다. 그러나 제한 범위에 지정된 최대 CPU 제약 조건을 충족하는 CPUlimit
값은 지정해야 합니다.요청에 대한 컨테이너 제한 비율은
LimitRange
오브젝트에 지정된 컨테이너의maxLimitRequestRatio
값보다 작거나 같아야 합니다.LimitRange
오브젝트에서maxLimitRequestRatio
제약 조건을 정의하는 경우 새 컨테이너에request
및limit
값이 모두 있어야 합니다. OpenShift Container Platform은limit
값을request
값으로 나눠 제한 대 요청 비율을 계산합니다. 이 값은 음수가 아닌 1보다 큰 정수여야 합니다.예를 들어 컨테이너의
limit
값이cpu: 500
이고request
값이cpu: 100
인 경우cpu
의 제한 대 요청 비율은5
입니다. 이 비율은maxLimitRequestRatio
보다 작거나 같아야 합니다.
Pod
사양에서 컨테이너 리소스 메모리 또는 제한을 지정하지 않으면 제한 범위 오브젝트에 지정된 컨테이너의 default
또는 defaultRequest
CPU 및 메모리 값이 컨테이너에 할당됩니다.
컨테이너 LimitRange
오브젝트 정의
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: "Container" max: cpu: "2" 2 memory: "1Gi" 3 min: cpu: "100m" 4 memory: "4Mi" 5 default: cpu: "300m" 6 memory: "200Mi" 7 defaultRequest: cpu: "200m" 8 memory: "100Mi" 9 maxLimitRequestRatio: cpu: "10" 10
- 1
- LimitRange 오브젝트의 이름입니다.
- 2
- Pod의 단일 컨테이너에서 요청할 수 있는 최대 CPU 양입니다.
- 3
- Pod의 단일 컨테이너에서 요청할 수 있는 최대 메모리 양입니다.
- 4
- Pod의 단일 컨테이너에서 요청할 수 있는 최소 CPU 양입니다.
- 5
- Pod의 단일 컨테이너에서 요청할 수 있는 최소 메모리 양입니다.
- 6
Pod
사양에 지정되지 않은 경우 컨테이너에서 사용할 수 있는 기본 CPU 양입니다.- 7
Pod
사양에 지정되지 않은 경우 컨테이너에서 사용할 수 있는 기본 메모리 양입니다.- 8
Pod
사양에 지정되지 않은 경우 컨테이너에서 요청할 수 있는 기본 CPU 양입니다.- 9
Pod
사양에 지정되지 않은 경우 컨테이너에서 요청할 수 있는 기본 메모리 양입니다.- 10
- 컨테이너에 대한 최대 제한 대 요청 비율입니다.
8.3.1.1.2. Pod 제한
제한 범위를 사용하면 지정된 프로젝트의 Pod에서 모든 컨테이너에 대해 최소 및 최대 CPU 및 메모리 제한을 지정할 수 있습니다. 프로젝트에서 컨테이너를 생성하려면 Pod
사양의 컨테이너 CPU 및 메모리 요청이 LimitRange
오브젝트에 설정된 값을 준수해야 합니다. 그러지 않으면 Pod가 생성되지 않습니다.
Pod
사양에서 컨테이너 리소스 메모리 또는 제한을 지정하지 않으면 제한 범위 오브젝트에 지정된 컨테이너의 default
또는 defaultRequest
CPU 및 메모리 값이 컨테이너에 할당됩니다.
Pod의 모든 컨테이너에서 다음 사항이 충족되어야 합니다.
-
컨테이너 CPU 또는 메모리에 대한 요청 및 제한이
LimitRange
오브젝트에 지정된 Pod의min
리소스 제약 조건보다 크거나 같아야 합니다. -
컨테이너 CPU 또는 메모리에 대한 요청 및 제한이
LimitRange
오브젝트에 지정된 Pod의max
리소스 제약 조건보다 작거나 같아야 합니다. -
요청에 대한 컨테이너 제한 대 요청 비율이
LimitRange
오브젝트에 지정된maxLimitRequestRatio
제약 조건보다 작거나 같아야 합니다.
Pod LimitRange
오브젝트 정의
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: "Pod" max: cpu: "2" 2 memory: "1Gi" 3 min: cpu: "200m" 4 memory: "6Mi" 5 maxLimitRequestRatio: cpu: "10" 6
8.3.1.1.3. 이미지 제한
LimitRange
오브젝트를 사용하면 OpenShift 이미지 레지스트리로 내보낼 수 있는 이미지의 최대 크기를 지정할 수 있습니다.
OpenShift 이미지 레지스트리로 이미지를 내보내는 경우 다음 사항이 충족되어야 합니다.
-
이미지 크기가
LimitRange
오브젝트에 지정된 이미지의max
크기보다 작거나 같아야 합니다.
이미지 LimitRange
오브젝트 정의
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: openshift.io/Image max: storage: 1Gi 2
제한을 초과하는 Blob이 레지스트리에 업로드되지 않도록 하려면 할당량을 적용하도록 레지스트리를 구성해야 합니다.
업로드된 이미지의 매니페스트에서 이미지 크기를 항상 사용할 수 있는 것은 아닙니다. 특히 Docker 1.10 이상으로 빌드하여 v2 레지스트리로 내보낸 이미지의 경우 그러합니다. 이전 Docker 데몬을 사용하여 이러한 이미지를 가져오면 레지스트리에서 이미지 매니페스트를 모든 크기 정보가 없는 스키마 v1로 변환합니다. 이미지에 스토리지 제한이 설정되어 있지 않아 업로드할 수 없습니다.
문제가 처리되고 있습니다.
8.3.1.1.4. 이미지 스트림 제한
LimitRange
오브젝트를 사용하면 이미지 스트림에 대한 제한을 지정할 수 있습니다.
각 이미지 스트림에서 다음 사항이 충족되어야 합니다.
-
ImageStream
사양의 이미지 태그 수가LimitRange
오브젝트의openshift.io/image-tags
제약 조건보다 작거나 같아야 합니다. -
ImageStream
사양의 이미지에 대한 고유 참조 수가 제한 범위 오브젝트의openshift.io/images
제약 조건보다 작거나 같아야 합니다.
이미지 스트림 LimitRange
오브젝트 정의
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: openshift.io/ImageStream max: openshift.io/image-tags: 20 2 openshift.io/images: 30 3
openshift.io/image-tags
리소스는 고유 이미지 참조를 나타냅니다. 사용 가능한 참조는 ImageStreamTag
, ImageStreamImage
, DockerImage
입니다. 태그는 oc tag
및 oc import-image
명령을 사용하여 생성할 수 있습니다. 내부 참조와 외부 참조는 구분되지 않습니다. 그러나 ImageStream
사양에 태그된 각각의 고유 참조는 한 번만 계산됩니다. 내부 컨테이너 이미지 레지스트리에 대한 내보내기는 어떤 방식으로든 제한하지 않지만 태그 제한에 유용합니다.
openshift.io/images
리소스는 이미지 스트림 상태에 기록된 고유 이미지 이름을 나타냅니다. OpenShift 이미지 레지스트리로 내보낼 수 있는 여러 이미지를 제한할 수 있습니다. 내부 및 외부 참조는 구분되지 않습니다.
8.3.1.1.5. 영구 볼륨 클레임 제한
LimitRange
오브젝트를 사용하여 PVC(영구 볼륨 클레임)에 요청된 스토리지를 제한할 수 있습니다.
프로젝트의 모든 영구 볼륨 클레임에서 다음 사항이 충족되어야 합니다.
-
PVC(영구 볼륨 클레임)의 리소스 요청이
LimitRange
오브젝트에 지정된 PVC의min
제약 조건보다 크거나 같아야 합니다. -
PVC(영구 볼륨 클레임)의 리소스 요청이
LimitRange
오브젝트에 지정된 PVC의max
제약 조건보다 작거나 같아야 합니다.
PVC LimitRange
오브젝트 정의
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: "PersistentVolumeClaim" min: storage: "2Gi" 2 max: storage: "50Gi" 3
8.3.2. 제한 범위 생성
프로젝트에 제한 범위를 적용하려면 다음을 수행합니다.
필요한 사양을 사용하여
LimitRange
오브젝트를 생성합니다.apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: "Pod" 2 max: cpu: "2" memory: "1Gi" min: cpu: "200m" memory: "6Mi" - type: "Container" 3 max: cpu: "2" memory: "1Gi" min: cpu: "100m" memory: "4Mi" default: 4 cpu: "300m" memory: "200Mi" defaultRequest: 5 cpu: "200m" memory: "100Mi" maxLimitRequestRatio: 6 cpu: "10" - type: openshift.io/Image 7 max: storage: 1Gi - type: openshift.io/ImageStream 8 max: openshift.io/image-tags: 20 openshift.io/images: 30 - type: "PersistentVolumeClaim" 9 min: storage: "2Gi" max: storage: "50Gi"
- 1
LimitRange
오브젝트의 이름을 지정합니다.- 2
- Pod에 제한을 설정하려면 필요에 따라 최소 및 최대 CPU 및 메모리 요청을 지정합니다.
- 3
- 컨테이너에 제한을 설정하려면 필요에 따라 최소 및 최대 CPU 및 메모리 요청을 지정합니다.
- 4
- 선택 사항입니다. 컨테이너의 경우
Pod
사양에 지정하지 않는 경우 컨테이너에서 사용할 수 있는 기본 CPU 또는 메모리 양을 지정합니다. - 5
- 선택 사항입니다. 컨테이너의 경우
Pod
사양에 지정하지 않는 경우 컨테이너에서 요청할 수 있는 기본 CPU 또는 메모리 양을 지정합니다. - 6
- 선택 사항입니다. 컨테이너의 경우
Pod
사양에 지정할 수 있는 최대 제한 대 요청 비율을 지정합니다. - 7
- 이미지 오브젝트에 대한 제한을 설정하려면 OpenShift 이미지 레지스트리로 내보낼 수 있는 최대 이미지 크기를 설정합니다.
- 8
- 이미지 스트림에 대한 제한을 설정하려면 필요에 따라
ImageStream
오브젝트 파일에 있을 수 있는 최대 이미지 태그 및 참조 수를 설정합니다. - 9
- 영구 볼륨 클레임에 대한 제한을 설정하려면 요청할 수 있는 최소 및 최대 스토리지 양을 설정합니다.
오브젝트를 생성합니다.
$ oc create -f <limit_range_file> -n <project> 1
- 1
- 생성한 YAML 파일의 이름과 제한을 적용할 프로젝트를 지정합니다.
8.3.3. 제한 보기
웹 콘솔에서 프로젝트의 할당량 페이지로 이동하면 프로젝트에 정의된 제한을 확인할 수 있습니다.
CLI를 사용하여 제한 범위 세부 정보를 볼 수도 있습니다.
프로젝트에 정의된
LimitRange
오브젝트 목록을 가져옵니다. 예를 들어 demoproject라는 프로젝트의 경우 다음과 같습니다.$ oc get limits -n demoproject
NAME CREATED AT resource-limits 2020-07-15T17:14:23Z
관심 있는
LimitRange
오브젝트를 설명합니다(예:resource-limits
제한 범위).$ oc describe limits resource-limits -n demoproject
Name: resource-limits Namespace: demoproject Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio ---- -------- --- --- --------------- ------------- ----------------------- Pod cpu 200m 2 - - - Pod memory 6Mi 1Gi - - - Container cpu 100m 2 200m 300m 10 Container memory 4Mi 1Gi 100Mi 200Mi - openshift.io/Image storage - 1Gi - - - openshift.io/ImageStream openshift.io/image - 12 - - - openshift.io/ImageStream openshift.io/image-tags - 10 - - - PersistentVolumeClaim storage - 50Gi - - -
8.3.4. 제한 범위 삭제
활성 LimitRange
오브젝트를 제거하여 더 이상 프로젝트에 제한을 적용하지 않으려면 다음을 수행합니다.
다음 명령을 실행합니다.
$ oc delete limits <limit_name>