[Kubernetes] LimitRange & ResourceQuota


서론

파드의 리소스 또는 컨테이너의 리소스를 제안하고싶다면 어떻게 해야하는지에 대해서 알아본다.

Container단위의 Resources 할당/제한

# pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
  name: resource-nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx
      resources:
        requests:
          cpu: "250m"        # 최소 0.25 core 보장
          memory: "128Mi"    # 최소 128MiB 메모리 보장
        limits:
          cpu: "500m"        # 최대 0.5 core 사용 제한
          memory: "256Mi"    # 최대 256MiB 메모리 사용 제한

LimitRange

LimitRange를 생성하거나 수정한 이후에 만들어지는 새 파드에만 적용됩니다.

  • 이미 존재하는 파드에는 영향을 주지 않고 파드가 생성될 때 적용된다.

CPU

limits.default, limits.defaultRequest

  • 사용자가 리소스를 명시하지 않았을 때 자동 적용된다.
  • default: Limit 미지정 시 기본 제한값 (500m)
  • defaultRequest: Request 미지정 시 기본 요청량 (200m)

limits.max, limits.min

  • 사용자가 명시적으로 리소스를 지정할 때 적용된다.
  • 컨테이너당 CPU Request/Limit이 반드시 min(100m) 이상, max(1) 이하여야 한다.
  • 이를 벗어나면 파드 생성 거부한다. (네임스페이스 전체에 적용됨)

limits.type

  • 파드의 전체 CPU 사용량이 아닌, 파드안에 여러 컨테이너가 있는 경우 개별 컨테이너의 설정값을 적용한다.
# limit-range-cpu.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-resource-constraint
  namespace: my-namespace
spec:
  limits:
  - default:
      cpu: "500m"      # 파드에 resource를 따로 명시주지 않았을 때 적용되는 cpu limit
    defaultRequest:
      cpu: "200m"      # 파드에 resource를 따로 명시주지 않았을 때 적용되는 cpu request
    max:              
      cpu: "1"         # 파드에 명시 여부와 상관없이 cpu limit
    min:
      cpu: "100m"      # 파드에 명시 여부와 상관없이 cpu request
    type: Container

Memory

limits.default, limits.defaultRequest

  • 사용자가 리소스를 명시하지 않았을 때 자동 적용된다.
  • default: Limit 미지정 시 기본 제한값 (1Gi)
  • defaultRequest: Request 미지정 시 기본 요청량 (500Mi)

limits.max, limits.min

  • 사용자가 명시적으로 리소스를 지정할 때 적용된다.
  • 컨테이너당 Memory Request/Limit이 반드시 min(100Mi) 이상, max(2Gi) 이하여야 한다.
  • 이를 벗어나면 파드 생성 거부한다. (네임스페이스 전체에 적용됨)

limits.type

  • 파드의 전체 Memory 사용량이 아닌, 파드안에 여러 컨테이너가 있는 경우 개별 컨테이너의 설정값을 적용한다.
# limit-range-cpu.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: memory-resource-constraint
  namespace: my-namespace
spec:
  limits:
  - default:
      memory: "1Gi"      # 파드에 resource를 따로 명시주지 않았을 때 적용되는 memory limit
    defaultRequest:
      memory: "500Mi"      # 파드에 resource를 따로 명시주지 않았을 때 적용되는 memory request
    max:              
      memory: "2Gi"         # 파드에 명시 여부와 상관없이 memory limit
    min:
      memory: "100Mi"      # 파드에 명시 여부와 상관없이 memory request
    type: Container

ResourceQuota

네임스페이스에 속한 모든 파드의 자원 사용량(합산된)을 제한하고 싶다면 ResourceQuota를 사용하면 된다.

hard.requests.cpu

네임스페이스 내 요청가능한(request) 총 CPU 4개

hard.requests.memory

네임스페이스 내 요청가능한(request) 총 Memory 10GiB

hard.limits.cpu

모든 파드가 사용할 수 있는 CPU 최대치를 10GiB

hard.limits.memory

메모리 최대치를 10GiB

# limit-range-cpu.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-resource-quota
  namespace: my-namespace
spec:
  hard:
    requests.cpu: 4
	  requests.memory: 4Gi
	  limits.cpu: 10
	  limits.memory: 10Gi