Container

BareMetalのkubernetesクラスタでkube-dnsを動かす!

2019/01/15

kubernetesクラスタ環境ではpod間のアクセスに名前解決が使えます。
https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

ただなぜか名前解決ができたりできなかったり。。。
原因と解決法がわかったのでまとめました!

ゴール

kubernetesのPodでnslookupコマンドを実行し、service名でAレコードが返ってくること

前提

kubernetesのクラスタを物理マシンに構築済み
構築していない方はこちらを参考に
ansibleでkubernetes環境の構築 1
ansibleでkubernetes環境の構築 2

説明しないこと

kubernetesの使い方
kubernetesの基本的なサービスの説明(Podとはなんぞや。みたいな)

環境

物理マシン
Ubuntu18.04
kubernetes 1.10

事象

kube-dnsのPodは動いている。

でもPodからサービスのDNS名でアクセスすると、返ってきたり返ってこなかったり。。。
2週間で500回ぐらいkube-dnsのPodが再起動してる。。なんでや。

調査

ということで調査してみました。
どうやらkube-dnsのPodでは以下の3つのコンテナが動いているらしい。
skydnsとdnsmasqとkube-dns
この3つのログを確認していく

まずdnsmasqのコンテナ

続いてkubednsコンテナのログ

最後にsidecarコンテナのログ

解決策

先人の知恵をお借りすべく、githubのissueを漁りまくる。
どんぴしゃのissueを発見した。
DNS not working
issueにあげられている環境はUbuntu17だが、ほぼ同じ現象なので試してみる。

systemd-resolvedサービスを停止して、自動起動しないように設定。

kubernetesのマスタの/etc/resolv.confを編集

編集前
編集後

これでPod内でnslookupを実行すると、Aレコードが返ってくるようになりました。

考察

考察にもなってないけど。。。
system-resolvedについてちょっと調べてみた。
https://kledgeb.blogspot.com/2016/06/ubuntu-1610-7-dnssystemd-resolved.html
system-resolvedはただのローカルリゾルバーとして機能しているのみで特に問題になるような動作はしてなさそう。

issueをもう少し探すと、、、ただのバグっぽい。
https://github.com/kubernetes/kubeadm/issues/273

解決法としては今回書いたsystemd-resolveの停止の他に下記もあるようです。
kubeletの起動オプションにresolve.confファイルを追記することで解決できるみたいです。
https://github.com/kubernetes/kubernetes/issues/45828

-Container
-,

Translate »