대표 증상
GPU 노드는 있는데 워크로드는 계속 스케줄되지 않을 때 상황은 하나의 설정값만 틀린 문제가 아니라 배포 경계, 런타임 상태, cache, 권한, 네트워크 경로가 함께 어긋나며 나타나는 경우가 많습니다. 검색으로 들어온 사용자는 먼저 증상을 작게 나누고, 이 가이드의 검색 의도인 GPU node present but workload not scheduled, Pod pending on GPU node, taint toleration GPU mismatch 같은 검색 의도를 겨냥합니다.를 기준으로 처음 확인할 신호를 정리해야 합니다.
초반에는 전체 rollback이나 무작정 재시작을 시도하기보다 영향 범위가 어느 node, Pod, job, 사용자, 경로에 묶여 있는지 확인합니다. 범위가 좁으면 최근 변경과 정상 상태를 비교하고, 범위가 넓으면 공통 의존성부터 확인하는 편이 안전합니다.
먼저 확인할 신호
가장 먼저 볼 것은 마지막 오류 줄이 아니라 같은 실패가 반복되는 경계입니다. insufficient nvidia.com/gpu, taint mismatch, device plugin not ready, node selector excludes gpu node 같은 신호를 기준으로 문제를 묶으면 로그가 길어도 root cause 후보를 줄일 수 있습니다.
- Pod의 GPU request와 실제 node allocatable 값을 먼저 비교합니다.
- taint, toleration, nodeSelector, affinity가 동시에 충돌하지 않는지 확인합니다.
- device plugin과 driver daemonset이 실제로 Ready인지 봅니다.
- GPU node가 cordon 상태인지, autoscaler가 다른 제약을 걸고 있는지 확인합니다.
- 같은 namespace의 정상 GPU workload와 spec 차이를 직접 비교합니다.
로그와 CLI 예시
아래 명령은 정답을 바로 알려주는 명령이 아니라 원인을 좁히기 위한 첫 관찰 지점입니다. 명령 결과를 정상 시점 또는 같은 역할의 정상 리소스와 비교하면 재시도만 반복하는 시간을 줄일 수 있습니다.
kubectl describe pod <pod> -n <namespace>
kubectl logs <pod> -n <namespace> --previous
흔한 오진
운영 장애에서 가장 위험한 패턴은 증상 이름을 곧 원인으로 착각하는 것입니다. 같은 timeout, permission denied, rollout failure라도 실제 원인은 cache, 권한 상속, Secret 범위, 오래된 client 연결, proxy header처럼 다른 층에 있을 수 있습니다.
- GPU node가 보이면 scheduler도 바로 선택할 수 있다고 가정하는 것
- taint/toleration과 device plugin 상태를 보지 않고 autoscaler만 의심하는 것
안전한 복구 순서
복구는 가장 작은 단위에서 시작합니다. 먼저 읽기 전용 확인으로 현재 상태를 고정하고, 그다음 영향이 제한된 리소스에서 변경을 검증합니다. 서비스 전체 재시작, cache 전체 삭제, 보안 정책 완화처럼 되돌리기 어려운 조치는 원인 후보가 좁혀진 뒤에 선택해야 합니다.
- GPU 문제는 리소스 부족처럼 보여도 실제로는 node policy 충돌인 경우가 많습니다.
- 드라이버와 device plugin이 Ready가 아니면 node는 보여도 scheduler가 사용할 수 있는 GPU로 계산하지 않습니다.
재발 방지
장애가 끝난 뒤에는 원인 한 줄보다 “왜 그 상태가 오래 남았는지”를 기록해야 합니다. 배포 pipeline, 런타임 reload, 권한 상속, 인증서 갱신, 네트워크 정책처럼 자동화와 운영 절차 사이에 빈 곳이 있었는지 확인합니다.
관련 허브와 문제를 이어 보면 같은 증상을 다른 환경에서도 다시 진단해 볼 수 있습니다.
관련 InfraTree 문제
아래 문제들은 이 가이드의 내용을 실제 시나리오로 연습하기 위한 공개 문제입니다. 글을 읽은 뒤 문제를 풀면 신호를 먼저 나누고 복구 방향을 문장으로 정리하는 연습을 할 수 있습니다.