はじめに
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におけるネットワーク周りのトラブルシューティングがスムーズになります。