자격증 학원 › CKA › 트러블슈팅

강의 24 / 28 · 약 30분

트러블슈팅 ① 애플리케이션

파드 STATUS 별 원인표와 조사 순서. get → describe(Events) → logs(--previous) → 고치기 → 확인. 디플로이먼트라면 ReplicaSet 이벤트까지.

이 강의를 마치면

  • 파드 상태만 보고 조사할 곳을 바로 고를 수 있다
  • describe 의 Events 와 logs --previous 로 원인을 찾을 수 있다
  • 불변 필드 때문에 파드를 다시 만들어야 하는 경우를 처리할 수 있다

조사 순서 — 매번 같은 순서로

kubectl get pods -n <ns> -o wide              # ① 상태·재시작 수·노드
kubectl describe pod <파드> -n <ns>            # ② 맨 아래 Events ★
kubectl logs <파드> -n <ns> [-c 컨테이너]       # ③ 앱이 한 말
kubectl logs <파드> -n <ns> --previous         #    죽기 직전 로그(CrashLoop)
kubectl get events -n <ns> --sort-by=.lastTimestamp   # 전체 흐름

디플로이먼트라면 한 층 위도 봅니다.

kubectl describe deploy <이름>     # Conditions, 새·옛 ReplicaSet
kubectl describe rs <이름>         # FailedCreate — 파드가 아예 안 생기는 이유
kubectl rollout history deploy <이름>

상태별 원인표

증상대표 원인확인해결
Pending(노드 없음)자원 부족, nodeSelector·affinity 불일치, taint, PVC 미바인딩, cordonEvents 의 FailedScheduling 문장요청량 줄이기, 레이블·toleration 고치기, PVC 고치기
Pending(Events 없음)스케줄러 죽음kubectl get pods -n kube-system클러스터 트러블슈팅
ContainerCreating 오래볼륨 마운트 실패(ConfigMap·Secret·PVC 없음), CNI 문제Events 의 FailedMount없는 것 만들기
ErrImagePull / ImagePullBackOff이미지 이름·태그 오타, 비공개 레지스트리 인증Events 의 Failed to pull imagekubectl set image, imagePullSecrets
CreateContainerConfigErrorenv 로 참조한 ConfigMap·Secret·키 없음Events 의 Error: configmap "…" not found참조 대상 만들기
CrashLoopBackOff앱 오류, 필수 설정(환경변수) 누락, 잘못된 command, liveness 실패logs --previous, describe 의 Last State원인 수정
OOMKilled(Last State)메모리 limit 초과Exit Code: 137limit 늘리기
Running 인데 READY 0/1readinessProbe 실패Events 의 Readiness probe failed프로브(포트·경로) 수정
Completed 반복할 일 없이 끝나는 명령(busybox) + restartPolicy Alwayscommand 확인sleep 등 장기 실행 명령
파드가 아예 없음쿼터 초과, 없는 ServiceAccount·PriorityClass, 컨트롤러 매니저 장애describe rs원인 수정

고치는 방법 고르기

  • 디플로이먼트의 템플릿 문제 → 디플로이먼트를 고칩니다(set image, set resources, edit, patch). 파드는 롤아웃으로 알아서 바뀝니다.
  • 혼자 있는 파드 문제 → 대부분 필드는 못 고칩니다.
kubectl get pod mysql -o yaml > mysql.yaml     # (또는 edit 이 거절될 때 남긴 /tmp/kubectl-edit-….yaml)
vi mysql.yaml                                   # status·uid 등은 그대로 둬도 된다
kubectl replace --force -f mysql.yaml           # 지우고 다시 만든다
  • 참조 대상이 없는 문제(ConfigMap·Secret·PVC) → 문제에서 “파드 정의는 수정하지 말라”고 하면 없는 것을 만들어 줍니다. kubelet 이 곧 다시 시도합니다.

로그 다루기

kubectl logs web --tail=20
kubectl logs web -f                              # 따라가기(Ctrl+C)
kubectl logs web --since=10m
kubectl logs deploy/web                          # 디플로이먼트의 파드 하나
kubectl logs -l app=web --prefix                 # 레이블로 여러 파드
kubectl logs web --all-containers
kubectl logs web | grep ERROR > /opt/errors.log  # 문제에서 자주 요구

확인 없이 끝내지 않기

고친 뒤에는 문제가 요구한 최종 상태를 직접 확인합니다. 파드 Running 만 보지 말고 READY 1/1, 레플리카 수, 서비스 엔드포인트, 실제 응답(wget)까지. 채점은 최종 상태로 합니다.

⌨️ 직접 해 보기

브라우저 실습 터미널에서 풀고 자동 채점을 받습니다.

✅ 확인 문제

과정 목차