쿠버네티스에서 Multi-Tenancy(멀티 테넌시) 환경을 운영할 때, 각 팀(테넌트)이 사용하는 리소스를 효율적으로 관리하는 것이 중요합니다.
이번 글에서는 ResourceQuota 및 LimitRange를 활용하여 네임스페이스별 리소스를 제한하고, PriorityClass를 사용하여 리소스 우선순위를 설정하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ ResourceQuota 및 LimitRange를 활용한 네임스페이스별 리소스 제한
2️⃣ PriorityClass를 사용한 리소스 우선순위 설정
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ ResourceQuota 및 LimitRange를 활용한 네임스페이스별 리소스 제한
❓ 문제 상황
운영팀에서 여러 팀이 동일한 쿠버네티스 클러스터를 사용하지만, 특정 팀이 과도한 리소스를 사용하는 것을 방지해야 하는 요구사항이 생겼습니다.
각 네임스페이스별로 CPU, 메모리, Pod 개수 등을 제한하여 특정 테넌트가 클러스터 리소스를 독점하지 않도록 설정해야 합니다.
• team-a 및 team-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