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 이미지, 컨테이너, 네트워크, 볼륨 등을 지운다.
- 사용하지 않는 모든 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
'[DevOps] > Kubernetes' 카테고리의 다른 글
Kubernetes ImageGCFailed, FreeDiskSpaceFailed 원인 생각 해보기(쿠버네티스 가비지 컬렉션) (0) | 2025.01.24 |
---|---|
😡 1 node(s) had untolerated taint(node.kubernetes.io/disk-pressure:)의 원인 파악과 해결 (0) | 2025.01.15 |
Docker image -> Containerd image로 변환하는 방법 (2) | 2025.01.07 |
외부에서 HTTP로 Kubernetes API 요청하기(1.24v 이상) (0) | 2024.12.30 |
쿠버네티스 설치 및 노드 연결 완벽 정리 (Oracle Linux or Ubuntu, containerd, flannel) (5) | 2024.12.19 |