事象
Kubeadmで構築した環境にてPod内の名前解決に失敗する。
具体的には/etc/resolv.conf
にcore-dnsのサービスであるkube-dnsのIPが記載されているにも関わらずPodからの通信に失敗する。
# nslookup testnode ;; connection timed out ; no servers could be reached
環境情報
- kubectl v1.15.5
- coredns:1.3.1
原因/対応策
Podからcorednsのサービスに対して疎通確認ができていない。
以下はbusybox上でのコマンド実行結果。
# telnet 10.10.10.10 53 telnet : can't connect to remote host (10.10.10.10 53) : Connetion timed out
対応方法として、corednsが動いているDeploymentをyamlに出力し
$ kubectl get deployent -n kube-system coredns -o=yaml > coredns_dep.yaml
落とし上げを行うと
$ kubectl delete -f coredns_dep.yaml deployment.extensions "coredns" deleted
$ kubectl apply -f coredns_dep.yaml deployment.extensions/coredns created
名前解決に成功した。
# nslookup testnode Server: 10.10.10.10 Address: 10.10.10.10:53 ...
busyboxからのtelnetも通るようになった。
# telnet 10.10.10.10 53 Connected to 10.10.10.10 Connection closed by foreign host
以下、状況の補足です。
補足
kubeadmのインストール時に展開されていたcorednsですが、構築の流れとしてその後にCNIを導入してWorkerNodeを追加しました。よって表題の事象が発生していた時点でcorednsのPodはMasterノードに展開されていました。
展開されているPod自身やServiceは正常に動作&紐づけされているものの、Podのログには何も表示されません。
$ kubectl logs -n kube-system coredns-xxxx $
切り分けとしてMasterノード自体から該当のPodにアクセスをかけると接続できるにも拘らず
$ ssh -v -p 53 10.10.10.10 ... Connection established ...
Podからは接続できないのでネットワークプラグインがPodに対して聞いていないと考えPodの落とし上げを行いました。
再起動後はcorednsのPodにログが発生していたので正常に疎通が通るようになっていることが分かりました。
$ kubectl logs -n kube-system coredns-xxx .:53 .... CoreDNS-1.3.1 .... linux/amd64, go1.11.4....
Networkプラグインはcalicoを利用していますが、同様の事象が発生した方はCoreDNSの落とし上げを行うと解決するかもしれません。もう少し具体的な問題切り分け手法をご存じの方は、ぜひコメントお願いします。