Kubernetes/Kubernetes Advanced

📌 [Pod 심화편 #1] Pod의 생성과 스케줄링 원리

ygtoken 2025. 3. 12. 11:42
728x90

 

1️⃣ 개요

 

쿠버네티스에서 Pod는 가장 기본적인 배포 단위입니다. 단순히 Pod를 생성하는 것은 쉬워 보일 수 있지만, 다양한 문제로 인해 Pod가 원하는 대로 배포되지 않거나 Pending 상태에서 멈추는 경우를 자주 경험하게 됩니다.

 

특히, 리소스 부족, 스케줄링 오류, 네트워크 정책 문제 등의 이유로 Pod 배포가 실패할 수 있으며, 이를 해결하기 위해서는 Pod가 배포되는 과정과 스케줄링 원리를 이해하는 것이 중요합니다.

 

이 글에서는 Pod가 생성되고 스케줄되는 과정을 살펴보고, 자주 발생하는 스케줄링 문제와 해결 방법을 정리하겠습니다.

 


2️⃣ Pod가 생성되는 과정 (스케줄링 원리)

 

쿠버네티스에서 Pod가 생성되는 과정은 다음과 같습니다. 이 과정을 이해하면 스케줄링 문제 발생 시 어디에서 문제가 생겼는지 빠르게 파악할 수 있습니다.

 

✅ 1. 사용자가 Pod를 생성 요청 (kubectl apply)

사용자가 kubectl apply -f pod.yaml을 실행하면 API Server가 요청을 받습니다.

API Server는 해당 Pod 객체를 etcd에 저장하고, 스케줄러가 이를 감지하도록 이벤트를 생성합니다.

 

✅ 2. Kubernetes 스케줄러가 적절한 노드를 선택

쿠버네티스 스케줄러는 클러스터 내 모든 노드의 상태를 분석한 후, Pod를 실행할 적절한 노드를 선택합니다.

이때 고려되는 요소는 다음과 같습니다.

리소스 가용성 (CPU, 메모리)

Taints & Tolerations

Node Affinity / Pod Affinity

PodDisruptionBudget

 

✅ 3. 선택된 노드에서 Kubelet이 Pod를 실행

스케줄러가 노드를 선택하면, 해당 노드에서 Kubelet이 API Server에서 스케줄된 Pod를 감지합니다.

이후 Kubelet이 컨테이너 런타임(Docker, containerd, CRI-O 등)에 요청하여 Pod 내부의 컨테이너를 실행합니다.

 


3️⃣ Pod가 스케줄되지 않는 주요 원인과 해결 방법

 

Pod가 Pending 상태에서 멈추는 경우가 있습니다. 이때 kubectl describe pod <pod-name>을 실행하면 스케줄링이 실패한 이유를 확인할 수 있습니다.

아래에서는 자주 발생하는 문제와 해결 방법을 정리해 보겠습니다.

 

🚨 [문제 1] 노드 리소스 부족 (CPU & 메모리 부족)

 

증상:

kubectl get pod 실행 시 Pending 상태로 유지됨

오류 메시지:

"Insufficient CPU" 또는 "Insufficient Memory"

해결 방법:

kubectl describe nodes 실행 후, 노드의 CPU 및 메모리 사용량 확인

kubectl top nodes로 실시간 리소스 사용률 체크

필요 시 노드 확장(Horizontal Scaling) 또는 기존 워크로드의 리소스 요청값 조정

 

📌 예제: 리소스 요청을 줄여서 해결하기

resources:
  requests:
    memory: "128Mi"
    cpu: "100m"
  limits:
    memory: "256Mi"
    cpu: "500m"

 

 


🚨 [문제 2] Taints & Tolerations 설정 문제

 

증상:

Pod가 특정 노드에 스케줄되지 않음

오류 메시지:

"No nodes are available that match all of the predicates"

해결 방법:

kubectl describe nodes | grep Taint 실행 후, Taint 설정 확인

필요한 경우 Pod에 tolerations 추가하여 특정 Taint를 허용

 

📌 예제: 특정 Taint를 허용하는 Pod 설정

tolerations:
  - key: "example-key"
    operator: "Equal"
    value: "example-value"
    effect: "NoSchedule"

 

 


🚨 [문제 3] Node Selector, Node Affinity 설정 문제

 

증상:

특정 노드에서만 실행되도록 설정했지만 해당 노드가 존재하지 않음

해결 방법:

kubectl describe pod <pod-name> 실행 후 NodeSelector 또는 Affinity 설정 확인

필요 시 조건 완화

 

📌 예제: 특정 노드에서만 실행되도록 설정 (Node Affinity)

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: "kubernetes.io/hostname"
              operator: "In"
              values:
                - "node-1"

 

 


🚨 [문제 4] Persistent Volume (PVC) 바인딩 실패

 

증상:

kubectl describe pod <pod-name> 실행 시 FailedMount 오류 발생

해결 방법:

kubectl get pvc 실행 후, PVC 상태 확인

PVC가 Pending 상태라면 kubectl describe pvc <pvc-name>로 바인딩되지 않은 이유 분석

StorageClass가 올바르게 설정되어 있는지 확인하고, 필요하면 새로운 PV를 수동으로 생성

 


4️⃣ 스케줄링 문제를 사전에 예방하는 방법

 

✅ 1. 리소스 요청 및 제한 설정

resources:
  requests:
    memory: "256Mi"
    cpu: "250m"
  limits:
    memory: "512Mi"
    cpu: "500m"

 

✅ 2. PodDisruptionBudget 설정하여 중요한 Pod 보호

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-app-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: my-app

 

✅ 3. PriorityClass 설정하여 중요한 Pod 우선 배포

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for critical workloads."

 

 


🔥 5️⃣ 결론

 

✔ Pod가 스케줄되지 않는 원인은 다양하지만, 대부분 리소스 부족, Taints & Tolerations, Node Affinity 설정 문제로 발생합니다.

kubectl describe pod, kubectl top nodes 등을 활용하여 빠르게 원인을 파악하는 것이 중요합니다.

✔ 스케줄링 문제를 방지하려면 리소스 요청을 적절히 설정하고, 중요한 Pod에는 PriorityClass를 적용하는 것이 효과적입니다.

 

728x90