[Kubernetes] LimitRange를 사용한 리소스 제한

Dragony·2022년 7월 11일
0

쿠버네티스

목록 보기
4/7
post-custom-banner

LimitRange를 사용하면 파드 등에 대해 CPU나 메모리 리소스의 최솟값과 최댓값, 기본값 등을 설정할 수 있다.

LimitRange가 네임스페이스에 제한을 주려면 네임스페이스마다 설정이 필요하다.
또, LimitRange는 신규로 파드를 생성할 떄 사용되므로 기존 파드에는 영향을 주지 않는다.

제한 가능한 항목은 기본 Requests/Limits와 그 비율, 최대/최소 리소스 이렇게 총 5가지이다.


설정 항목개요
default기본 Limits
defaultRequests기본 Requests
max최대 리소스
min최소 리소스
maxLimitRequestRatioLimits/Reqeusts의 비율

LimitRange를 설정할 수 있는 리소스는 파드/컨테이너/PVC 세가지다.
파드에서는 max/min/maxLimitReqeustsRatio를,
PVC에서는 max/min만 설정 가능하다.

파드의 경우에는 파드 내부에서 사용되는 컨테이너 리소스 합계 제한으로 max,min을 사용하고,
PVC에서는 요청 가능한 스토리지 사이즈를 제한한다.

또한 하나의 LimitRange로 여러 타입에 제한을 설정할 수도 있다.


타입사용 가능한 설정 항목
컨테이너default/defaultRequests/max/min/maxLimitRequestRatio
파드max/min/maxLimitRequestRatio
PVCmax/min


기본으로 생성되는 LimitRange

파드나 컨테이너에 대해 리소스 제한을 전혀 하지 않을 경우, 실제 노드 부하와 관계없이 계속 파드를 스케줄링한다.

스케줄러는 Requests에서 지정한 리소스를 확보할 수 있을지에 따라 스케줄링 여부를 판단한다.

그래서 모든 파드에 Requests를 지정하지 않았을 경우, 스케줄러는 계속 그 노드에 스케줄링하게 된다!!...

리소스 소비가 과도하게 많아지면, 메모리는 OOM Killer 에 의해 프로세스가 정지되지만, CPU는 전체 동작이 느려져 최악의 경우 운영체제가 동작하지 않게 된다.

-> 그래서 일부 환경에서는 기본 CPU Requests(최소)를 설정하는 LimitRange가 생성되어 있다.



컨테이너에 대한 LimitRange

컨테이너 리소스를 제한하는 경우 type: Container의 LimitRange로 설정한다.
개별적으로 컨테이너에 대해 리소스 제한을 정의하지 않고 기본 설정을 정의할 수도 있으며,
컨테이너에 허용하는 최대/최소 리소스 제한을 설정할 수도 있다.

또 maxLimitRequestRatio를 설정하면 Requests와 Limits의 차이에 따른 과도한 오버커밋도 피할 수 있다.

OverCommit ?
node를 결정할때는 requests값을 사용하지만, 실제 실행될때는 limits 값을 사용한다. 이로 인해 (limits의 합) > (node의 Allocatable한 리소스 양) 이 되고 문제가 발생할 수 있다. 이를 overcommit 상태라고 한다.


컨테이너에 리소스 제한을 하는 LimitRange 예제

apiVersion: apps/v1
kind: LimitRange
metadata:
  name: limitrange-container
  namespace: test
spec:
  limits:
  - type: Container 
    default:
      memory: 512Mi
      cpu: 500m 
    defaultRequests: 
      memory: 256Mi
      cpu: 250m
    max:
      memory: 1024Mi 
      cpu: 1000m 
    mix:
      memory: 128Mi 
      cpu: 125m 
    maxLimitRequestRatio:
      memory: 2
      cpu: 2 

이 limitRange를 설정한 상태에서, 리소스 제한을 하지 않은 파드를 기동해보면 LimitRange 값으로 설정된 것을 확인할 수 있다.



Pod에 대한 LimitRange

파드에 대해 리소스를 제한하려는 경우에는 type: Pod의 LimitRange로 설정한다.
컨테이너에서 사용하는 리소스 합계로 최대/최소를 제한한다.

apiVersion: apps/v1
kind: LimitRange
metadata:
  name: limitrange-pod 
  namespace: test
spec:
  limits:
  - type: Pod 
    max:
      memory: 2048Mi 
      cpu: 2000m 
    mix:
      memory: 128Mi 
      cpu: 125m 
    maxLimitRequestRatio:
      memory: 1.5
      cpu: 21.5


PVC에 대한 Limit Range

클라우드 환경에서는 DynamicProvisioning으로 간단히 영구 볼륨을 생성할 수 있지만, LimitRange를 설정해 놓으면 일정 용량 이상으로 볼륨을 생성하지 못하게 할 수 있다.

apiVersion: apps/v1
kind: LimitRange
metadata:
  name: limitrange-pvc
  namespace: test
spec:
  limits:
  - type: PersistentVolumeClaim
    max:
      storage: 20Gi
    min:
      storage: 3Gi

위 샘플에서는, 예를 들어 25Gi 의 pvc를 생성하려고 해도 용량 초과로 생성할 수 없다.



profile
안녕하세요 :) 제 개인 공부 정리 블로그입니다. 틀린 내용 수정, 피드백 환영합니다.
post-custom-banner

0개의 댓글