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 또는 방화벽 설정을 점검해야 합니다.
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [Pod 심화편 #5] Pod의 로그 및 모니터링 최적화 (0) | 2025.03.12 |
---|---|
📌 [Pod 심화편 #4] Pod의 장애 복구 및 자동 재시작 전략 (0) | 2025.03.12 |
📌 [Pod 심화편 #2] Pod의 리소스 관리와 OOM(Out of Memory) 문제 해결 (0) | 2025.03.12 |
📌 [Pod 심화편 #1] Pod의 생성과 스케줄링 원리 (0) | 2025.03.12 |
Kubernetes 리소스 시리즈 #18: Helm (패키지 관리 및 배포 자동화) (0) | 2025.03.05 |