Container Service for Kubernetes (ACK) は、クライアントとCoreDNS間、またはCoreDNSとアップストリームDNSサーバー間で交換されるDNSメッセージを識別および分類するために使用できるACK CoreDNS DNSTAP Analyserコンポーネントを提供します。 このコンポーネントを使用して、DNS解決エラーの原因を効率的に特定できます。
前提条件
ACK Proクラスターが作成されました。 詳細については、「ACK Proクラスターの作成」をご参照ください。
ACK Proクラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターを接続します。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
背景情報
dnstapはDNSメッセージのログ形式です。 dnstapを使用して、DNSサーバーのDNS解決エラーを診断できます。 詳細は、「dnstap」をご参照ください。
ステップ1: ACK CoreDNS DNSTAP Analyserのインストール
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 クラスターの詳細ページの左側のウィンドウで、 を選択します。
[Helm] ページで、[デプロイ] をクリックします。 [基本情報] ステップで、次の表に基づいてパラメーターを設定します。
パラメーター
例
アプリケーション名
ack-coredns-dnstap-analyser
名前空間
kube-system
ソース
デフォルト値: Marketplace。
チャート
Use Scenariosパラメータに [すべて] を選択します。
サポートされるアーキテクチャパラメーターにamd64を選択します。
検索ボックスにack-coredns-dnstap-analyserと入力します。
[ack-coredns-dnstap-analyser] を選択し、[次へ] をクリックします。
[パラメーター] ステップで、[グラフバージョン] パラメーターを設定し、[OK] をクリックします。
ステップ2: CoreDNSでDNSTAPプラグインを設定する
CoreDNSにはDNSTAPメッセージを送信するためのDNSTAPプラグインがプリインストールされています。 DNSTAPプラグインによって送受信されるDNSメッセージは、ACK CoreDNS DNSTAPアナライザーに転送できます。 ACK CoreDNS DNSTAPアナライザーを使用してCoreDNS解決エラーを診断する前に、CoreDNSでDNSTAPプラグインを設定して有効にする必要があります。 DNSTAPプラグインが設定されると、CoreDNSはDNSTAPプラグインによって送受信されるDNSメッセージを自動診断のためにACK CoreDNS DNSTAPアナライザーに転送します。
次のコマンドを実行して、kube-system名前空間のACK CoreDNS DNSTAP AnalyserのクラスターIPアドレスを照会し、記録します。 このIPアドレスは、DNSTAPプラグインの設定に使用されます。 この例では、IPアドレスは172.21.0.10です。
kubectl -n kube-system get svc dnstap-analyser
次のコマンドを実行して、CoreDNSのConfigMapを変更します。
kubectl -n kube-system edit cm coredns -o yaml
次のスニペットのコメントに基づいて、CoreDNSのデフォルト設定を変更します。
ConfigMapで、DNSTAPプラグインを有効にし、その宛先アドレスをACK CoreDNS DNSTAPアナライザーのクラスターIPアドレスに設定する必要があります。 このようにして、DNSTAPプラグインによって送受信されるDNSメッセージをACK CoreDNS DNSTAPアナライザーに転送できます。
Corefile: | .:53 { #Details are omitted. ready # Add the code. Replace 172.21.0.10 with the actual cluster IP address of CoreDNS DNSTAP Analyser. dnstap tcp://172.21.0.10:6000 full kubernetes cluster.local in-addr.arpa ip6.arpa { #Details are omitted. } #Details are omitted. reload loadbalance }
次のコマンドを実行して、CoreDNSを実行するすべてのポッドを照会します。
kubectl -n kube-system get pod | grep coredns
期待される出力:
coredns-7d56l 1/1 Running 0 30m coredns-s7m2t 1/1 Running 0 30m
次のコマンドを実行して、CoreDNSログを照会します。
kubectl -n kube-system logs -f --tail=500 coredns-7d56l
説明coredns-7d56lを、この手順のサブステップ4で返されるポッドの名前に置き換えます。
1分待ちます。 次の出力が返され、例外が発生しない場合、設定は変更されます。
[INFO] Reloading complete
ステップ3: ACK CoreDNS DNSTAP Analyserのログを表示する
次のコマンドを実行して、ACK CoreDNS DNSTAP Analyserを実行するすべてのポッドを照会します。
kubectl -n kube-system get pod | grep dnstap-analyser
期待される出力:
dnstap-analyser-bbdf879-g**** 1/1 Running 0 30m
次のコマンドを実行して、ACK CoreDNS DNSTAPアナライザーのログを表示します。
kubectl -n kube-system logs -f dnstap-analyser-bbdf879-g****
説明dnstap-analyser-bbdf879-gpfkmを、この手順のサブステップ1で返されるポッドの名前に置き換えます。
ステップ4: ACK CoreDNS DNSTAPアナライザーのログを分析する
ACK CoreDNS DNSTAP Analyserのログでは、各行にDNSセッションに関する集計情報が含まれています。 DNSセッションには、クライアント、CoreDNS、およびアップストリームDNSサーバー間で交換されるすべての要求と応答が含まれます。 DNSセッションには、次のフィールドが含まれます。
ステータス: [ステータス] フィールドの値は、シナリオによって異なります。
ステータス
説明
成功
ドメイン名が解決されました。 応答は、NXDOMAINまたはNOERRORステータスコードを搬送する。
失敗した
ドメイン名の解決に失敗しました。 応答にはエラーステータスコードが含まれるか、アップストリームDNSサーバーへの接続がタイムアウトします。
サンプルロス
CoreDNSまたはACK CoreDNS DNSTAP Analyserがオーバーロードされ、DNSTAPメッセージがドロップされます。 この場合、CoreDNSまたはACK CoreDNS DNSTAP Analyserを実行するポッドの数を増やして、各ポッドの負荷を軽減する必要があります。 これにより、診断結果の精度が向上します。
BitMap: セッションからキャプチャされるDNSTAPメッセージのタイプを示します。 メッセージタイプに基づいて、DNS解決エラーの考えられる原因を特定できます。
ビットマップ
説明
1
CoreDNSはクライアントからDNSクエリを受信しましたが、クライアントに応答を返しませんでした。
3
内部ドメイン名が解決されました。 クライアントから送信されたDNSクエリは、CoreDNSのローカルDNSキャッシュまたはKubernetesクラスターのDNSレコードにヒットします。 結果がクライアントに返されました。
5
上流DNSサーバの接続に失敗しました。 CoreDNSは、クライアントから送信されたDNSクエリをアップストリームDNSサーバーに転送しました。 アップストリームDNSサーバは結果を返しませんでした。
15
外部ドメイン名が解決されました。 CoreDNSは、クライアントから送信されたDNSクエリをアップストリームDNSサーバーに転送しました。 アップストリームDNSサーバーがドメイン名を解決し、結果をCoreDNSに返しました。 その後、CoreDNSは結果をクライアントに返しました。
メッセージ: このフィールドには、元のDNSクエリと応答の内容がJSON形式で記録されます。 dns-parameters-6に基づいてメッセージの内容を分析できます。
(オプション) ステップ5: ACK CoreDNS DNSTAP Analyserのアンインストール
原因を特定したら、不要なコストを回避するためにACK CoreDNS DNSTAP Analyserをアンインストールすることを推奨します。 ACK CoreDNS DNSTAP Analyserをアンインストールするには、次の手順を実行します。
CoreDNSのConfigMapから
dnstap
を含むコード行を削除します。次のコマンドを実行して、CoreDNSのConfigMapを変更します。
kubectl -n kube-system edit cm coredns -o yaml
次の内容に基づいて、CoreDNSのConfigMapから
dnstap
を含むコード行を削除します。Corefile: | .:53 { #Details are omitted. ready # Delete the following line that you added. dnstap tcp://10.10.10.10:6000 full kubernetes cluster.local in-addr.arpa ip6.arpa { #Details are omitted. } #Details are omitted. reload loadbalance }
次のコマンドを実行して、CoreDNSを実行するすべてのポッドを照会します。
kubectl -n kube-system get pod | grep coredns
期待される出力:
coredns-7d56l 1/1 Running 0 30m coredns-s7m2t 1/1 Running 0 30m
次のコマンドを実行して、CoreDNSログを照会します。
kubectl -n kube-system logs -f --tail=500 coredns-7d56l
説明coredns-7d56lを、前のサブステップcで返されたポッドの名前に置き換えます。
1分待ちます。 次の出力が返され、例外が発生しない場合、設定は変更されます。
[INFO] Reloading complete
ACK CoreDNS DNSTAP Analyserをアンインストールします。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
クラスターの詳細ページの左側のウィンドウで、
を選択します。Helmページで、ack-coredns-dnstap-analyserを見つけ、[操作] 列の [削除] をクリックします。 画面上の指示に従って、ack-coredns-dnstap-analyserを削除します。