쿠버네티스 운영 중 애플리케이션이 정상적으로 실행되지 않거나, 컨테이너 내에서 디버깅이 필요할 때 효과적인 방법이 필요합니다.
이를 위해 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 및 외부 연결 상태를 분석할 수 있음