Kubernetes/Kubernetes Basics

📌 Kubernetes 리소스 관리: Requests & Limits 설정하기

ygtoken 2025. 3. 3. 07:31
728x90

 

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를 사용하면 네임스페이스별 리소스 사용을 효과적으로 제한 가능!

 

 

728x90