Study/Cloud

[Cloud]Kubernetes - ResourceQuota, LimitRange

seomj 2024. 7. 19. 20:35

Resource Quota와 Limit Range에 대해 알게 되었는데 개념이 헷갈려 기록해두고자 한다.


본격적인 내용을 다루기 전에 Namespace에 대해 잠깐 짚고 넘어가도록 하자.

Namespace

쿠버네티스 클러스터 하나를 여러 개의 논리적인 단위로 나눠서 사용하는 것

덕분에 클러스터 하나를 여러 개의 팀이나 사용자가 공유할 수 있다.

클러스터 안에서 용도에 따라 구분할 때 사용할 수 있다.

 

쿠버네티스에서 클러스터 다음으로 분리 단위가 큰 것이 NS이다.

 

Resource Quota

Namespace별 총 리소스 사용을 제한하는 제약 조건을 제공한다.

유형별로 NS에서 만들 수 있는 오브젝트 수와 해당 NS의 리소스가 사용할 수 있는 총 컴퓨트 리소스의 양을 제한할 수 있다.

여러 사용자나 팀이 정해진 수의 Node로 클러스터를 공유할 때 한 팀이 공정하게 분배된 리소스보다 많은 리소스를 사용할 수 있는 우려를 해결하기 위한 도구이다.

 

Pod가 생성될 때 이미 실행되고 있는 Pod와 작성 요청을 한 Pod의 Requests 값을 더하여 Resource Quota를 넘었는지 확인하고, 넘은 경우는 Pod 생성이 실패된다.

 

요청(request)은 컨테이너에 대해 보장된 CPU 또는 메모리 리소스를 정의

제한(limit)은 다른 컨테이너의 사용량에 따라 컨테이너가 사용할 수 있는 메모리 또는 CPU 임계값을 의미

 

Limit Range

NS의 각 적용 가능한 오브젝트 종류에 대해 지정할 수 있는 리소스 할당을 제한하는 정책

 

쿠버네티스의 Resource Quota를 사용하면 클러스터 관리자는 NS별로 리소스 사용과 생성을 제한할 수 있다.

NS 내에서 Pod는 NS의 Resource Quota에 정의된 만큼의 CPU와 메모리를 사용할 수 있다.

클러스터 운영자 또는 NS 수준 관리자는 단일 오브젝트가 NS 내에서 사용 가능한 모든 리소스를 독점하지 못하도록 하는 것에 대해 우려할 수도 있다. 즉, 하나의 Pod 또는 컨테이너가 사용 가능한 모든 리소스를 독점할 수 있는 우려가 있다. 이를 해결하기 위한 도구로, NS에서 움직이는 Pod 하나하나의 리소스량의 상한을 설정한다.

 

NS에 제한을 주려면 NS마다 설정이 필요하다.

또한, 신규로 Pod를 생성할 때 사용되기에 기존의 Pod에는 영향을 주지 않는다.

 

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

LimitRange를 설정할 수 있는 리소스는 파드/컨테이너/PVC 3가지다.

(Pod에서는 max/min/maxLimitRequestRatio를, PVC에서는 max/min만 설정 가능)

 

공식문서에 나와있는 예제이다.

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-resource-constraint
spec:
  limits:
  - default: # 이 섹션에서는 기본 한도를 정의한다
      cpu: 500m
    defaultRequest: # 이 섹션에서는 기본 요청을 정의한다
      cpu: 500m
    max: # max와 min은 제한 범위를 정의한다
      cpu: "1"
    min:
      cpu: 100m
apiVersion: v1
kind: Pod
metadata:
  name: example-no-conflict-with-limitrange-cpu
spec:
  containers:
  - name: demo
    image: registry.k8s.io/pause:2.0
    resources:
      requests:
        cpu: 700m
      limits:
        cpu: 700m

LimitRange를 보면 min은 100m이고, max는 1(1000m)이다.

Pod의 cpu 요청과 제한 모두 700m이므로 규칙을 준수하고 있다.

 

 

 

 

 

 

+)  cgroup?

번외로 cgroup이랑도 좀 헷갈려 함께 정리해두고자 한다.

(그새 다 까먹고 개념이 뒤죽박죽이다...)

 

cgroup: 프로세스 모음의 리소스 사용량(CPU, 메모리, 디스크 I/O, 네트워크 등)을 제한, 설명 및 격리하는 Linux 커널 기능

 

cgroup은 컨테이너에서 함께 제어해야 하는 여러 프로세스가 실행되는 경우가 많기에 중요하다.

k8s에서 cgroup을 사용하여 Pod 수준에서 리소스 요청 및 제한 및 해당 QoS 클래스를 구현할 수 있다. (*QoS: Quality of Service)

 

 

cgroup vs ns (feat. ChatGPT)

  • 목적:
    • cgroup: 시스템 리소스의 사용을 제한하고 관리합니다.
    • 네임스페이스: 프로세스 및 시스템 리소스를 격리하여 독립된 가상 환경을 제공합니다.
  • 적용 범위:
    • cgroup: 리소스 관리와 제한은 프로세스 그룹(컨트롤 그룹)에 적용됩니다.
    • 네임스페이스: 리소스 격리는 네임스페이스 단위로 적용되며, 각 네임스페이스는 독립된 리소스와 환경을 가집니다.
  • 사용 사례:
    • cgroup: 리소스 사용량을 제한하고 모니터링하며, 여러 프로세스 그룹 간에 자원을 공정하게 배분합니다.
    • 네임스페이스: 프로세스와 리소스를 격리하여 컨테이너화된 환경을 제공하고, 각 컨테이너가 독립된 시스템처럼 동작할 수 있게 합니다.
  • 작동 방식:
    • cgroup: 시스템 리소스(CPU, 메모리 등)를 제어하고 모니터링하는 데 중점을 둡니다.
    • 네임스페이스: 시스템 리소스(프로세스, 네트워크 등)를 격리하여, 각 네임스페이스가 독립된 환경을 유지하게 합니다.

 

cgroup vs Resource Quota vs Limit Range (feat. ChatGPT)

  • cgroup:
    • 레벨: 리눅스 커널
    • 적용 범위: 개별 프로세스 그룹
    • 목적: 세밀한 리소스 제어 및 격리
  • Resource Quota:
    • 레벨: Kubernetes 네임스페이스
    • 적용 범위: 네임스페이스 전체
    • 목적: 네임스페이스별 리소스 사용 한도 설정 및 관리
  • Limit Range:
    • 레벨: Kubernetes 네임스페이스
    • 적용 범위: 네임스페이스 내 개별 포드/컨테이너
    • 목적: 포드/컨테이너별 최소 및 최대 리소스 요청/제한 설정

 

 

 

참고

https://kubernetes.io/ko/docs/concepts/policy/limit-range/

https://kubernetes.io/ko/docs/concepts/policy/resource-quotas/

https://kimjingo.tistory.com/130

https://velog.io/@landau/Kubernetes-resource-quotas-%EC%82%AC%EC%9A%A9%EB%B2%95

https://velog.io/@holicme7/Kubernetes-LimitRange%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EC%A0%9C%ED%95%9C

https://nginxstore.com/blog/kubernetes/%EB%84%A4%EC%9E%84%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%99%80-cgroup%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%91%EB%8F%99%ED%95%A9%EB%8B%88%EA%B9%8C/#2