쿠버네티스 환경에서 문제가 발생하면, 복잡한 구조 때문에 어디서부터 확인해야 할지 막막할 수 있습니다. 이때 임의로 명령어를 실행하거나 설정을 변경하면 문제를 해결하기는커녕 상황을 더 악화시킬 수 있습니다.
가장 중요한 것은 체계적인 접근 방식입니다. 아래 7단계 절차는 문제의 원인을 논리적으로 찾아가는 길잡이가 되어 줄 것입니다.
초보자를 위한 쿠버네티스 문제 해결 7단계
1단계: 문제 명확하게 정의하기 (Define the Problem Clearly)
가장 먼저 “무엇이”, “어떻게” 잘못되고 있는지 구체적으로 파악해야 합니다. ‘그냥 안돼요’가 아니라, 관찰된 사실을 명확히 정리하는 단계입니다.
- 구체적인 증상 확인:
- (나쁜 예) “웹사이트가 다운됐어요.”
- (좋은 예) “상품 목록 조회 API 호출 시, 500 Internal Server Error 응답을 받습니다.”
- 정상 상태와 비교: 원래 시스템은 어떻게 동작해야 하나요?
- 예) “정상일 때는 상품 목록이 담긴 JSON 데이터가 반환되어야 합니다.”
- 발생 시점과 빈도: 언제부터, 얼마나 자주 문제가 발생했나요?
- 예) “오늘 오후 3시경 코드 배포 직후부터 모든 요청에서 계속 발생하고 있습니다.”
- 최근 변경 사항 추적: 문제 발생 직전에 변경된 부분이 있는지 확인합니다. 가장 강력한 단서가 될 수 있습니다.
- Git 로그, Helm 배포 이력, Jenkins 빌드 기록 등을 확인하여 어떤 코드가나 설정이 변경되었는지 파악합니다.
- 영향 범위 파악: 이 문제가 전체 시스템에 영향을 주나요, 아니면 일부 사용자에게만 발생하나요?
- 예) “모든 사용자가 상품 목록을 볼 수 없습니다.”
2단계: 정보 수집하기 (Gather Information)
문제를 정의했다면, 이제 쿠버네티스에 직접 물어보며 객관적인 데이터를 수집할 차례입니다. kubectl
명령어는 시스템의 상태를 확인하는 가장 기본적인 도구입니다.
- 기본 리소스 상태 확인:
kubectl get pods -n <네임스페이스> -o wide
- 확인 사항: 파드(Pod)들이
Running
상태인지,Error
나CrashLoopBackOff
같은 이상 상태는 없는지 확인합니다.-o wide
옵션으로 어떤 노드(서버)에서 실행 중인지도 함께 봅니다.
- 확인 사항: 파드(Pod)들이
kubectl get deploy,svc,ing -n <네임스페이스>
- 확인 사항: 애플리케이션의 배포(Deployment), 내부 통신 규칙(Service), 외부 노출 규칙(Ingress)이 정상적으로 생성되어 있는지 확인합니다.
- 리소스 상세 정보 확인 (describe):
kubectl describe pod <파드_이름> -n <네임스페이스>
- 가장 중요한 명령어 중 하나입니다. 파드의 상세한 상태와 정보를 보여줍니다. 특히 맨 아래
Events
섹션은 파드가 생성되고 실행되는 과정에서 발생한 모든 이벤트를 시간순으로 보여주는 진단 기록과 같습니다. (예:ImagePullBackOff
– 이미지 다운로드 실패,FailedScheduling
– 자원 부족으로 배치 실패 등)
- 가장 중요한 명령어 중 하나입니다. 파드의 상세한 상태와 정보를 보여줍니다. 특히 맨 아래
- 로그 확인:
kubectl logs <파드_이름> -n <네임스페이스>
- 확인 사항: 애플리케이션이 남긴 로그를 직접 확인하여 코드 수준의 에러 메시지가 있는지 찾습니다. (예:
database connection error
,null pointer exception
등)
- 확인 사항: 애플리케이션이 남긴 로그를 직접 확인하여 코드 수준의 에러 메시지가 있는지 찾습니다. (예:
kubectl logs -p <파드_이름> -n <네임스페이스>
- 꿀팁:
CrashLoopBackOff
상태처럼 파드가 반복적으로 재시작될 경우, 현재 파드는 로그가 거의 없습니다.-p
옵션을 사용하면 바로 이전에 비정상 종료된 파드의 로그를 확인할 수 있어 원인 파악에 결정적입니다.
- 꿀팁:
3단계: 문제 범위 좁히기 (Narrow Down the Scope)
수집한 정보들을 바탕으로, 문제의 원인이 있을 만한 영역을 좁혀 나갑니다. 보통 요청이 들어오는 순서대로 외부에서 내부로 확인하는 것이 효율적입니다.
계층 | 주요 점검 내용 |
---|---|
클라이언트 | 사용자 브라우저의 캐시 문제, 사용자의 네트워크 환경 문제일 가능성 |
Ingress | 외부 요청을 서비스로 연결하는 규칙에 오타나 설정 오류가 없는지 확인 |
Service | 요청을 올바른 파드 그룹으로 전달하고 있는지 (selector 와 파드의 label 일치 여부), 포트 설정이 올바른지 확인 |
Pod/Container | 파드가 비정상 상태(CrashLoopBackOff , Error 등)인지, 로그에 에러는 없는지, CPU/Memory 같은 리소스가 부족하지는 않은지 확인 |
Node | 특정 노드(서버)에서 실행되는 파드들에서만 문제가 발생하는지, 노드 자체가 NotReady 상태는 아닌지 확인 |
설정 | ConfigMap 이나 Secret 의 설정값(DB 주소, API 키 등)이 변경되거나 잘못 입력되지는 않았는지 확인 |
NetworkPolicy | 파드 간 통신을 막는 보안 정책이 설정되어 있는지 확인 |
4. 가설 세우기 (Formulate a Hypothesis)
지금까지의 정보와 좁혀진 범위를 바탕으로, “아마도 이것이 원인일 것이다”라는 가장 가능성 높은 가설을 세웁니다.
- 경험 기반 추론: “이전에 비슷한 로그를 봤을 때, 데이터베이스 암호가 틀렸던 적이 있었어.”
- 단순한 원인부터 점검: 복잡한 문제보다 단순한 실수일 가능성이 높습니다. (예: YAML 파일의 들여쓰기 오류, 포트 번호 오타, 이미지 태그 오타 등)
- 가설 예시: “2단계에서
describe pod
의 이벤트 로그에FailedMount
가 보였고, 3단계에서 ConfigMap을 확인해보니 참조하려는 키 이름에 오타가 있었다. 가설: ConfigMap 키 이름 오타로 볼륨 마운트에 실패하여 파드가 정상 실행되지 못했다.”
5단계: 가설 검증하고 반복하기 (Test the Hypothesis & Iterate)
세운 가설을 검증하기 위해, 제어된 환경에서 작은 변경을 적용하고 결과를 관찰합니다.
- 한 번에 한 가지만 변경: 여러 가지를 동시에 수정하면 어떤 변경 때문에 문제가 해결되었는지 (또는 악화되었는지) 알 수 없습니다.
- 예상과 실제 비교: 변경을 적용한 후, 문제가 해결될 것이라는 예상과 실제 결과를 비교합니다.
- 원복 후 다음 가셔로: 만약 가설이 틀렸다면, 적용했던 변경 사항을 반드시 원상 복구한 뒤 다음 가설을 테스트합니다.
- 안전한 테스트: 가능하다면 운영 환경에 바로 적용하기보다, 개발이나 스테이징 환경에서 문제를 재현하고 검증하는 것이 가장 안전합니다.
6단계: 근본 원인 찾아 해결하기 (Identify Root Cause & Fix)
눈앞의 문제를 해결하는 임시방편에 그치지 않고, 문제를 일으킨 근본적인 원인을 찾아 해결해야 같은 문제가 반복되지 않습니다.
- 예시: 메모리 부족 (
OOMKilled
) 문제- 임시 해결: 파드의 메모리 요청량(request)과 한도(limit)를 늘려준다.
- 근본 해결: “왜 메모리 사용량이 갑자기 늘었을까?”를 분석합니다. 코드 상의 메모리 누수(Memory Leak)를 찾아 수정하고, 부하 테스트를 통해 적정 메모리 사용량을 다시 산정하는 것이 근본적인 해결책입니다.
7단계: 해결 과정 기록하고 공유하기 (Document and Share)
문제 해결 경험은 팀의 중요한 자산입니다. 해결 과정을 문서로 남겨두면, 미래에 비슷한 문제가 발생했을 때 자신과 동료가 시간을 크게 절약할 수 있습니다.
- 기록할 내용: 발생 증상, 진단 과정, 시도했던 가설과 검증 내역, 최종적인 근본 원인, 해결 방법, 재발 방지 대책
- 공유 방법: 팀의 위키(Wiki), Confluence, GitHub 등에 정리하여 누구나 찾아볼 수 있게 합니다.
쿠버네티스의 문제 해결은 어려운 퍼즐 맞추기와 같을 수 있습니다. 하지만 위에서 소개한 7단계 접근법을 습관화하면, 어떤 문제든 당황하지 않고 논리적으로 해결해 나갈 수 있습니다.
핵심은 관찰 → 추론 → 검증이라는 문제 해결의 기본 원칙을 침착하게 따르는 것입니다. 이 과정을 통해 쿠버네티스에 대한 이해도 역시 깊어질 것입니다.