Namespace, ResourceQuota와 LimitRange

inuit·2025년 4월 27일

All about 쿠버네티스

목록 보기
10/21
post-thumbnail

최근 업데이트일 2024-11-15

쿠버네티스: Namespaces

쿠버네티스에서 지원하는 namespace와 이를 활용하여 자원을 격리하는 ResourceQuota와 LimitRange 기능에 대해서 알아보자.

1. Namespace

클러스터 하나를 여러 개의 논리적인 단위로 나눠서 사용하게 해주는 기능

  • 하나의 장치를 여러 개인 것처럼 Pod 분류해서 관리가 용이하다.
  • 용도에 따라 실행하는 앱 구분이나 여러 사용자가 공유할 때 사용한다.
  • 쿠버네티스 자체적으로 만든 namespace 4개가 존재한다.
    • default: 기본 namespace
    • kube-system: 쿠버네티스 시스템 컴포넌트 실행
    • kube-public: 공개 접근 가능한 리소스 저장
    • kube-node-lease: node heartbeats 저장
  • 만약 namespace(API 中 가장 큰 단위)를 지우면 모든 리소스가 삭제된다.
  • Namespace는 Cluster 수준 리소스에는 적용되지 않기 때문에, Node나 Persistant Volume은 Namespace를 가지지 않는다.
  • Namespace를 너무 세분화하면 관리가 복잡해질 수 있다.
  • 사용법
    • kubectl get namespaces: namespace 조회
    • kubectl create namespace [ns_name]: namespace를 생성
    • 다른 object를 create 할 때, get 할 때, -n을 통해 namespace를 지정한다.
    • base namespace switch
      • 쿠버네티스 config의 context에 namespace를 먼저 등록 해야한다.
      • kubectl config view: 현재 쿠버네티스 config 파일 (context, cluster, user 등) 전체를 조회
      • kubectl config set-context blue@kubernetes --cluster=kubernetes --user=kubernetes-admin --namespace=blue: context를 새로 만들어 클러스터와 사용자 지정
      • kubectl config use-context blue@kubernetes: 현재 사용 중인 context를 변경해서 작업

기본적으로 컨테이너는 쿠버네티스 클러스터에서 무제한 컴퓨팅 리소스로 실행되기에 ResourceQuota를 사용하면 클러스터 관리자는 namespace로 리소스 사용과 생성을 제한할 수 있다.


2. ResourceQuota

Namespace 단위로 CPU, 메모리, 스토리지 같은 리소스 사용량을 제한하는 기능

  • 한 namespace에 과도한 리소스 소모를 방지하고 공정하게 리소스를 분배하거나, 예상 가능한 사용량으로 관리할 수 있다.
  • Namespace에 CPU/Memory ResourceQuota가 적용되면, Pod를 만들 때 반드시 requests나 limits를 설정해야 한다.
  • quota를 초과하거나 제한을 지정하지 않으면 control plane이 Pod 생성을 거부하여 더 이상 리소스를 생성할 수 없다.
  • CPU, 메모리, Pod 수, PVC 수, LoadBalancer 수 등 다양한 항목 제한 가능하다.
  • kubectl describe quota: 현재 적용된 리소스쿼터 확인 가능
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-quota
  namespace: blue
spec:
  hard:
    requests.cpu: "1"        # 전체 요청 CPU 1코어 제한
    requests.memory: 1Gi     # 전체 요청 메모리 1GiB 제한
    limits.cpu: "2"          # 전체 최대 CPU 2코어 제한
    limits.memory: 2Gi       # 전체 최대 메모리 2GiB 제한

Storage는 CPU/메모리처럼 limits 값을 설정할 수는 없지만,
resources.requests.storage로 요청량을 명시할 수 있으며, 이를 생략해도 LimitRange를 통해 기본 요청량을 자동 설정할 수 있다. Namespace 단위의 전체 사용량은 여전히 ResourceQuota를 통해 제한된다.


3. LimitRange

개별 Pod 또는 Container 수준의 최소/최대 자원 사용량을 강제하는 기능

  • 개발자가 CPU나 메모리 requests, limits을 안 적었을 때 자동 기본값을 부여한다.
  • 기본값을 설정하여 너무 과도하게 큰 리소스 설정을 막을 수 있다.
  • 요청 및 제한의 최소/최대 범위 설정 가능하다.
  • namespace 단위로 적용된다.
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
  namespace: blue
spec:
  limits:
  - default:
      memory: 512Mi         # 요청이 없을 경우 기본 메모리 512Mi
    defaultRequest:
      memory: 256Mi         # 요청 없을 경우 기본 요청 메모리 256Mi
    type: Container
profile
It’s always white night here.

0개의 댓글