はじめに
Podに**hostNetwork: true**を設定すると、ホストのネットワークを共有できるため便利ですが、DNS関連で予期せぬ問題が発生することがあります。
この記事では、hostNetwork: trueのPodで名前解決が失敗した際のチェックポイントと、その解決策について解説します。
発生した問題
外部のサーバーに接続したかったのですが、アプリケーションコードにIPを直接書くのを避けるため、KubernetesのServiceとEndpointsを直接作成しました。
しかし、hostNetwork: trueを設定したPodでアプリケーションを動かすと、DNSルックアップができず、名前解決エラーが発生しました。
原因
**hostNetwork: trueなPodのデフォルトのdnsPolicyはClusterFirstWithHostNet**です。
これは、Podがまずクラスタ内のCoreDNSに問い合わせ、名前解決に失敗した場合、ホスト側のDNS設定にフォールバックするという挙動です。
今回のケースでは、何らかの原因でクラスタのDNS設定がうまく機能せず、ホスト側の設定にフォールバックしてしまったために、作成したServiceの名前解決ができませんでした。
解決策
dnsPolicyをClusterFirstWithHostNetに変更することで解決しました。
具体的な修正内容は、kubectl editコマンドでPodのYAMLを以下のように編集しました。
spec:
# ... 省略 ...
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet # ここを修正
# ... 省略 ...
まとめ
hostNetwork: trueなPodで名前解決に問題が発生した場合、dnsPolicyの設定を見直してみましょう。
-
hostNetwork: trueのPodのデフォルトdnsPolicyは**ClusterFirst** - クラスタ内のDNSサーバを確実に使いたい場合は、**
dnsPolicy: ClusterFirstWithHostNet**に明示的に設定する。
この設定を理解しておけば、Kubernetesにおけるネットワーク周りのトラブルシューティングがスムーズになります。