Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.39] 🚀 Multi-Tenancy 편 #2 | 리소스 할당 및 제한 관리

ygtoken 2025. 3. 16. 18:50
728x90

 

쿠버네티스에서 Multi-Tenancy(멀티 테넌시) 환경을 운영할 때, 각 팀(테넌트)이 사용하는 리소스를 효율적으로 관리하는 것이 중요합니다.

이번 글에서는 ResourceQuota 및 LimitRange를 활용하여 네임스페이스별 리소스를 제한하고, PriorityClass를 사용하여 리소스 우선순위를 설정하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ ResourceQuota 및 LimitRange를 활용한 네임스페이스별 리소스 제한

2️⃣ PriorityClass를 사용한 리소스 우선순위 설정

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ ResourceQuota 및 LimitRange를 활용한 네임스페이스별 리소스 제한

 

❓ 문제 상황

 

운영팀에서 여러 팀이 동일한 쿠버네티스 클러스터를 사용하지만, 특정 팀이 과도한 리소스를 사용하는 것을 방지해야 하는 요구사항이 생겼습니다.

각 네임스페이스별로 CPU, 메모리, Pod 개수 등을 제한하여 특정 테넌트가 클러스터 리소스를 독점하지 않도록 설정해야 합니다.

team-ateam-b 네임스페이스에 대한 리소스 제한을 설정해야 합니다.

team-a는 최대 4개의 CPU, 8Gi 메모리, 20개의 Pod만 사용할 수 있어야 합니다.

team-b는 최대 2개의 CPU, 4Gi 메모리, 10개의 Pod만 사용할 수 있어야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. ResourceQuota를 설정하여 네임스페이스에서 사용할 수 있는 최대 리소스를 제한합니다.

 

2. LimitRange를 사용하여 각 Pod과 컨테이너가 요청할 수 있는 최소 및 최대 리소스를 지정합니다.

 


✅ 정답 Manifest (ResourceQuota 및 LimitRange 설정)

apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-a-quota
  namespace: team-a
spec:
  hard:
    cpu: "4"  # 최대 4개의 CPU 사용 가능
    memory: 8Gi  # 최대 8Gi 메모리 사용 가능
    pods: "20"  # 최대 20개의 Pod 생성 가능
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-b-quota
  namespace: team-b
spec:
  hard:
    cpu: "2"  # 최대 2개의 CPU 사용 가능
    memory: 4Gi  # 최대 4Gi 메모리 사용 가능
    pods: "10"  # 최대 10개의 Pod 생성 가능
---
apiVersion: v1
kind: LimitRange
metadata:
  name: team-a-limits
  namespace: team-a
spec:
  limits:
  - type: Container
    default:
      cpu: "500m"  # 기본 CPU 제한: 500m (0.5 vCPU)
      memory: "512Mi"  # 기본 메모리 제한: 512Mi
    defaultRequest:
      cpu: "250m"  # 기본 CPU 요청: 250m (0.25 vCPU)
      memory: "256Mi"  # 기본 메모리 요청: 256Mi

 

 


📌 적용 후 예상 결과 값

 

1. ResourceQuota 적용 확인

kubectl get resourcequota -n team-a
kubectl get resourcequota -n team-b

 

💡 예상 출력 값

NAME            CPU   MEMORY   PODS
team-a-quota    4     8Gi      20
team-b-quota    2     4Gi      10

 

2. LimitRange 적용 확인

kubectl get limitrange -n team-a

 

💡예상 출력 값

NAME           TYPE        CPU(REQUEST)   CPU(LIMIT)   MEMORY(REQUEST)   MEMORY(LIMIT)
team-a-limits  Container   250m           500m         256Mi             512Mi

 

 


2️⃣ PriorityClass를 사용한 리소스 우선순위 설정

 

❓ 문제 상황

 

운영팀에서 특정 팀(테넌트)의 워크로드가 클러스터에서 더 높은 우선순위를 가져야 하는 요구사항이 생겼습니다.

즉, 팀 A의 애플리케이션이 중요한 서비스이므로, 스케줄링 시 더 높은 우선순위를 가져야 합니다.

team-a의 Pod은 high-priority 클래스를 사용해야 합니다.

team-b의 Pod은 기본 우선순위를 유지해야 합니다.

high-priority 클래스의 Pod이 실행되지 못하면, 낮은 우선순위의 Pod이 축출(preemption)될 수 있어야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. PriorityClass를 생성하여 높은 우선순위를 가진 Pod을 설정합니다.

 

2. preemptionPolicy를 사용하여 낮은 우선순위 Pod이 제거될 수 있도록 설정합니다.

 


✅ 정답 Manifest (PriorityClass 설정)

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 100000  # 높은 우선순위 설정 (기본값보다 높아야 함)
preemptionPolicy: PreemptLowerPriority  # 낮은 우선순위의 Pod 제거 가능
globalDefault: false
description: "Team A의 중요한 애플리케이션을 위한 우선순위"
apiVersion: v1
kind: Pod
metadata:
  name: high-priority-pod
  namespace: team-a
spec:
  priorityClassName: high-priority  # 높은 우선순위 적용
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        cpu: "200m"
        memory: "256Mi"

 

 


📌 적용 후 예상 결과 값

 

1. PriorityClass 적용 확인

kubectl get priorityclass

 

💡 예상 출력 값

NAME            VALUE      GLOBAL-DEFAULT
high-priority   100000     false

 

2. 팀 A의 Pod이 우선적으로 스케줄링되는지 확인

kubectl describe pod high-priority-pod -n team-a | grep Priority

 

💡 예상 출력 값

Priority: 100000

 

3. 클러스터 자원이 부족할 경우 낮은 우선순위 Pod 제거 확인

kubectl get pods -A | grep Evicted

 

💡 예상 출력 값

team-b       low-priority-pod   0/1     Evicted
728x90