Kubernetes/Kubernetes Advanced

📌 [Pod 심화편 #3] Pod의 네트워크 문제와 디버깅 방법

ygtoken 2025. 3. 12. 11:57
728x90

 

1️⃣ 개요

 

쿠버네티스에서 Pod 간 네트워크 통신은 기본적으로 자동 설정되지만, 실무에서는 네트워크 연결 불가, DNS 문제, 외부 접근 실패 등 다양한 문제가 발생할 수 있습니다.

 

Pod가 정상적으로 실행되었더라도 내부 서비스 간 통신이 되지 않거나, 외부에서 접근이 차단되는 문제가 발생할 수 있습니다. 이러한 네트워크 문제는 여러 가지 원인으로 인해 발생하며, 원인을 제대로 분석하지 않으면 해결이 어렵습니다.

 

이번 글에서는 Pod 간 네트워크 통신 구조를 이해하고, 실제 운영 환경에서 발생하는 주요 네트워크 문제와 해결 방법을 정리하겠습니다. 🚀

 


2️⃣ Pod 간 네트워크 통신 원리

 

쿠버네티스에서 Pod는 각각 고유한 IP 주소를 가지며, 기본적으로 모든 Pod가 서로 통신할 수 있도록 설정됩니다.

그러나 네트워크 정책(NetworkPolicy), DNS 설정, 외부 트래픽 차단 등 여러 가지 이유로 통신이 제한될 수 있습니다.

 

✅ 1. Pod 간 기본 통신 구조

같은 Namespace 내에서는 Pod 이름으로 직접 통신 가능 (curl http://<pod-name>:<port>)

다른 Namespace에 있는 경우 FQDN(전체 도메인) 사용 필요 (<pod-name>.<namespace>.svc.cluster.local)

모든 Pod는 Pod 네트워크(Overlay Network) 상에서 통신하며, 일반적으로 CNI(Container Network Interface)를 사용하여 구현됨.

 

📌 예제: 같은 Namespace 내에서 Pod 통신

curl http://my-service:8080

 

📌 예제: 다른 Namespace에 있는 Pod와 통신

curl http://my-service.my-namespace.svc.cluster.local:8080

 

 


3️⃣ Pod 네트워크 문제 발생 원인과 해결 방법

 

🚨 [문제 1] Pod가 다른 Pod와 통신할 수 없음 (네트워크 정책 문제)

 

증상:

curl http://<pod-name>:<port> 실행 시 “Connection refused” 발생

kubectl exec -it <pod-name> -- ping <target-pod> 실행 시 패킷 손실 발생

원인:

NetworkPolicy 설정으로 특정 Pod 간 통신이 차단됨

해결 방법:

kubectl get networkpolicy로 네트워크 정책 확인

모든 Pod가 통신 가능하도록 NetworkPolicy 수정

 

📌 예제: 모든 Pod 간 통신을 허용하는 NetworkPolicy

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
  namespace: default
spec:
  podSelector: {}
  ingress:
    - {}

 

 


🚨 [문제 2] Pod에서 다른 서비스로 요청할 수 없음 (DNS 문제)

 

증상:

kubectl exec -it <pod-name> -- nslookup my-service 실행 시 “Server failed” 오류 발생

kubectl logs <pod-name>에서 “Unknown host” 오류 발생

원인:

CoreDNS 서비스가 비정상적이거나, /etc/resolv.conf 설정 문제

해결 방법:

kubectl get pod -n kube-system | grep coredns → CoreDNS 상태 확인

kubectl describe pod -n kube-system <coredns-pod> → CoreDNS 로그 확인

/etc/resolv.conf에서 nameserver 설정 확인

 

📌 CoreDNS 재시작 예제

kubectl rollout restart deployment coredns -n kube-system

 

📌 예제: 서비스 검색이 가능한지 확인하는 명령어

kubectl exec -it <pod-name> -- nslookup my-service
kubectl exec -it <pod-name> -- dig my-service.default.svc.cluster.local

 

 


🚨 [문제 3] 외부 네트워크로 나갈 수 없음 (Egress 문제)

 

증상:

kubectl exec -it -- curl https://google.com 실행 시 “Connection timeout” 발생

ping 8.8.8.8 실행 시 응답 없음

원인:

Egress 정책(NetworkPolicy)으로 인해 외부 통신 차단됨

NAT 게이트웨이 또는 클라우드 방화벽 설정 문제

해결 방법:

kubectl get networkpolicy → Egress 정책 확인

클라우드 환경에서는 VPC 설정을 확인하여 인터넷 접근 가능 여부 확인

 

📌 예제: 모든 Pod가 외부 네트워크와 통신할 수 있도록 허용

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-egress
  namespace: default
spec:
  podSelector: {}
  egress:
    - {}

 

 


4️⃣ Pod 네트워크 문제 디버깅 방법

 

✅ 1. Pod의 네트워크 연결 상태 확인

 

📌 Pod 내부에서 네트워크 요청이 가능한지 확인

kubectl exec -it <pod-name> -- curl -I http://<target-service>
kubectl exec -it <pod-name> -- ping <target-pod>

 

📌 Pod 내부에서 DNS 조회가 가능한지 확인

kubectl exec -it <pod-name> -- nslookup my-service
kubectl exec -it <pod-name> -- dig my-service.default.svc.cluster.local

 

📌 Pod의 네트워크 인터페이스 및 라우팅 테이블 확인

kubectl exec -it <pod-name> -- ip a
kubectl exec -it <pod-name> -- ip route

 

 


✅ 2. CoreDNS 문제 해결

 

📌 CoreDNS Pod 상태 확인

kubectl get pod -n kube-system | grep coredns

 

📌 CoreDNS 설정 확인

kubectl get configmap coredns -n kube-system -o yaml

 

📌 CoreDNS 재시작

kubectl rollout restart deployment coredns -n kube-system

 

 


✅ 3. NetworkPolicy 설정 확인

 

📌 적용된 네트워크 정책 확인

kubectl get networkpolicy -A

 

📌 특정 Pod에 적용된 네트워크 정책 확인

kubectl describe networkpolicy <policy-name>

 

 


🔥 5️⃣ 결론

 

Pod 간 통신 오류는 NetworkPolicy, DNS, Egress 설정 문제로 발생할 가능성이 높습니다.

문제 발생 시 kubectl exec, curl, ping 등의 명령어로 네트워크 상태를 확인해야 합니다.

CoreDNS 장애 시 ConfigMap 및 로그를 점검하고, 필요하면 재시작해야 합니다.

Egress 트래픽이 차단된 경우, VPC 또는 방화벽 설정을 점검해야 합니다.

728x90