[Kubernetes] 리소스 쿼터(Resource Quota)와 리밋 레인지(Limit Range)

vinca·2023년 12월 18일
0

☸️ kubernetes

목록 보기
30/35

Introduction

시스템의 자원량의 사용을 제한하는 방법인 리소스 쿼터와 리밋 레인지에 대해서 알아보자.

리소스 쿼터

리소스 쿼터는 네임스페이스 단위로 시스템의 총 자원량을 제한할 수 있는 방법이다.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota-dev1
  namespace: dev1
spec:
  hard:
    pods: 10
    managed-nfs-storage.storageclass.storage.k8s.io/persistentvolumeclaims: "2"
    managed-nfs-storage.storageclass.storage.k8s.io/requests.storage: "2Gi"
    #persistentvolumeclaims: "2"
    #requests.storage: "2Gi"

dev1 네임스페이스에 대해서 pods 는 10개, persistentvolumeclaims는 2개, storage는 2Gi로 제한하였다.

# dev1 네임스페이스의 리소스 쿼터 확인
k get resourcequotas -n dev1

3Gi 스토리지 테스트

dev1 네임스페이스에 3Gi 스토리지를 가지는 PV를 할당하려고 테스트 해보자.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: quota-3g-pvc-failure
  namespace: dev1
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 3Gi
  storageClassName: managed-nfs-storage

2Gi 까지 스토리지가 제한되어 실패했다는 메세지가 출력되는 것을 확인할 수 있다.

1Gi 스토리지 테스트 x 3회

dev1 네임스페이스에 1Gi 스토리지를 가지는 PV를 할당하도록 해보자.
이를 총 3번 반복하면 어떻게 될까?

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: quota-1g-pvc1 # 총 3번 배포
  namespace: dev1
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: managed-nfs-storage

최대 2Gi로 제한되어 있으므로 3번째(3Gi)를 할당할 때 실패하는 것을 확인할 수 있다.

pod 20개 바포

apiVersion: apps/v1
kind: Deployment
metadata:
  name: quota-pod11-failure
  namespace: dev1
spec:
  replicas: 20
  selector:
    matchLabels:
      app: quota-pod11-failure
  template:
    metadata:
      labels:
        app: quota-pod11-failure
    spec:
      containers:
      - name: nginx
        image: nginx

dev1 네임스페이스에 파드를 총 20개를 요청했지만 리소스 쿼터의 pod 정책에 의해서 최대 10개가 생성된 것을 확인할 수 있다.

실패 로그 확인

# 컨트롤러 매니저의 로그를 통해서 확인
k logs -n kube-system kube-controller-manager-m-k8s | tail
# replicasets의 describe에서도 확인 가능
k describe -n dev1 replicasets.apps

이러한 파드를 생성하고 삭제를 담당하는 것은 kube-controller-manager에서 관리되는 replication controller 가 수행하므로 컨트롤러 매니저의 로그에서 실패 메세지를 확인할 수 있다.

리밋 레인지

리밋 레인지는 네임스페이스 내의 각 개별 파드나 컨테이너가 사용할 수 있는 최소 및 최대 자원의 범위를 설정할 수 있는 방법이다.

바로 실습을 통해 확인해 보자.

실습

LimitRange 코드를 살펴보자.

PVC의 최대 크기를 2Gi로 설정하고 최소 크기를 1Gi로, Container의 default(최대 값)을 512Mi로 defaultRequest(기본 값)을 256Mi로 설정하였다.

apiVersion: v1
kind: LimitRange
metadata:
  name: limits-dev2
  namespace: dev2
spec:
  limits:
  - type: PersistentVolumeClaim
    max:
      storage: 2Gi
    min:
      storage: 1Gi
  - type: Container
    default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi

3번 노드에 배포

6개의 파드를 dev2 네임스페이스를 가지고 모두 3번노드에 배포하면 어떻게 될까?

apiVersion: apps/v1
kind: Deployment
metadata:
  name: limits-defaultrequest
  namespace: dev2
spec:
  replicas: 6 # will be out of memory
  selector:
    matchLabels:
      app: limits-defaultrequest
  template:
    metadata:
      labels:
        app: limits-defaultrequest
    spec:
      containers:
      - name: chk-log
        image: sysnet4admin/chk-log
        volumeMounts:
        - name: pvc-vol
          mountPath: /audit
      volumes:
      - name: pvc-vol
        persistentVolumeClaim:
          claimName: limits-1g-pvc
      nodeName: w3-k8s # 모두 3번 노드에 배포

defaultRequest(기본 값)을 256Mi으로 설정하였고, 현재 워커노드(VM)에 할당된 메모리는 1.5Gi이므로 6개의 파드를 배포하게되면 메모리 초과가 발생할 것이다.

실제로 해당 파일을 통해서 6개의 파드를 배포해보면 메모리가 부족하여 파드의 생성이 중지되며, 오류가 지속적으로 발생하는 것을 확인할 수 있다.

  • 파드가 무한정 생성되고 중지 상태로 빠지는 결과를 확인할 수 있다..무려 316개..
    여기서 wc -l 명령어는 출력의 행 수를 세어서 결과로 반환하는 명령어이다.

결론

결론적으로, 리소스 쿼터는 네임스페이스의 전체 자원 사용을 제한하는 반면, 리밋 레인지는 네임스페이스 내의 개별 파드, 컨테이너, PVC의 상세한 자원의 최소 및 최대 자원 사용 범위를 제한한다.

이 두 가지 기능을 함께 사용함으로써, 쿠버네티스 클러스터의 자원 사용을 효율적으로 관리하고 제어할 수 있다.

Reference

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

0개의 댓글