Profile picture

[k8s] coredns error : 'Temporary failure in name resolution'

JaehyoJJAng2023년 06월 12일


fastapi 프로젝트 구현 중, fastapi 파드에서 간헐적으로 Temporary failure in name resolution 에러가 발생하였다.
이번 포스팅에서는 해당 로그의 원인과 이를 해결하는 과정을 다뤄보겠다.


DNS 체크

먼저 DNS 서버가 정상적으로 동작하는지 확인하기 위해 dnsutil이 설치된 파드를 새롭게 생성해보자.

kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml

그 다음 DNS 서버갸 정상적으로 작동하는지 확인하자. 나의 경우 몇 번 시도해보니 DNS resolution 과정에서 실패와 성공을 계속 번갈아 반복하고 있었다. 원인은 CoreDNS 파드 중 일부가 정상적으로 작동하지 않는 것으로 추축된다.

# DNS 작동 성공 시
kubectl exec -it pod/dnsutils -- nslookup kubernetes.default
Server:		10.96.0.10
Address:	10.96.0.10#53

Name:	kubernetes.default.svc.cluster.local
Address: 10.96.0.1
# DNS 작동 실패 시
kubectl exec -it pod/dnsutils -- nslookup kubernetes.default
;; connection timed out; no servers could be reached

모든 CoreDNS 팟의 로그를 확인해봐도 딱히 문제가 되어보이는 로그를 찾아볼 수는 없었다 ..

kubectl logs -n kube-system pod/coredns-9d5499d77-6tg4x | grep -i 'error' | tail -n 3
[ERROR] plugin/kubernetes: pkg/mod/k8s.io/client-go@v0.26.1/tools/cache/reflector.go:169: Failed to watch *v1.Service: failed to list *v1.Service: Get "https://10.96.0.1:443/api/v1/services?resourceVersion=136435": dial tcp 10.96.0.1:443: connect: no route to host
[ERROR] plugin/kubernetes: pkg/mod/k8s.io/client-go@v0.26.1/tools/cache/reflector.go:169: Failed to watch *v1.Namespace: failed to list *v1.Namespace: Get "https://10.96.0.1:443/api/v1/namespaces?resourceVersion=136370": dial tcp 10.96.0.1:443: connect: no route to host
[ERROR] plugin/kubernetes: pkg/mod/k8s.io/client-go@v0.26.1/tools/cache/reflector.go:169: Failed to watch *v1.EndpointSlice: failed to list *v1.EndpointSlice: Get "https://10.96.0.1:443/apis/discovery.k8s.io/v1/endpointslices?resourceVersion=136435": dial tcp 10.96.0.1:443: connect: no route to host

CoreDNS 파드를 재시작하면 해결되지 않을까 싶어 coredns Deployment를 재시작했더니, 해당 이슈가 해결되었다!

kubectl -n kube-system rollout restart deployment coredns

Loading script...