리밋 레인지
LimitRange는 Pod나 PVC 등과 같은 쿠버네티스 객체가 사용할 수 있는 리소스를 제한하는 쿠버네티스 객체다. ResoureQuota와 함께 클러스터 리소스 관리를 위해 사용하며, 네임스페이스 별로 또는 클러스터 단위로 생성할 수 있다.
필요성
쿠버네티스 클러스터에는 여러 네임스페이스가 존재하고, 각 네임스페이스에는 Pod를 포함한 여러 객체가 존재할 수 있다. Pod는 클러스터 내 자원을 사용해서 동작하는데, 클러스터 관리자는 특정 네임스페이스가 클러스터 자원을 독점하지 않도록 ResoureQuota를 이용해 네임스페이스 별로 사용할 수 있는 리소스의 총량을 제한할 수 있다.
하지만 임의의 포드가 네임스페이스에 할당된 리소스를 전부 사용하는 경우, 해당 네임스페이스에서 다른 포드가 동작하지 못하면서 서비스 장애가 발생할 수 있다.
이런 경우 리밋레인지를 사용해 사용해 포드가 사용할 수 있는 자원량을 제한하는 방법으로 서비스 장애를 예방할 수 있다.
네임스페이스와 리소스쿼터, 리밋레인지의 관계를 그림으로 표하면 위와 같다.
동작 방식
클러스터 관리자가 LimitRange를 생성하면, LimitRange 어드미션 컨트롤러는 컴퓨터 리소스 요청이 없는 Pod에 대한 기본 requests와 limits를 적용한다. LimitRange 조건을 위반하는 리소스를 생성하거나 업데이트하는 경우 403 FORBIDDEN 코드와 함께 요청을 거부할 수 있으며, 리소스 사용향을 추적하여 LimitRange 설정을 만족하는지 확인한다.
CPU/MEMORY와 같은 컴퓨팅 리소스에 대해 제한을 설정한 경우, Pod 생성 시 해당 리소스에 대한 request와 limit을 지정해야 한다.
다만 LimitRange 유효성 검사는 pod 어드미션 단계에서만 수행되므로, 이미 존재하는 pod에 대해서는 소급 적용되지 않는다.
생성
LimitRange는 create 명령으로 생성이 불가능하고, yaml 형식을 통해서만 생성할 수 있다.
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-resource-constraint
spec:
limits:
- default: # 기본 한도 정의
cpu: 500m
defaultRequest: # 기본 request 정의
cpu: 500m
max: # max/min 정의
cpu: "1"
min:
cpu: 100m
참고로 적용 기본값의 일관성을 확인하지 않기 때문에 limit을 request 보다 작게 지정할 수 있다. 이런 경우, pod를 스케쥴링할 수 없다.
타입 | 사용 가능한 설정 항목 |
컨테이너 | default/defaultRequests/max/min/maxLimitRequestRatio |
파드 | max/min/maxLimitRequestRatio |
PVC | max/min |
확인
생성한 LimitRange는 get 명령 또는 describe 명령으로 확인할 수 있다.
kubectl get limitranges
kubectl describe limitranges
get 명령으로는 목록에 대한 정보만 확인할 수 있고, describe 명령으로 유형, 자원, 최대/최소/기본 request/limit 정보 등을 확인할 수 있다.
참고 문서
https://kubernetes.io/ko/docs/concepts/policy/limit-range/
https://dev-youngjun.tistory.com/23