728x90
🚨 Error :
🚨
Pod를 여러 개 띄우고 테스트하는 도중에 새 Pod를 생성하자 Pending 상태가 지속되다가 한참 지나서 Running으로 변경되는 상황이 발생했다.
Pod에 문제가 발생하여 Running 상태가 되지 못하면 아래 명령어로 Pod의 Event를 확인할 수 있다.
$ kubectl describe po <pod명>
# 출력
...
Warning FailedScheduling 6m21s default-scheduler 0/2 nodes are available:
1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: },
1 node(s) had untolerated taint {node.kubernetes.io/disk-pressure: }.
preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.
- Pod를 노드에 띄울 때 해당 Pod가 어느 노드에 띄워질지를 결정하는 여러 요인 중 하나가 taint와 toleration이다.
- 아주 간단하게 설명하면 taint는 얼룩이라는 의미로 node에 얼룩을 묻히는 것이라고 볼 수 있다.
- 이 얼룩이란 예를 들어 모기 기피제이다.
- 반대로 toleraiton은 taint에 저항할 수 있음을 의미한다.
- 예를 들어 모기 기피제에 내성이 있는 모기이다.
- 모기 기피제가 발린 노드에는 일반 모기가 접근하지 못한다.
- 이를 Pod로 바꿔 얘기하면, 모기 기피제에 내성을 가지고 있지 않은 Pod(모기)는 해당 노드에 스케줄링(실행)될 수 없다.
🤓 원인 :
- 따라서 위 에러는 node-role.kubernetes.io/control-plane, node.kubernetes.io/disk-pressure라는 두 taint에 내성을 가지지 못한 Pod가 해당 노드에 스케줄링되지 못한 것이다.
- 기본적으로 control-plane(마스터 노드)에는 파드가 스케줄링되지 않는다.
- 그 이유 역시 node-role.kubernetes.io/control-plane이 taint 때문이다.
- 이는 마스터 노드에 설정되어 있는 기본 taint이다.
- describe 명령어로 마스터노드의 taint 부분을 살펴보면
- Taints: node-role.kubernetes.io/control-plane:NoSchedule라고 되어있다.
- 이제 에러가 발생한 이유를 추측해보자.
- 앞서 node.kubernetes.io/disk-pressure이라는 taint로 인해 Pod가 워커 노드로의 스케줄링에 실패했을 것이다.
- 이후 control-plane(마스터노드)에 스케줄링을 하려다가 node-role.kubernetes.io/control-plane라는 taint로 인해 또 실패하여 위와 같은 에러가 발생한 것으로 보인다.
🚒 해결 :
node.kubernetes.io/disk-pressure
- node.kubernetes.io/disk-pressure는 노드의 디스크 사용량이 높아서 추가적인 리소스를 할당할 수 없다는 것을 나타낸다.
- 디스크 압박 상태에서는 해당 노드에 Pod를 스케줄링할 수 없다.
💡
워커 노드의 디스크 용량에 비해 Pod가 너무 많이 띄워져 있어 문제가 발생한 것이기 때문에 사용하지 않는 Pod는 모두 제거해 주었다.이 문제는 워커노드에 얼마만큼의 가용량이 있는지 알지 못해 발생한 문제이므로, 이번 기회에 워커노드 디스크의 가용량을 확인해 보자.
$ k describe nodes <워커 노드명>
# 출력
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
NetworkUnavailable False Mon, 06 Jan 2025 11:16:31 +0000 Mon, 06 Jan 2025 11:16:31 +0000 FlannelIsUp Flannel is running on this node
MemoryPressure False Wed, 15 Jan 2025 03:58:07 +0000 Mon, 06 Jan 2025 11:15:42 +0000 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Wed, 15 Jan 2025 03:58:07 +0000 Wed, 15 Jan 2025 03:49:07 +0000 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Wed, 15 Jan 2025 03:58:07 +0000 Mon, 06 Jan 2025 11:15:42 +0000 KubeletHasSufficientPID kubelet has sufficient PID available
Ready True Wed, 15 Jan 2025 03:58:07 +0000 Mon, 06 Jan 2025 11:16:29 +0000 KubeletReady kubelet is posting ready status
...
Capacity:
cpu: 8
ephemeral-storage: 37206272Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 24306844Ki
pods: 110
Allocatable:
cpu: 8
ephemeral-storage: 34289300219
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 24204444Ki
pods: 110
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning EvictionThresholdMet 16m (x2 over 27m) kubelet Attempting to reclaim ephemeral-storage
Normal NodeHasDiskPressure 16m (x2 over 27m) kubelet Node k8s-worker1 status is now: NodeHasDiskPressure
Normal NodeHasNoDiskPressure 10m (x3 over 7d1h) kubelet Node k8s-worker1 status is now: NodeHasNoDiskPressure
Conditions
- Conditions를 확인해 보면 해당 노드의 네트워크. 메모리, 디스크 등의 한계가 타입 별로 나뉘어 있고, 현재 상태가 표시되어 있다.
- Ready의 경우는 노드가 정상적으로 활성화되어있다면 True로 되어있는 것이 맞다.
- 다른 타입은 명칭을 보면 False로 되어있어야 정상임을 짐작할 수 있고 현재 정상임을 확인할 수 있다.
Capacity & Allocatable
- 각 리소스 별 전체 용량과 할당 가능 용량을 표시한다.
- 여기서 ephemeral-storage에 대해 간단히 알아보자.
- ephemeral-storage는 Kubernetes에서 컨테이너가 사용하는 임시 저장소를 의미한다.
- 이 저장소는 컨테이너가 실행되는 동안만 데이터를 유지하며 컨테이너가 삭제되거나 재시작되면 데이터가 사라진다.
- 컨테이너와 생명주기를 함께하는 것이다.
- 즉, 한 노드에 여러 Pod를 띄울수록 실행 중인 컨테이너의 양이 많아져 할당 가능한 저장 용량이 점점 줄어들 것이다.
- 이 용량은 인스턴스의 디스크 용량과 관련이 있으므로 이 부분에서 문제가 발생한 것이다.
Events
- 기록 순서를 보면 ephemeral-storage에 용량 한계로 인한 경고가 발생했고, 이후 DiskPressure가 True로 되어 디스크 사용량이 임계치에 도달하여 Pod가 생성이 불가능해졌다가 풀렸음을 확인할 수 있다.
- 아마 풀린 시점이 내가 사용하지 않은 Pod를 지운 시점일 것이다.
결론
- 현재는 테스트 중인 서비스이기 때문에 주기적으로 Pod를 삭제하면 어느 정도 해결될 문제이지만 추후에는 디스크 용량을 늘릴 필요가 있어 보인다.
https://suzuworld.tistory.com/453
kubernetes node : kubelet has disk pressure 해결 방법 총정리(pod status evicted, Attempting to reclaim ephemeral-storage)
지난 글에서 워커 노드의 디스크 가용량이 부족하여 해당 노드에 Pod를 스케줄링할 수 없는 문제에 대한 이슈를 정리했다. 현재 사내에서 사용 중인 쿠버네티스는 클라우드 내에서 작동 중이며
suzuworld.tistory.com
- 좀 더 다양한 해결 방법을 찾고 있다면 다음 글을 참고하자.
🤔 의문점 :
없음!
참고
chatGPT
728x90