쿠네네티스 클러스터를 운영하던 중, 일부 팟에서 간헐적으로 Temporary failure in name resolution
에러가 발생하는 것을 확인하였습니다. 이번 포스팅에서는 해당 로그의 원인과 이를 해결하는 과정을 다뤄보았습니다.
먼저, DNS 서버가 정상적으로 기능하는지 확인하기 위해 dnsutil
이 설치된 팟을 생성하였습니다.
$ kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml
그 다음, DNS 서버가 정상적으로 작동하는지 확인합니다. 수 차례 재확인해본 결과, DNS resolution 과정에서 실패와 성공을 반복하고 있는 것을 확인할 수 있었습니다. CoreDNS 팟 중 일부가 정상적으로 작동하지 않고 있는 것으로 보입니다.
# 성공 시
$ kubectl exec -it 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
# 실패 시
$ kubectl exec -it dnsutils -- nslookup kubernetes.default
;; connection timed out; no servers could be reached
모든 CoreDNS 팟의 로그를 확인하던 중, 문제의 원인으로 보이는 팟에서 에러 로그를 발견하였습니다.
$ kubectl logs -n kube-system coredns-64897985d-lmqkp
Error from server: Get "https://<worker-node-ip>:10250/containerLogs/kube-system/coredns-6db4d544f5-tl579/coredns": dial tcp <worker-node-ip>: connect: no route to host
해당 워크 노드로 접속하여 방화벽 설정을 확인해보니, 새롭게 추가한 노드에서 kubelet
통신을 위해 필요한 10250번 포트에 대한 설정이 누락되어 있는 것을 확인할 수 있었습니다.
$ sudo firewall-cmd --list-all
public
...
ports:
...
10250번 포트 허용 규칙을 추가하고 CoreDNS 팟을 재시작한 후, 해당 이슈가 해결되었습니다 :)
$ sudo firewall-cmd --permenant --zone=public --add-port=10250/tcp
$ sudo firewall-cmd reload
$ kubectl -n kube-system rollout restart deployment coredns