목차

Kubernetes Namespace - ResourceQuota & LimitRange

Kubernetes Namespace에서 이어집니다.

NS별 자원 소비 제어를 위한 두 가지 오브젝트 → ResourceQuota, LimitRange

  • ResourceQuota: NS가 사용 가능한 총 리소스 상한선 설정
    • 특정 애플리케이션의 자원 독점을 방지 → 다른 애플리케이션의 상대적 성능저하 방지
    • CPU, Memory, Pod 수, PVC 수, Service 수 등 제한 가능
  • LimitRange: NS 내 개별 컨테이너 또는 Pod에 대한 기본값(default) 및 제한값 설정
    • 컨테이너에 requests/limits 미지정 시 자동 적용되는 기본값 설정 가능
    • 최솟값(min), 최댓값(max), 기본값(default), 기본 요청값(defaultRequest) 설정 가능

resourcequota.yaml

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
  namespace: dev-ns
spec:
  hard:
    requests.cpu: "2"
    requests.memory: 2Gi
    limits.cpu: "4"
    limits.memory: 4Gi
    pods: "10"
    services: "5"
    persistentvolumeclaims: "5"

적용 및 확인

#ns 생성
$ kubectl create ns dev-ns
namespace/dev-ns created

#quota 적용
$ kubectl apply -f resourcequota.yaml
resourcequota/dev-quota created

#quota 확인
$ kubectl get resourcequota -n dev-ns
NAME        AGE   REQUEST                                             LIMIT
dev-quota   10s   pods: 0/10, requests.cpu: 0/2, ...                 limits.cpu: 0/4, ...

$ kubectl describe resourcequota dev-quota -n dev-ns
Name:                   dev-quota
Namespace:              dev-ns
Resource                Used  Hard
--------                ----  ----
limits.cpu              0     4
limits.memory           0     4Gi
persistentvolumeclaims  0     5
pods                    0     10
requests.cpu            0     2
requests.memory         0     2Gi
services                0     5

ResourceQuota 적용 시 Pod 생성

  • ResourceQuota 적용된 NS에서는 Pod 생성 시 반드시 requests/limits 명시 필요
    • 미지정 시 Pod 생성 실패 → failed quota: must specify limits.cpu, limits.memory
#requests/limits 없이 생성 시도 → 실패
$ kubectl run quota-test --image nginx -n dev-ns
Error from server (Forbidden): pods "quota-test" is forbidden:
failed quota: dev-quota: must specify limits.cpu for: quota-test; ...

#requests/limits 지정 시 정상 생성
$ kubectl run quota-test --image nginx -n dev-ns \
  --requests='cpu=100m,memory=128Mi' \
  --limits='cpu=200m,memory=256Mi'
pod/quota-test created

$ kubectl describe resourcequota dev-quota -n dev-ns
Name:                   dev-quota
Namespace:              dev-ns
Resource                Used    Hard
--------                ----    ----
limits.cpu              200m    4
limits.memory           256Mi   4Gi
pods                    1       10
requests.cpu            100m    2
requests.memory         128Mi   2Gi

limitrange.yaml

apiVersion: v1
kind: LimitRange
metadata:
  name: dev-limitrange
  namespace: dev-ns
spec:
  limits:
  - type: Container
    default:           # limits 기본값 (미지정 시 자동 적용)
      cpu: 500m
      memory: 256Mi
    defaultRequest:    # requests 기본값 (미지정 시 자동 적용)
      cpu: 100m
      memory: 128Mi
    max:               # 최댓값 (이 값 초과 시 생성 거부)
      cpu: "2"
      memory: 1Gi
    min:               # 최솟값 (이 값 미만 시 생성 거부)
      cpu: 50m
      memory: 64Mi

적용 및 확인

$ kubectl apply -f limitrange.yaml
limitrange/dev-limitrange created

$ kubectl describe limitrange dev-limitrange -n dev-ns
Name:       dev-limitrange
Namespace:  dev-ns
Type        Resource  Min   Max  Default Request  Default Limit  ...
----        --------  ---   ---  ---------------  -------------  ---
Container   cpu       50m   2    100m             500m           ...
Container   memory    64Mi  1Gi  128Mi            256Mi          ...

LimitRange 동작 확인

#requests/limits 미지정 → LimitRange 기본값 자동 적용
$ kubectl run lr-test --image nginx -n dev-ns
pod/lr-test created

$ kubectl get po lr-test -n dev-ns -o yaml | grep -A 6 resources
    resources:
      limits:
        cpu: 500m        # LimitRange default 자동 적용
        memory: 256Mi
      requests:
        cpu: 100m        # LimitRange defaultRequest 자동 적용
        memory: 128Mi

#max 초과 시 생성 거부
$ kubectl run lr-over --image nginx -n dev-ns \
  --limits='cpu=4,memory=2Gi'
Error from server (Forbidden): pods "lr-over" is forbidden:
maximum cpu usage per Container is 2, but limit is 4.

  • LimitRange로 컨테이너별 기본값/상한 설정 → ResourceQuota로 NS 전체 총량 제한
    • LimitRange가 없으면 ResourceQuota 적용 NS에서 Pod 생성 시 매번 requests/limits를 수동 지정해야 함
    • 두 오브젝트를 함께 설정하면 개발자가 리소스 미지정 시에도 기본값이 자동 적용되어 운영 편의성 향상
#현재 사용량 요약 확인
$ kubectl get resourcequota,limitrange -n dev-ns
NAME                          AGE   REQUEST                                    LIMIT
resourcequota/dev-quota       5m    pods: 2/10, requests.cpu: 200m/2, ...     limits.cpu: 1/4, ...

NAME                        CREATED AT
limitrange/dev-limitrange   2024-04-22T08:00:00Z