Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Low Level #12] kubectl 및 kubectl debug를 활용한 문제 해결 기법

ygtoken 2025. 3. 16. 18:54
728x90

 

쿠버네티스 운영 중 애플리케이션이 정상적으로 실행되지 않거나, 컨테이너 내에서 디버깅이 필요할 때 효과적인 방법이 필요합니다.

이를 위해 kubectl과 kubectl debug를 활용하여 문제를 분석하고 해결하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1. kubectl describe 및 logs를 활용한 기본적인 문제 진단

2. kubectl exec 및 port-forward를 활용한 실시간 디버깅

3. kubectl debug를 활용한 컨테이너 디버깅 및 네트워크 문제 해결

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ kubectl describe 및 logs를 활용한 기본적인 문제 진단

 

❓ 문제 상황

 

운영팀에서 특정 Pod이 실행되지 않고 CrashLoopBackOff 상태로 반복적으로 재시작되고 있습니다.

이 Pod이 왜 실패하는지 원인을 파악하고, 로그를 분석하여 문제를 해결해야 합니다.

Pod 이름: crash-pod

컨테이너 로그를 분석하여 원인을 파악해야 함

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. kubectl describe 명령어를 사용하여 Pod 이벤트를 확인합니다.

 

2. kubectl logs 명령어를 사용하여 컨테이너의 로그를 확인합니다.

 


✅ 문제 해결을 위한 명령어 실행

 

🔹 Pod 이벤트 확인

kubectl describe pod crash-pod

 

💡 예상 출력 값

Events:
  Type     Reason     Age   From               Message
  ----     ------     ----  ----               -------
  Warning  BackOff    30s   kubelet            Back-off restarting failed container

 

🔹 컨테이너 로그 확인

kubectl logs crash-pod

 

💡 예상 출력 값

Error: Missing configuration file /app/config.yaml

로그를 통해 문제 원인이 설정 파일 누락임을 확인

 


2️⃣ kubectl exec 및 port-forward를 활용한 실시간 디버깅

 

❓ 문제 상황

 

운영팀에서 애플리케이션이 정상적으로 실행되었지만, 특정 요청이 실패하고 있습니다.

Pod 내부에서 직접 명령어를 실행하여 애플리케이션의 상태를 확인하고, 포트 포워딩을 통해 로컬에서 접근할 수 있도록 설정해야 합니다.

Pod 이름: web-pod

내부 상태 확인을 위해 Pod에 접속해야 함

로컬에서 웹 애플리케이션에 접근할 수 있도록 포트 포워딩 수행

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. kubectl exec 명령어를 사용하여 Pod 내부에서 문제를 분석합니다.

 

2. kubectl port-forward 명령어를 사용하여 로컬에서 접근할 수 있도록 설정합니다.

 


✅ 문제 해결을 위한 명령어 실행

 

🔹 Pod 내부 접근 후 상태 확인

kubectl exec -it web-pod -- sh

 

💡 예상 출력 값

/ #

 

🔹 애플리케이션 상태 확인

curl http://localhost:8080/healthz

 

💡 예상 출력 값 (정상 상태)

{"status": "ok"}

 

💡 예상 출력 값 (문제 발생)

{"status": "error", "message": "Database connection failed"}

 

🔹 포트 포워딩을 통해 로컬에서 웹 애플리케이션 접근

kubectl port-forward web-pod 8080:80

 

💡 예상 출력 값

Forwarding from 127.0.0.1:8080 -> 80

이제 브라우저에서 http://localhost:8080으로 접속하여 웹 애플리케이션 상태 확인 가능

 


3️⃣ kubectl debug를 활용한 컨테이너 디버깅 및 네트워크 문제 해결

 

❓ 문제 상황

 

운영팀에서 특정 Pod이 네트워크 문제로 인해 외부 서비스와 통신하지 못하고 있습니다.

kubectl debug를 활용하여 문제가 발생한 Pod과 동일한 환경에서 네트워크 테스트를 수행해야 합니다.

문제 발생 Pod: network-pod

네트워크 연결 확인을 위해 kubectl debug 활용

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. kubectl debug 명령어를 사용하여 문제 발생 Pod과 동일한 환경에서 네트워크 테스트를 수행합니다.

 

2. kubectl debug를 활용하여 BusyBox 컨테이너를 실행하고, 네트워크 상태를 확인합니다.

 


✅ 문제 해결을 위한 명령어 실행

 

🔹 네트워크 디버깅을 위한 임시 컨테이너 실행

kubectl debug network-pod -it --image=busybox -- sh

 

💡 예상 출력 값

/ #

 

🔹 네트워크 연결 테스트

ping google.com

 

💡 예상 출력 값 (정상 연결)

PING google.com (142.250.190.78): 56 data bytes
64 bytes from 142.250.190.78: icmp_seq=0 ttl=117 time=12.3 ms

 

💡 예상 출력 값 (네트워크 차단)

ping: bad address 'google.com'

 

🔹 DNS 확인

nslookup google.com

 

💡 예상 출력 값 (정상)

Server:         10.96.0.10
Address:        10.96.0.10#53

Non-authoritative answer:
Name:   google.com
Address: 142.250.190.78

네트워크 문제를 확인하고, DNS 및 외부 연결 상태를 분석할 수 있음

728x90