[Project] Multi-Tenant K8s Cluster on ARM64 - (4) Dynamic Resource Quota - CPU/Memory

developowl·2026년 3월 6일
post-thumbnail

지난번에 스토리지에 대한 제한 및 격리를 진행했습니다. 이번에는 CPU와 RAM에 대한 제한과 격리 작업을 진행해보겠습니다.


1. [기능 설명] CPU/RAM 격리 및 할당

  • 테넌트가 생성하는 파드들이 사용하는 물리적인 연산 자원(CPU/RAM)을 제한하는 기능

1-1. 주요 설계 목표

  • 안전한 멀티 테넌시 : 특정 테넌트의 코드가 무한 루프에 빠져 CPU를 점유하거나, 메모리 누수가 발생해도 다른 테넌트와 마스터 노드의 동작에 영향을 주지 않아야 함
  • 사양 정의 : t2.micro 인스턴트처럼 1 vCPU, 1GiB RAM 수준의 리소스 프로파일을 테넌트 네임스페이스에 강제함

1-2. 필요한 쿠버네티스 기술 객체

ResourceQuota (총량)

  • 네임스페이스 전체에서 돌아가는 모든 파드들의 자원 합계를 제한함
    • → 비유: 지갑(네임스페이스)의 총액(네임스페이스가 갖는 리소스) 제한

LimitRange (개별)

  • 파드 하나가 가질 수 있는 최소/최대 자원 크기를 결정
  • 테넌트가 자원 설정을 누락하고 파드를 띄울 때 자동으로 적용될 기본값을 부여
    • → 비유: 지갑(네임스페이스) 안에서 꺼내 쓰는 지폐 한 장(파드가 갖는 리소스)의 단위 제한

📌 자원 제한의 기준 Requests 와 Limits

💡 라즈베리파이는 저전력 장치이기에,, 특정 테넌트에서 OOM이 발생하게 될 경우 노드 전체가 멈추는 Freeze 상황에 놓이기 쉽습니다. 때문에 limits.memory 설정이 필수적입니다!

  • Requests (보장량)

    • 파드가 실행되기 위해 최소한으로 필요한 자원
    • K8s 스케줄러는 노드에 보장량 만큼의 여유 공간이 있을 때만 파드를 배치함
  • Limits (상한선)

    • 파드가 최대로 사용할 수 있는 자원
    • CPU: Limit을 넘으면 스로틀링(Throttling)이 발생하여 속도가 느려지지만 파드가 죽지는 않음
    • Memory: Limit 을 넘으면 커널이 파드를 즉시 종료시킴.(OOM Kill)
      • → Memory 는 압축할 수 없는 자원이기 때문

2. [기능 개발] 연산 자원 쿼터 및 제한 매니페스트 작성

2-1. 연산 자원 총량 정의 (tenant-compute-quota.yaml)

  • 네임스페이스 전체의 장부 역할
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: tenant-alpha
spec:
  hard:
    requests.cpu: "500m"      # 0.5 코어 보장
    requests.memory: "512Mi"  # 512MiB 보장
    limits.cpu: "1000m"       # 최대 1 코어 (1000m = 1 vCPU)
    limits.memory: "1Gi"      # 최대 1GiB (t2.micro 급)

2-2. 기본 규격 강제 정의 (tenant-compute-limit.yaml)

  • 테넌트가 자원 설정을 누락하더라도 기본값을 넣어주는 설정
apiVersion: v1
kind: LimitRange
metadata:
  name: compute-limit-range
  namespace: tenant-alpha
spec:
  limits:
  - type: Container
    default:                 # Limit 미설정 시 자동 부여
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:          # Request 미설정 시 자동 부여
      cpu: "200m"
      memory: "256Mi"
    max:                     # 개별 컨테이너가 가질 수 있는 최대치
      cpu: "800m"
      memory: "800Mi"

3. [검증 테스트] 쿼터 및 제한 적용 후 검증

  • 매니페스트를 적용한 후, 테넌트가 자원을 지정하지 않고 파드를 생성했을 때 관리자가 정한 기본값이 정상적으로 주입되는지 확인

3-1. 매니페스트 적용

kubectl apply -f tenant-compute-quota.yaml
kubectl apply -f tenant-compute-limit.yaml

3-2. 테스트용 파드 생성 (test-pod.yaml)

apiVersion: v1
kind: Pod
metadata:
  name: limit-test-pod
  namespace: tenant-alpha
spec:
  containers:
  - name: nginx
    image: nginx
  • 실행
kubectl apply -f test-pod.yaml

3-3. 주입된 값 검증

kubectl get pod limit-test-pod -n tenant-alpha -o yaml

마무리

이제 테넌트가 CPU와 RAM을 마음껏 사용해도(제한된 범위 내에서) 다른 테넌트에 영향을 주지 않게 되었습니다. 리소스에 대한 제한과 격리는 잘 되었습니다만, 다른 테넌트에 네트워크로 접속해서 데이터를 훔쳐보는(??) 상황은 아직 처리를 안 한 것 같습니다. 다음에는 Zero-Trust Network Policy 를 통해 네트워크 통신까지 제한하는 작업을 해보겠습니다.

profile
Don’t get mad at the computer.

0개의 댓글