アプリケーションが Microservices Engine (MSE) Nacos インスタンスに接続する際に、インスタンスのドメイン名の DNS 名前解決が失敗し、以下のいずれかのエラーが発生することがあります。
UnknownHostExceptionNo route to hostUnable to resolve host
以下の手順は、DNS 名前解決パスのどのレイヤーで問題が発生しているかを特定し、修正するのに役立ちます。
DNS 名前解決の仕組み
MSE Nacos インスタンスの DNS 名前解決は、階層化されたパスをたどります。このパスを理解することで、どのレイヤーが障害の原因となっているかを切り分けることができます。
アプリケーションは、Nacos インスタンスのドメイン名に対する DNS クエリを送信します。
クエリは、アプリケーションノードまたはコンテナの
/etc/resolv.confで設定された DNS サーバーに到達します。Kubernetes 環境では、クエリはまず CoreDNS に送られ、CoreDNS は外部ドメインのルックアップをアップストリーム DNS サーバーに転送します。
このパスのいずれかのレイヤーで障害が発生すると、上記のエラーが発生します。
一般的な原因
| 原因 | 説明 |
|---|---|
| アプリケーションノードでの DNS 設定ミス | /etc/resolv.conf 内の DNS サーバーアドレスが正しくないか、到達不能です。 |
| コンテナの DNS の不一致 | コンテナがホストノードから DNS 設定を継承していないか、ネットワークモードによって DNS クエリが正しいサーバーに到達できない状態です。 |
| DNS サービス障害 | DNS サーバー自体が停止しています。Kubernetes クラスターでは、これは通常 CoreDNS の障害を意味します。 |
前提条件
開始する前に、以下が準備できていることを確認してください。
アプリケーションノードまたはコンテナへの SSH またはシェルアクセス
(推奨)
digコマンドラインツールがインストールされていること。利用できない場合は、基本的なチェックにpingを使用できます
dig を使用したトラブルシューティング (推奨)
dig コマンドは、応答サーバーやクエリステータスなど、詳細な DNS クエリ情報を提供するため、根本原因分析を迅速に行うことができます。
ステップ 1:dig のインストール
dig がインストールされていない場合は、以下を実行します。
yum install -y bind-utilsステップ 2:Nacos ドメイン名へのクエリ実行
次のコマンドを実行します。<mse-nacos-host> をご利用の MSE Nacos インスタンスのドメイン名に置き換えてください。
dig <mse-nacos-host>出力例:
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.1.alios7.2 <<>> <mse-nacos-host>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 46791
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;<mse-nacos-host>. IN A
;; AUTHORITY SECTION:
com. 900 IN SOA a.gtld-servers.net. nstld.verisign-grs.com. 1670413473 1800 900 604800 86400
;; Query time: 0 msec
;; SERVER: yyy.yyy.yyy.yyy#zz(...)
;; WHEN: Wed Dec 07 19:39:32 CST 2022
;; MSG SIZE rcvd: 73ステップ 3:結果の解釈
出力の 2 つのフィールドを確認します。status が NOERROR で、SERVER フィールドに有効な DNS サーバーが表示されていれば、ドメイン名は正しく解決されています。
| フィールド | 出力内の場所 | 確認事項 |
|---|---|---|
| status | HEADER 行 | NOERROR = 名前解決成功。NXDOMAIN またはその他の値 = 名前解決失敗。 |
| SERVER | 末尾付近 | クエリを処理した DNS サーバーの IP アドレス。この DNS サーバーが有効で到達可能であることを確認します。トラブルシューティングのためにこのアドレスを記録しておきます。 |
ステップ 4:結果に基づく問題の修正
dig でドメイン名の名前解決に失敗した場合:
Elastic Compute Service (ECS) デプロイメント:
SERVERフィールドから DNS サーバのIPアドレスを記録し、その後 チケットを送信する して、ECS またはネットワークのテクニカルサポートに連絡してください。Docker または Kubernetes デプロイメントの場合:ホストノードにアクセスし、ホストから再度
dig <mse-nacos-host>を実行します。ホストでドメイン名が正常に解決された場合、コンテナの DNS 設定がホストと異なっています。ホストの
/etc/resolv.confからコンテナに DNS 設定をコピーするか、コンテナのネットワークモードをホストネットワークを使用するように切り替えてください。ホストでもドメイン名の解決に失敗した場合は、チケットを送信するして、ECS またはネットワークのテクニカルサポートにお問い合わせください。
Container Service for Kubernetes (ACK) のデプロイメント: チケットを送信する して、CoreDNS の障害の可能性を ACK テクニカルサポートに調査してもらいます。
dig でドメイン名が正常に解決され、アプリケーションが回復した場合:
DNS サーバで一時的な障害が発生しました。チケットを送信するして、DNS サービス中断の根本原因をネットワークのテクニカルサポートに調査してもらいます。
ping を使用したトラブルシューティング (代替)
ping は dig が利用できない場合に使用します。ping はドメイン名が解決されるかどうかを確認できますが、DNS サーバーの詳細は表示されません。
ステップ 1:Nacos ドメイン名への ping 実行
次のコマンドを実行します。<mse-nacos-host> をご利用の MSE Nacos インスタンスのドメイン名に置き換えてください。
ping <mse-nacos-host>結果の解釈:
| 出力 | 意味 |
|---|---|
PING <mse-nacos-host> (xxx.xx.xx.xx) 56(84) bytes of data. | 名前解決成功。IP アドレスが括弧内に表示されます。 |
unknown host | 名前解決失敗。 |
ステップ 2:DNS 設定の確認
ドメイン名の解決に失敗した場合は、アプリケーションノードの DNS 設定を表示します。
cat /etc/resolv.confこのファイルにリストされている nameserver エントリを記録します。
ステップ 3:結果に基づく問題の修正
ECS デプロイメント:
/etc/resolv.confの内容を記録し、その後 チケットを送信する して、ECS またはネットワークのテクニカルサポートに問い合わせてください。Docker または Kubernetes デプロイメントの場合:ホストノードにアクセスし、ホストから再度
ping <mse-nacos-host>を実行します。ホストでドメイン名が正常に解決された場合、コンテナの DNS 設定がホストと異なっています。ホストの
/etc/resolv.confからコンテナに DNS 設定をコピーするか、コンテナのネットワークモードをホストネットワークを使用するように切り替えてください。ホストもドメイン名を解決できない場合は、チケットを送信するして、ECS またはネットワークのテクニカルサポートにご連絡ください。
ACK デプロイメント: ACK テクニカルサポートにチケットを送信するして、考えられる CoreDNS の障害の調査を依頼してください。
ping でドメイン名が正常に解決され、アプリケーションが回復した場合:
DNS サーバで一時的な障害が発生しました。チケットを送信するして、ネットワークテクニカルサポートに DNS サービス中断の根本原因を調査してもらってください。