1️⃣ Kubernetes에서 리소스 관리가 중요한 이유?
Kubernetes 클러스터에는 CPU, 메모리, 네트워크 등 제한된 리소스가 있습니다.
Pod가 너무 많은 리소스를 사용하면 다른 애플리케이션이 영향을 받을 수 있고,
반대로 리소스를 너무 적게 할당하면 성능이 저하될 수 있습니다.
Kubernetes는 Requests & Limits 설정을 통해 리소스를 효과적으로 관리할 수 있습니다.
✅ Requests → Pod가 최소한으로 보장받는 리소스
✅ Limits → Pod가 최대한 사용할 수 있는 리소스
이제 Kubernetes에서 Requests & Limits를 설정하는 방법을 살펴보겠습니다!
2️⃣ Requests & Limits란?
📌 Requests
• Pod가 최소한으로 보장받는 리소스
• 이 값보다 적은 리소스를 사용할 수도 있지만, 부족하면 다른 Pod보다 먼저 종료될 수 있음
📌 Limits
• Pod가 최대한 사용할 수 있는 리소스
• 이 값을 초과하면 Kubernetes가 자동으로 Pod를 종료(OOM Kill) 시킬 수도 있음
📌 Requests & Limits 예제
resources:
requests:
cpu: "200m" # 최소 보장 CPU (0.2 vCPU)
memory: "256Mi" # 최소 보장 메모리 (256MB)
limits:
cpu: "500m" # 최대 사용 가능 CPU (0.5 vCPU)
memory: "512Mi" # 최대 사용 가능 메모리 (512MB)
✅ Pod는 최소 0.2 vCPU & 256MB RAM을 보장받고, 최대 0.5 vCPU & 512MB RAM까지만 사용 가능
3️⃣ Requests & Limits 설정 방법
이제 Kubernetes에서 Requests & Limits를 설정하는 방법을 예제로 살펴보겠습니다.
📌 리소스 제한이 없는 Pod 예제 (pod-without-limits.yaml)
apiVersion: v1
kind: Pod
metadata:
name: no-limits-pod
spec:
containers:
- name: my-container
image: nginx
✅ 리소스 제한이 없으면 Pod가 무제한으로 CPU & 메모리를 사용할 수도 있음!
📌 Requests & Limits가 설정된 Pod 예제 (pod-with-limits.yaml)
apiVersion: v1
kind: Pod
metadata:
name: limited-pod
spec:
containers:
- name: my-container
image: nginx
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
📌 Pod 배포
kubectl apply -f pod-with-limits.yaml
📌 현재 Pod의 리소스 확인
kubectl describe pod limited-pod
✅ Requests & Limits를 설정하면 리소스 사용을 예측 가능하게 관리할 수 있음!
4️⃣ Requests & Limits 동작 테스트
📌 리소스를 초과하는 부하를 발생시키면 어떻게 될까?
✅ Step 1: CPU 부하 테스트
부하 발생용 컨테이너(Pod)를 실행하여 CPU 사용량을 증가시켜보겠습니다.
📌 CPU 부하 생성 Pod (stress-cpu.yaml)
apiVersion: v1
kind: Pod
metadata:
name: stress-cpu
spec:
containers:
- name: stress
image: polinux/stress
args:
- "--cpu"
- "2" # CPU 2개를 강제로 사용하도록 설정
resources:
requests:
cpu: "500m"
limits:
cpu: "1000m"
📌 배포 후 CPU 사용량 확인
kubectl apply -f stress-cpu.yaml
kubectl top pod
✅ CPU 사용량이 1000m(1 vCPU)를 넘으면 Kubernetes가 제한을 걸어 컨테이너 실행이 멈출 수도 있음!
✅ Step 2: 메모리 부하 테스트
📌 메모리 부하 생성 Pod (stress-mem.yaml)
apiVersion: v1
kind: Pod
metadata:
name: stress-mem
spec:
containers:
- name: stress
image: polinux/stress
args:
- "--vm"
- "1" # 메모리를 강제로 점유하도록 설정
- "--vm-bytes"
- "600M"
resources:
requests:
memory: "256Mi"
limits:
memory: "512Mi"
📌 배포 후 메모리 사용량 확인
kubectl apply -f stress-mem.yaml
kubectl top pod
✅ 메모리 사용량이 512Mi를 넘으면 OOM(Out of Memory) Kill이 발생할 수도 있음!
5️⃣ ResourceQuota를 활용한 클러스터 전체 리소스 제한
Kubernetes에서는 특정 네임스페이스 내에서 사용할 수 있는 총 리소스를 제한할 수도 있습니다.
📌 ResourceQuota 설정 (quota.yaml)
apiVersion: v1
kind: ResourceQuota
metadata:
name: namespace-quota
spec:
hard:
pods: "10" # 최대 10개 Pod 실행 가능
requests.cpu: "2" # 네임스페이스 전체에서 CPU 2개까지 요청 가능
requests.memory: "2Gi" # 네임스페이스 전체에서 2GB 메모리까지 요청 가능
limits.cpu: "4" # 네임스페이스 전체에서 CPU 4개까지 사용 가능
limits.memory: "4Gi" # 네임스페이스 전체에서 4GB 메모리까지 사용 가능
📌 적용 후 확인
kubectl apply -f quota.yaml
kubectl get resourcequota
✅ 특정 네임스페이스 내에서 전체 리소스를 제한할 수 있음!
6️⃣ Requests & Limits 설정 Best Practice
✔ CPU와 메모리 사용량을 분석하여 적절한 Requests & Limits 설정
✔ 운영 환경에서는 Requests를 설정하여 최소한의 리소스를 보장
✔ 클러스터 전체 리소스 관리를 위해 ResourceQuota 활용
✔ Pod Auto Scaling(HPA)과 함께 사용하여 유연한 확장 가능하도록 설정
📌 결론: Kubernetes 리소스 관리의 핵심 요약
기능설명
Requests | Pod가 보장받는 최소 리소스 |
Limits | Pod가 사용할 수 있는 최대 리소스 |
ResourceQuota | 특정 네임스페이스 내에서 전체 리소스를 제한 |
리소스 초과 시 동작 | CPU 초과 시 throttling, 메모리 초과 시 OOM Kill 발생 |
🔥 Requests & Limits를 설정하면 클러스터 리소스를 안정적으로 운영 가능!
🔥 ResourceQuota를 사용하면 네임스페이스별 리소스 사용을 효과적으로 제한 가능!
'Kubernetes > Kubernetes Basics' 카테고리의 다른 글
📌 Kubernetes 멀티 클러스터 운영 전략 알아보기 (0) | 2025.03.03 |
---|---|
📌 Kubernetes CI/CD: GitOps로 자동 배포 환경 구축하기 (0) | 2025.03.03 |
📌 Kubernetes HPA: 자동 확장으로 효율적인 리소스 관리하기 (0) | 2025.03.03 |
📌 Kubernetes 모니터링과 로깅: 운영 환경을 안정적으로 유지하기 (0) | 2025.03.03 |
📌 Kubernetes Helm: 애플리케이션 배포 자동화하기 (0) | 2025.03.03 |