Kubernetesをインストール後、Podが外部ホストと通信ができない場合、CoreDNSで名前解決できているか確認したいことがあります。本記事では、Podが外部ホストを名前解決する流れを説明すると共に、CoreDNSの名前解決のログを出力する方法を紹介します。
- Podが外部ホストを名前解決する流れ
- CoreDNSで名前解決のログを出力する方法
Podが外部ホストを名前解決する流れ
Podが外部ホストを名前解決する場合、デフォルト(dnsPolicyがClusterFirst)は以下の流れで名前解決します。
- Pod自身のlocalhostのレコードを確認
- CoreDNSに登録されているレコードを確認
- CoreDNSが稼働するサーバーで名前解決を確認
つまり、名前解決ができない場合、以下の流れで確認する必要があります。次項では、3を確認するための設定方法を記載します。
- PodからCoreDNSへの通信ができているか?
- Podの/etc/resolve.confにCoreDNSのService IPが登録されているか?
- CoreDNSで名前解決のログが出力されているか?
- CoreDNSで名前解決ができているか?
- サーバーで名前解決できているか?
CoreDNSで名前解決のログを出力する方法
CoreDNSのDNS設定は、以下のコマンドでConfigMapを編集することで変更できます。logを1行追加するだけで、名前解決のログを出力することができます。
$ kubectl edit cm -n kube-system coredns apiVersion: v1 ~~省略~~ data: Corefile: | .:53 { log ← 追加 ~~省略~~ }
追加すると以下のようなログが出力されるので、BusyBoxからnslookupをした時に名前解決できるか確認できます。
[INFO] 10.244.0.8:41729 - 12544 "AAAA IN [ホスト名] udp 52 false 512" NOERROR qr,rd,ra 173 0.002533234s [INFO] 10.244.0.8:41729 - 12544 "A IN [ホスト名] udp 52 false 512" NOERROR qr,rd,ra 202 0.003439738s [INFO] 10.244.0.8:41729 - 12544 "AAAA IN [ホスト名] udp 52 false 512" NOERROR qr,aa,rd,ra 173 0.000178813s
以上です。