현상 : 갑자기 static pod가 죽음
확인 : journal 로그에서 image pull 못하는 현상 발견
쿠버네티스 환경에서 containerd를 사용하는 경우, 파일 시스템 용량이 85%를 초과하면 컨테이너 이미지 풀(pull)이 실패할 가능성이 높습니다. 이는 kubelet과 containerd의 기본 설정에 포함된 디스크 압력(disk pressure) 정책 때문입니다. 아래에서 이를 자세히 설명하고, 관련 로그 확인 및 해결 방법을 제시합니다.
--eviction-hard 또는 --eviction-soft 플래그에 정의됩니다. 기본값 예:--eviction-hard=disk.low<15%이는 디스크 사용 가능한 공간이 15% 미만(즉, 사용량 85% 초과)일 때 디스크 압력을 트리거합니다./var/lib/containerd (또는 config.toml의 root 경로)에 이미지 레이어와 스냅샷을 저장합니다.ctr -n k8s.io images pull)이 실패하며, 에러 메시지로 no space left on device 또는 유사한 오류가 발생합니다.failed to create snapshot: no space left on device
Failed to create pod sandbox: no space left on device/etc/kubernetes/manifests/에서 직접 관리하므로, 디스크 압력 상태에서도 영향을 받습니다.파일 시스템 용량 문제로 이미지 풀이 실패했는지 확인하려면 다음 로그를 점검하세요:
sudo journalctl -u kubelet | grep -E 'no space left on device|disk pressure|eviction|failed to create pod'Eviction triggered due to disk pressuresudo journalctl -u containerd | grep -E 'no space left on device|failed to create container|snapshot'failed to pull image: no space left on devicedf -h /var/lib/containerd /var/lib/kubeletFilesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 43G 7.0G 86% /var/lib/containerd사용량이 85% 이상이면 이미지 풀 실패 가능성이 높습니다.파일 시스템 용량이 85%를 초과하여 이미지 풀이 실패하는 경우, 다음 단계를 수행하세요:
1. 디스크 공간 확보:
ctr -n k8s.io images ls
ctr -n k8s.io images rm <unused_image>ctr -n k8s.io containers ls
ctr -n k8s.io containers delete <CONTAINER_ID>주의: 쿠버네티스와 동기화 문제를 피하려면 kubectl delete pod로 파드를 정리하는 것이 안전합니다.sudo rm -rf /var/lib/containerd/tmp/*sudo journalctl --vacuum-time=7dsudo vi /etc/kubernetes/kubelet-config.yaml수정 예:evictionHard:
disk.low: 10% # 기본 15%에서 10%로 변경 (90% 사용 허용)kubelet 재시작:sudo systemctl restart kubelet주의: 임계값을 높이면 디스크 부족 위험이 증가하므로 신중히 설정하세요.sudo lvresize -L +10G /dev/mapper/vg-lv_var
sudo resize2fs /dev/mapper/vg-lv_var(LVM 사용 시 예시, 실제 환경에 맞게 조정 필요)/etc/kubernetes/manifests/의 매니페스트 파일을 재적용:mv /etc/kubernetes/manifests/<pod>.yaml /tmp/
mv /tmp/<pod>.yaml /etc/kubernetes/manifests/sudo systemctl restart containerd
sudo systemctl restart kubeletctr -n k8s.io images pull <image_name:tag>node_filesystem_avail_bytes를 사용.crontab -e
0 2 * * * /usr/bin/ctr -n k8s.io images rm $(ctr -n k8s.io images ls -q | grep -v k8s.gcr.io/pause)apiVersion: v1
kind: Pod
metadata:
name: static-pod
spec:
containers:
- name: app
image: nginx:latest
resources:
limits:
memory: "512Mi"
cpu: "500m"파일 시스템 용량이 85%를 초과하면 kubelet의 디스크 압력 정책 또는 containerd의 디스크 부족으로 인해 컨테이너 이미지 풀이 실패할 수 있습니다. 이를 확인하려면 journalctl -u kubelet, journalctl -u containerd, df -h를 통해 로그와 디스크 상태를 점검하세요. 디스크 공간을 확보하거나 임계값을 조정하여 문제를 해결하고, 모니터링과 자동화로 재발을 방지하세요.
구체적인 로그나 df -h 출력 결과를 공유해 주시면, 더 정확한 진단과 해결 방법을 제안드릴 수 있습니다!