k8s container 정리

진웅·2025년 6월 5일

K8S Basics

목록 보기
8/40

현상 : 갑자기 static pod가 죽음
확인 : journal 로그에서 image pull 못하는 현상 발견

쿠버네티스 환경에서 containerd를 사용하는 경우, 파일 시스템 용량이 85%를 초과하면 컨테이너 이미지 풀(pull)이 실패할 가능성이 높습니다. 이는 kubelet과 containerd의 기본 설정에 포함된 디스크 압력(disk pressure) 정책 때문입니다. 아래에서 이를 자세히 설명하고, 관련 로그 확인 및 해결 방법을 제시합니다.

1. 디스크 용량과 이미지 풀의 관계

  • Kubelet의 디스크 압력 정책:
    • kubelet은 노드의 디스크 사용량을 모니터링하며, 디스크 용량이 특정 임계값(기본값: 85%)을 초과하면 노드를 디스크 압력 상태(DiskPressure)로 표시합니다.
    • 디스크 압력 상태에서는 새로운 파드 스케줄링(이미지 풀 포함)이 제한되거나 기존 파드가 제거(eviction)될 수 있습니다.
    • 관련 설정은 kubelet의 --eviction-hard 또는 --eviction-soft 플래그에 정의됩니다. 기본값 예:
      --eviction-hard=disk.low<15%
      이는 디스크 사용 가능한 공간이 15% 미만(즉, 사용량 85% 초과)일 때 디스크 압력을 트리거합니다.
  • Containerd의 동작:
    • containerd는 이미지 풀 시 /var/lib/containerd (또는 config.tomlroot 경로)에 이미지 레이어와 스냅샷을 저장합니다.
    • 디스크 공간이 부족하면 이미지 풀(ctr -n k8s.io images pull)이 실패하며, 에러 메시지로 no space left on device 또는 유사한 오류가 발생합니다.

2. 파일 시스템 용량 85% 초과 시 동작

  • 이미지 풀 실패 가능성:
    • 파일 시스템 사용량이 85%를 초과하면 kubelet이 새 파드 생성을 제한하거나, containerd가 이미지 풀을 시도할 때 디스크 부족으로 실패할 수 있습니다.
    • 로그에서 확인되는 일반적인 오류:
      failed to create snapshot: no space left on device
      Failed to create pod sandbox: no space left on device
  • 정적 파드(Static Pod) 영향:
    • 질문에서 언급된 정적 파드는 kubelet이 /etc/kubernetes/manifests/에서 직접 관리하므로, 디스크 압력 상태에서도 영향을 받습니다.
    • kubelet이 디스크 부족을 감지하면 정적 파드의 컨테이너 이미지를 풀하지 못하거나, 기존 파드가 비정상 종료될 수 있습니다.

3. 로그 확인

파일 시스템 용량 문제로 이미지 풀이 실패했는지 확인하려면 다음 로그를 점검하세요:

  • Kubelet 로그:
    sudo journalctl -u kubelet | grep -E 'no space left on device|disk pressure|eviction|failed to create pod'
    • 디스크 압력 관련 메시지 예:
      Eviction triggered due to disk pressure
  • Containerd 로그:
    sudo journalctl -u containerd | grep -E 'no space left on device|failed to create container|snapshot'
    • 이미지 풀 실패 예:
      failed to pull image: no space left on device
  • 디스크 사용량 확인:
    df -h /var/lib/containerd /var/lib/kubelet
    • 출력 예:
      Filesystem      Size  Used Avail Use% Mounted on
      /dev/sda1       50G   43G  7.0G  86% /var/lib/containerd
      사용량이 85% 이상이면 이미지 풀 실패 가능성이 높습니다.

4. 해결 방법

파일 시스템 용량이 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=7d
  1. 디스크 압력 임계값 조정 (선택 사항):
    • kubelet의 디스크 압력 임계값을 조정하여 85%보다 높은 사용량을 허용하도록 설정:
      sudo vi /etc/kubernetes/kubelet-config.yaml
      수정 예:
      evictionHard:
        disk.low: 10%  # 기본 15%에서 10%로 변경 (90% 사용 허용)
      kubelet 재시작:
      sudo systemctl restart kubelet
      주의: 임계값을 높이면 디스크 부족 위험이 증가하므로 신중히 설정하세요.
  2. 디스크 용량 확장:
    • 가능하면 디스크를 확장하거나 새 파티션을 추가:
      sudo lvresize -L +10G /dev/mapper/vg-lv_var
      sudo resize2fs /dev/mapper/vg-lv_var
      (LVM 사용 시 예시, 실제 환경에 맞게 조정 필요)
  3. 정적 파드 복구:
    • 정적 파드가 죽었다면, /etc/kubernetes/manifests/의 매니페스트 파일을 재적용:
      mv /etc/kubernetes/manifests/<pod>.yaml /tmp/
      mv /tmp/<pod>.yaml /etc/kubernetes/manifests/
    • kubelet이 자동으로 파드를 재생성합니다.
  4. containerd와 kubelet 재시작:
    sudo systemctl restart containerd
    sudo systemctl restart kubelet
  5. 이미지 풀 재시도:
    • 디스크 공간을 확보한 후, 이미지 풀을 수동으로 테스트:
      ctr -n k8s.io images pull <image_name:tag>
    • 또는 정적 파드가 자동으로 이미지를 풀하도록 kubelet에 맡김.

5. 예방 조치

  • 모니터링 설정:
    • Prometheus와 Grafana를 사용하여 디스크 사용량을 모니터링하고, 80% 이상일 때 알림 설정.
    • 예: Prometheus 메트릭 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"

6. 결론

파일 시스템 용량이 85%를 초과하면 kubelet의 디스크 압력 정책 또는 containerd의 디스크 부족으로 인해 컨테이너 이미지 풀이 실패할 수 있습니다. 이를 확인하려면 journalctl -u kubelet, journalctl -u containerd, df -h를 통해 로그와 디스크 상태를 점검하세요. 디스크 공간을 확보하거나 임계값을 조정하여 문제를 해결하고, 모니터링과 자동화로 재발을 방지하세요.

구체적인 로그나 df -h 출력 결과를 공유해 주시면, 더 정확한 진단과 해결 방법을 제안드릴 수 있습니다!

profile
bytebliss

0개의 댓글