Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Medium Level #7] 쿠버네티스에서 발생하는 DNS 문제 해결 및 최적화

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

 

쿠버네티스 클러스터에서는 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 서버를 올바르게 포워딩하도록 설정해야 함

 

728x90