KubernetesのCoreDNSで名前解決のログを出力する方法

Kubernetesをインストール後、Podが外部ホストと通信ができない場合、CoreDNSで名前解決できているか確認したいことがあります。本記事では、Podが外部ホストを名前解決する流れを説明すると共に、CoreDNSの名前解決のログを出力する方法を紹介します。

  • Podが外部ホストを名前解決する流れ
  • CoreDNSで名前解決のログを出力する方法

Podが外部ホストを名前解決する流れ


Podが外部ホストを名前解決する場合、デフォルト(dnsPolicyがClusterFirst)は以下の流れで名前解決します。

  1. Pod自身のlocalhostのレコードを確認
  2. CoreDNSに登録されているレコードを確認
  3. CoreDNSが稼働するサーバーで名前解決を確認

つまり、名前解決ができない場合、以下の流れで確認する必要があります。次項では、3を確認するための設定方法を記載します。

  1. PodからCoreDNSへの通信ができているか?
  2. Podの/etc/resolve.confにCoreDNSのService IPが登録されているか?
  3. CoreDNSで名前解決のログが出力されているか?
  4. CoreDNSで名前解決ができているか?
  5. サーバーで名前解決できているか?

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

以上です。