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를 적용하는 것이 효과적입니다.
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [Pod 심화편 #3] Pod의 네트워크 문제와 디버깅 방법 (0) | 2025.03.12 |
---|---|
📌 [Pod 심화편 #2] Pod의 리소스 관리와 OOM(Out of Memory) 문제 해결 (0) | 2025.03.12 |
Kubernetes 리소스 시리즈 #18: Helm (패키지 관리 및 배포 자동화) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #17: Operator (확장 및 기타 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #16: CustomResourceDefinition(CRD) (확장 및 기타 리소스) (0) | 2025.03.05 |