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 사양에 CPU request 값을 정의할 필요가 없습니다. 그러나 제한 범위에 지정된 최대 CPU 제약 조건을 충족하는 CPU limit 값은 지정해야 합니다.

  • 요청에 대한 컨테이너 제한 비율은 LimitRange 오브젝트에 지정된 컨테이너의 maxLimitRequestRatio 값보다 작거나 같아야 합니다.

    LimitRange 오브젝트에서 maxLimitRequestRatio 제약 조건을 정의하는 경우 새 컨테이너에 requestlimit 값이 모두 있어야 합니다. 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

1
제한 범위 오브젝트의 이름입니다.
2
Pod에서 모든 컨테이너에 요청할 수 있는 최대 CPU 양입니다.
3
Pod에서 모든 컨테이너에 요청할 수 있는 최대 메모리 양입니다.
4
Pod에서 모든 컨테이너에 요청할 수 있는 최소 CPU 양입니다.
5
Pod에서 모든 컨테이너에 요청할 수 있는 최소 메모리 양입니다.
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

1
LimitRange 오브젝트의 이름입니다.
2
OpenShift 이미지 레지스트리로 내보낼 수 있는 이미지의 최대 크기입니다.
참고

제한을 초과하는 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

1
LimitRange 오브젝트의 이름입니다.
2
imagestream 사양의 imagestream.spec.tags 매개변수에 있는 최대 고유 이미지 태그 수입니다.
3
imagestream 사양의 imagestream.status.tags 매개변수에 있는 최대 고유 이미지 참조 수입니다.

openshift.io/image-tags 리소스는 고유 이미지 참조를 나타냅니다. 사용 가능한 참조는 ImageStreamTag, ImageStreamImage, DockerImage입니다. 태그는 oc tagoc 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

1
LimitRange 오브젝트의 이름입니다.
2
영구 볼륨 클레임에서 요청할 수 있는 최소 스토리지 양입니다.
3
영구 볼륨 클레임에서 요청할 수 있는 최대 스토리지 양입니다.

8.3.2. 제한 범위 생성

프로젝트에 제한 범위를 적용하려면 다음을 수행합니다.

  1. 필요한 사양을 사용하여 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
    영구 볼륨 클레임에 대한 제한을 설정하려면 요청할 수 있는 최소 및 최대 스토리지 양을 설정합니다.
  2. 오브젝트를 생성합니다.

    $ oc create -f <limit_range_file> -n <project> 1
    1
    생성한 YAML 파일의 이름과 제한을 적용할 프로젝트를 지정합니다.

8.3.3. 제한 보기

웹 콘솔에서 프로젝트의 할당량 페이지로 이동하면 프로젝트에 정의된 제한을 확인할 수 있습니다.

CLI를 사용하여 제한 범위 세부 정보를 볼 수도 있습니다.

  1. 프로젝트에 정의된 LimitRange 오브젝트 목록을 가져옵니다. 예를 들어 demoproject라는 프로젝트의 경우 다음과 같습니다.

    $ oc get limits -n demoproject
    NAME              CREATED AT
    resource-limits   2020-07-15T17:14:23Z
  2. 관심 있는 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>