쿠버네티스 클러스터에서는 Pod 간 통신 및 외부 서비스 연결을 위해 DNS가 필수적으로 사용됩니다.
그러나 네트워크 설정 오류, CoreDNS 문제, 서비스 디스커버리 실패 등으로 인해 DNS 관련 장애가 발생할 수 있습니다.
이 글에서는 쿠버네티스에서 발생하는 DNS 문제를 분석하고, 해결하는 방법과 최적화 전략을 다룹니다.
📌 글에서 다루는 상황들
1. CoreDNS가 비정상적으로 동작하는 경우 문제 해결 방법
2. Pod에서 내부 서비스 이름을 조회할 수 없는 경우 해결 방법
3. 외부 서비스(FQDN)로의 네트워크 연결이 실패하는 경우 해결 방법
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ CoreDNS가 비정상적으로 동작하는 경우 문제 해결 방법
❓ 문제 상황
운영팀에서 Pod 간 네트워크 통신이 정상적으로 이루어지지 않으며, 서비스 이름을 조회할 수 없습니다.
kubectl logs를 확인한 결과 CoreDNS Pod이 CrashLoopBackOff 상태에 있으며, DNS 요청을 처리하지 못하고 있습니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. kubectl logs 명령어를 사용하여 CoreDNS 로그를 확인합니다.
2. CoreDNS Pod을 재시작하고, 필요 시 ConfigMap을 수정하여 설정을 최적화합니다.
✅ CoreDNS 문제 해결을 위한 명령어 실행
🔹 CoreDNS 상태 확인
kubectl get pods -n kube-system -l k8s-app=kube-dns
💡 예상 출력 값 (CoreDNS 비정상 상태)
NAME READY STATUS RESTARTS AGE
coredns-6d4b75cb6d-l2fkg 0/1 CrashLoopBackOff 10 30m
🔹 CoreDNS 로그 확인
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=20
💡 예상 출력 값 (CoreDNS 오류 로그)
plugin/errors: Unable to forward request to upstream
🔹 CoreDNS Pod 재시작
kubectl rollout restart deployment/coredns -n kube-system
💡 예상 출력 값
deployment.apps/coredns restarted
✅ CoreDNS Pod이 정상적으로 재시작되었는지 확인 후, 문제가 지속되면 ConfigMap을 수정해야 함
2️⃣ Pod에서 내부 서비스 이름을 조회할 수 없는 경우 해결 방법
❓ 문제 상황
운영팀에서 애플리케이션이 다른 서비스와 통신해야 하지만, DNS 조회가 실패하여 backend-service의 IP를 확인할 수 없습니다.
kubectl exec 명령어를 사용하여 nslookup을 실행했을 때, 해당 서비스가 발견되지 않는 문제가 발생합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. kubectl exec 명령어를 사용하여 문제 발생 Pod 내부에서 DNS 조회를 테스트합니다.
2. CoreDNS 설정을 확인하고, 서비스 레코드가 올바르게 생성되었는지 점검합니다.
✅ 내부 서비스 DNS 조회 테스트
🔹 Pod 내부에서 nslookup 실행
kubectl exec -it web-app -- nslookup backend-service.default.svc.cluster.local
💡 예상 출력 값 (정상 동작 시)
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: backend-service.default.svc.cluster.local
Address: 10.100.200.50
💡 예상 출력 값 (DNS 조회 실패 시)
** server can't find backend-service: NXDOMAIN
🔹 CoreDNS ConfigMap 확인
kubectl get configmap -n kube-system coredns -o yaml
✅ CoreDNS 설정을 점검하고 필요 시 수정 후 적용
3️⃣ 외부 서비스(FQDN)로의 네트워크 연결이 실패하는 경우 해결 방법
❓ 문제 상황
운영팀에서 애플리케이션이 외부 API 서버(api.external.com)와 통신해야 하지만, DNS 조회가 실패하거나 네트워크 연결이 이루어지지 않습니다.
kubectl exec 명령어를 사용하여 nslookup을 실행했을 때, 해당 도메인이 조회되지 않거나 curl 요청이 실패하는 문제가 발생합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. kubectl exec 명령어를 사용하여 문제 발생 Pod 내부에서 외부 도메인 조회를 테스트합니다.
2. CoreDNS 설정에서 외부 DNS 포워딩을 올바르게 구성합니다.
✅ 외부 도메인 DNS 조회 및 네트워크 테스트
🔹 Pod 내부에서 nslookup 실행
kubectl exec -it web-app -- nslookup api.external.com
💡 예상 출력 값 (정상 동작 시)
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: api.external.com
Address: 203.0.113.5
💡 예상 출력 값 (DNS 조회 실패 시)
** server can't find api.external.com: NXDOMAIN
🔹 네트워크 연결 테스트
kubectl exec -it web-app -- curl -I https://api.external.com
💡 예상 출력 값 (정상 연결 시)
HTTP/1.1 200 OK
💡 예상 출력 값 (연결 실패 시)
curl: (6) Could not resolve host: api.external.com
✅ CoreDNS가 외부 DNS 서버를 올바르게 포워딩하도록 설정해야 함