본문 바로가기
[DevOps]/Kubernetes

kubernetes node : kubelet has disk pressure 해결 방법 총정리(pod status evicted, Attempting to reclaim ephemeral-storage)

by 팡펑퐁 2025. 1. 17.
728x90

지난 글에서 워커 노드의 디스크 가용량이 부족하여 해당 노드에 Pod를 스케줄링할 수 없는 문제에 대한 이슈를 정리했다.

 

  • 현재 사내에서 사용 중인 쿠버네티스는 클라우드 내에서 작동 중이며 디스크 용량 부족 이슈는 이미 해결되었다.
  • 이와는 별개로 기존에 사용하던 On-premises 서버에서는 지속적으로 Pod가 Evicted 되는 문제가 발생하고 있었다.
    • Evicted 되었다는 얘기는 파드가 노드로부터 축출되었다는 뜻이다.
    • drain 명령어로 고의적으로 축출하지 않는 이상 무언가 문제가 생겨 자동으로 축출된 것이다.
    • 결론부터 이야기하면 이것 역시 디스크 용량 문제였다.
  • 해당 서버의 쿠버네티스는 클라우드로 마이그레이션이 완료되어 더 이상 사용되지 않지만 추후에 급하게 사용할 일이 있을 때를 대비하여 문제를 해결해놓고자 했다.

 

🤔 taint & toleration

# master node
$ kubectl describe node <master-node-name>

# 출력
...
Taints:             node-role.kubernetes.io/master:NoSchedule
  • 우선 기본적으로 알아둬야 할 내용이 있다.
  • 쿠버네티스는 보안 및 안정성 문제로 마스터 노드에 Pod가 스케줄링 되는 것을 막는다.
  • taint를 이용하여 toleration이 없는 Pod는 스케줄링 되지 않도록 한다.
  • 자세한 내용은 지난 글을 참고하자.

 

👮🏻‍♂️ 문제 발견

# worker node(DiskPressure Status : True)
$ kubectl describe node <worker-node-name>

# 출력
...
Taints:             node.kubernetes.io/disk-pressure:NoSchedule

...
Conditions:
	DiskPressure     True    KubeletHasDiskPressure       kubelet has disk pressure

...
Events:
      Normal   NodeHasDiskPressure     kubelet     Node <node-name> status is now: NodeHasDiskPressure
      Warning  EvictionThresholdMet    kubelet     Attempting to reclaim ephemeral-storage
  • 워커노드의 경우에는 디스크 용량이 부족하면 disk-pressure taint가 설정된다.
  • 이는 일반적인 경우에는 나타나지 않고 디스크 용량이 부족하여 DiskPressure의 상태가 True가 되면 자동으로 taint가 설정되는 듯하다.
  • 아무튼 디스크 용량이 부족하여 컨테이너에서 사용할 디스크 공간이 부족하면 Attempting to reclaim ephemeral-storage 상태가 지속되면서 Pod가 노드에 스케줄링이 되지 않는다.
    • 또한 기존의 파드들이 evivted 되기도 한다.

 

💡 해결 방법 1

사용하지 않는 Pod 전부 삭제

$ kubectl delete pod -n <namespace-name>
  • 띄워져 있는 불필요한 Pod가 많다면 이 방법으로 해결될 수도 있다.
  • 나의 경우 클라우드의 쿠버네티스에서 지속적인 테스트로 인해 파드가 20개 이상 띄워져 있어 디스크 용량 부족 문제가 발생했었다.
  • Pod를 지우니 간단히 해결되었다.

 

💡 해결방법 2

Docker 캐시 및 이미지 정리

  • Docker의 불필요한 이미지, 컨테이너, 볼륨 등을 정리하여 디스크 공간을 확보할 수 있다.
    • 사용하지 않는 모든 Docker 이미지, 컨테이너, 네트워크, 볼륨 등을 지운다.
       
# 디스크 사용량 확인
$ df -h

# 출력
Filesystem               Size  Used Avail Use% Mounted on
...
overlay                  50G  46G  4G  92% /var/lib/docker/overlay2/xxx/merged

# 사용하지 않는 이미지, 컨테이너, 볼륨, 네트워크 모두 삭제
# 컨테이너d의 경우 docker -> crictl로 명령어 변경
$ docker system prune -a

# 개별 삭제
# 사용하지 않는 이미지 삭제
$ docker image prune -a

# 사용하지 않는 컨테이너 삭제
$ docker container prune

# 사용하지 않는 볼륨 삭제
$ docker volume prune

# 사용하지 않는 네트워크 삭제
$ docker network prune
  • 만약 docker나 containerd 등 쿠버네티스에서 사용하는 컨테이너 런타임을 오랜 기간 사용해왔다면 꽤 많은 데이터가 쌓여있을 수 있다.
  • 쿠버네티스에서 설정된 기본값은 90%이다. 이를 넘어가면 kubelet에서 위험을 감지해 더이상 Pod를 할당하지 못하게 한다.
  • 이를 삭제하는 명령어이다.
  • 아마 여기서 대부분 해결할 수 있을 것이다.

 

🚨 해결방법 3

kubelet이 바라보는 디스크 용량 늘리기

# kubelet이 바라보는 디스크의 용량 확인
$ df -h /var/lib/kubelet

# 출력
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G   46G   4G  92% /

# 시스템의 파티션 용량 확인
$ lsblk

# 출력
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  1.1T  0 disk 
...
└─sda3            8:3    0  1.1T  0 part 
  ├─centos-root 253:0    0   46G  0 lvm  /
  ├─centos-swap 253:1    0 15.6G  0 lvm  
  └─centos-home 253:2    0    1T  0 lvm  /home
  • 만약 방법 2로도 해결되지 않는다면 위와 같이 kubelet이 저장되어있는 디스크의 용량을 확인한다.
    • 아마 이 부분에 문제가 있을 것이다.
  • 특별한 설정이 없다면 root 폴더에 kubelet이 저장이 될 것이다.
  • 기본적으로 /home 폴더에 할당된 용량이 크고, /root 폴더에 할당된 용량은 적은 편이다.
  • 따라서 /home에 있는 여분 용량을 /root 폴더로 옮기면 해결될 문제이다.

 

# /home 폴더의 할당 용량 축출
$ sudo lvreduce -L -10G /dev/centos/centos-home

#/ root 폴더의 할당 용량 증가
$ sudo lvextend -L +10G /dev/centos/centos-root

# 파일 시스템 크기 확장
$ sudo xfs_growfs /dev/centos/centos-root

# 결과 확인
$ df -h /var/lib/kubelet

# 출력
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   60G   46G   15G  77% /

# kubelet 재시작
$ sudo systemctl restart kubelet

# master node에서 확인
$ kubectl describe node <worker-node-name>

# 출력
...
Events:
  Normal   Starting                 5s                  kubelet     Starting kubelet.
  Normal   NodeHasSufficientMemory    kubelet     Node <node-name> status is now: NodeHasSufficientMemory
  Normal   NodeHasNoDiskPressure      kubelet     Node <node-name> status is now: NodeHasNoDiskPressure
  Normal   NodeHasSufficientPID       kubelet     Node <node-name> status is now: NodeHasSufficientPID
  • /home에 할당된 용량을 10G 추출하여 그만큼 /root에 할당하고 파일 시스템 크기를 확장한다.
    • LVM 볼륨 크기를 확장한 후에는 파일 시스템도 해당 크기만큼 확장해야 하기 때문이다.
  • 이후 kubelet을 재시작하면 90%에서 77%로 내려온 만큼 임계점을 넘지않아 정상적으로 pod 할당이 가능한 상태로 변함을 확인할 수 있다.

 

 

 

참고

chatGPT

728x90