Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.2] 🚀 POD 편 #2 | 리소스 제한 & 특정 노드 실행

ygtoken 2025. 3. 15. 13:21
728x90

 

 

쿠버네티스에서 애플리케이션이 무분별하게 리소스를 사용하지 않도록 제한하고,

특정 노드에서만 실행되도록 설정하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ 특정 리소스 제한을 적용한 Pod 실행

2️⃣ 특정 노드에서만 실행되는 Pod (Node Affinity)

 

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

 


1️⃣ 특정 리소스 제한을 적용한 Pod 실행

 

📍 상황 설명

 

운영팀에서 특정 애플리케이션이 과도한 리소스를 사용하지 않도록 제한하려 합니다.

이 애플리케이션은 CPU를 많이 사용하므로 적절한 CPU 및 메모리 제한을 설정해야 합니다.

Pod의 이름은 resource-limited-app이어야 합니다.

CPU 사용량은 기본 요청 250m, 최대 500m로 설정해야 합니다.

메모리는 기본 요청 128Mi, 최대 256Mi로 설정해야 합니다.

 


🛠️ 해결 방법

 

1. Pod에서 CPU 및 메모리 요청(Request)과 제한(Limit)을 설정해야 합니다.

resources.requests를 설정하여 기본적으로 보장할 리소스 크기를 지정합니다.

resources.limits를 설정하여 최대 사용할 수 있는 리소스를 제한합니다.

 


✅ 정답 Manifest (리소스 제한이 적용된 Pod)

apiVersion: v1
kind: Pod
metadata:
  name: resource-limited-app  # Pod의 이름
spec:
  containers:
  - name: my-app
    image: my-app:latest  # 애플리케이션 컨테이너
    resources:
      requests:
        cpu: "250m"  # 최소 보장할 CPU (250 milliCPU)
        memory: "128Mi"  # 최소 보장할 메모리
      limits:
        cpu: "500m"  # 최대 사용할 수 있는 CPU (500 milliCPU)
        memory: "256Mi"  # 최대 사용할 수 있는 메모리

 

 


📌 적용 후 예상 결과 값

 

1) Pod 생성 확인

kubectl get pods

 

💡 예상 출력 값

NAME                  READY   STATUS    RESTARTS   AGE
resource-limited-app  1/1     Running   0          5s

 

2) Pod의 리소스 제한 확인

kubectl describe pod resource-limited-app | grep -A 5 "Limits"

 

💡 예상 출력 값

    Limits:
      cpu:     500m
      memory:  256Mi
    Requests:
      cpu:     250m
      memory:  128Mi

 

 


2️⃣ 특정 노드에서만 실행되는 Pod (Node Affinity)

 

📍 상황 설명

 

GPU가 있는 특정 노드에서만 머신러닝 애플리케이션을 실행해야 합니다.

이 애플리케이션은 GPU가 있는 노드에서만 배포되도록 설정해야 합니다.

Pod의 이름은 gpu-app이어야 합니다.

my-ml-app:latest 이미지를 실행해야 합니다.

nvidia-gpu 라벨이 있는 노드에서만 실행되도록 설정해야 합니다.

 


🛠️ 해결 방법

 

1. Node Affinity를 설정하여 특정 라벨이 있는 노드에서만 실행되도록 합니다.

requiredDuringSchedulingIgnoredDuringExecution을 사용하여 반드시 지정된 조건의 노드에서 실행되도록 설정합니다.

matchExpressions를 활용하여 nvidia-gpu 라벨이 있는 노드에서만 실행되도록 만듭니다.

 


✅ 정답 Manifest (Node Affinity가 적용된 Pod)

apiVersion: v1
kind: Pod
metadata:
  name: gpu-app  # Pod의 이름
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: nvidia-gpu  # 이 라벨이 있는 노드에서만 실행됨
            operator: Exists
  containers:
  - name: my-ml-app
    image: my-ml-app:latest  # 머신러닝 애플리케이션 컨테이너

 

 


📌 적용 후 예상 결과 값

 

1) Pod 생성 확인

kubectl get pods

 

💡 예상 출력 값

NAME       READY   STATUS    RESTARTS   AGE
gpu-app    1/1     Running   0          5s

 

2) Pod의 노드 배치 상태 확인

kubectl get pod gpu-app -o wide

 

💡 예상 출력 값

NAME       READY   STATUS    RESTARTS   AGE   NODE
gpu-app    1/1     Running   0          5s    gpu-node-1

 

728x90