DNS は Kubernetes クラスターにおける重要なサービスです。不適切なクライアント設定や大規模なクラスターなどの特定の条件下では、名前解決がタイムアウトしたり、失敗したりする可能性があります。このガイドでは、これらの問題を未然に防ぐためのベストプラクティスを解説します。
注意事項
このトピックは、CoreDNS のマネージド版を使用している、または自動モードが有効になっている Container Service for Kubernetes (ACK) クラスターには適用されません。これらのクラスターは負荷に応じて自動的にスケーリングされるため、手動での調整は不要です。
目次
DNS のベストプラクティスは、クライアント側とサーバー側の両方の最適化を対象としています。
-
クライアント側:DNS リクエストを最適化してレイテンシーを削減し、適切なコンテナイメージ、ノードオペレーティングシステム、NodeLocal DNSCache を使用して障害を最小限に抑えます。
-
サーバー側:CoreDNS の運用ステータスをモニタリングすることで、DNS の例外を特定し、その根本原因を突き止めます。また、デプロイ構成を調整することで、高可用性と秒間クエリ数 (QPS) のスループットを向上させることもできます。
CoreDNS の詳細については、「CoreDNS 公式ドキュメント」をご参照ください。
名前解決リクエストの最適化
名前解決は、Kubernetes クラスター内で頻繁に行われるネットワーク操作です。これらのリクエストの多くを最適化または回避することで、レイテンシーと DNS インフラストラクチャへの負荷を削減できます。
-
(推奨) 接続プールを使用します。アプリケーションが頻繁に別のサービスにリクエストする場合、接続プールを使用することを推奨します。接続プールは、上流サービスへのアクティブな接続をメモリにキャッシュします。この方法により、リクエストごとの名前解決と TCP ハンドシェイクのオーバーヘッドがなくなります。
-
非同期リクエストまたはロングポーリングを使用して、ドメイン名にマッピングされている IP アドレスを取得します。
-
DNS キャッシュを使用します。
-
(推奨) アプリケーションをリファクタリングして接続プールを使用して別のサービスに接続できない場合は、クライアント側で名前解決の結果をキャッシュすることを検討してください。詳細については、「NodeLocal DNSCache の使用」をご参照ください。
-
NodeLocal DNSCache を使用できない場合は、コンテナに組み込まれている Name Service Cache Daemon (NSCD) を使用できます。NSCD キャッシュの使用方法の詳細については、「Kubernetes クラスターで NSCD を使用する」をご参照ください。
-
-
resolv.conf ファイルを最適化します。resolv.conf ファイルの ndots および search パラメーターの動作方法により、コンテナ内でのドメイン名の記述方法が名前解決の効率を決定します。ndots および search パラメーターのメカニズムの詳細については、「DNS ポリシー設定と名前解決」をご参照ください。
-
ドメイン名設定を最適化します。アプリケーションがドメイン名にアクセスする際は、以下の原則に従って指定します。これにより、名前解決の試行回数が最小限に抑えられ、レイテンシーが削減されます。
-
Pod が同じ名前空間内のサービスにアクセスする場合、
<service-name>を使用してサービスにアクセスします。service-nameはサービスの名前を示します。 -
Pod が異なる名前空間内のサービスにアクセスする場合、
<service-name>.<namespace-name>を使用してサービスにアクセスします。namespace-nameはサービスが存在する名前空間を示します。 -
Pod が外部ドメインにアクセスする場合、
searchドメインの追加による不要な複数回の検索を避けるため、ピリオド (.) で終わるドメイン名である FQDN の使用を優先します。たとえば、www.aliyun.com にアクセスする場合、FQDN www.aliyun.com. を使用します。-
Kubernetes 1.33 以降を実行しているクラスターでは、検索ドメインを単一のピリオド (
.) として設定できます (「Issue 125883」をご参照ください)。これにより、すべての DNS リクエストが事実上 FQDN リクエストとなり、不要な検索ドメインの反復が防止されます。dnsPolicy: None dnsConfig: nameservers: ["192.168.0.10"] ## 192.168.0.10 を kube-dns サービスの clusterIP に置き換えてください。 searches: - . - default.svc.cluster.local ## 注意: default を実際の名前空間に置き換えてください。 - svc.cluster.local - cluster.local上記の設定により、Pod 内の /etc/resolv.conf ファイルは次のようになります。
search . default.svc.cluster.local svc.cluster.local cluster.local nameserver 192.168.0.10最初の検索ドメインとして
.を使用すると、システムは解決リクエストのターゲットドメイン名を即座に FQDN として扱い、直接解決を試み、不要な検索を回避します。重要この設定を有効にするには、
dnsPolicyをNoneに設定する必要があります。
-
-
コンテナにおける DNS 設定の理解
-
DNS リゾルバーが異なると実装に微妙な違いがあり、
dig <domain>は成功するのにping <domain>は失敗する、といった事象が発生する可能性があります。 -
Alpine Linux の代わりに、Debian や CentOS などのベースイメージを使用することを強く推奨します。Alpine で使用されている
musl libcライブラリは、標準のglibcと比較していくつかの実装上の違いがあり、以下のような問題を引き起こします。-
Alpine バージョン 3.18 以前は、切り捨て (TC) 応答に対する TCP へのフォールバックをサポートしていません。
-
Alpine バージョン 3.3 以前は、search パラメーターや検索ドメインをサポートしていません。これにより、サービス検出が機能しなくなります。
-
/etc/resolv.conf で設定された複数の DNS サーバーへの同時リクエストは、NodeLocal DNSCache の最適化をバイパスする可能性があります。
-
同時 A および AAAA レコードリクエストに同じソケットを使用すると、古いカーネルバージョンで conntrack の送信元ポートの競合がトリガーされ、パケット損失が発生する可能性があります。
これらの問題の詳細については、「musl libc ドキュメント」をご参照ください。
-
-
Go アプリケーションを使用する場合は、cgo と pure Go の実装における DNS リゾルバーの違いを理解してください。
IPVS モードにおける断続的な DNS タイムアウトの緩和
クラスターが kube-proxy の負荷分散モードとして IPVS を使用している場合、CoreDNS がスケールダウンまたは再起動されると、断続的な名前解決のタイムアウトが発生することがあります。この問題は Linux カーネルのバグが原因です。詳細については、「IPVS」をご参照ください。
この IPVS の欠陥による影響を緩和するには、次のいずれかの方法を使用できます。
-
NodeLocal DNSCache を使用します。詳細については、「NodeLocal DNSCache の使用」をご参照ください。
-
kube-proxy の IPVS UDP セッション維持タイムアウトを変更します。詳細については、「kube-proxy の IPVS UDP セッション維持タイムアウトを変更する方法」をご参照ください。
NodeLocal DNSCache の使用
CoreDNS は、時折、以下の問題に遭遇することがあります。
-
まれに、同時 A および AAAA クエリによるパケット損失が発生し、名前解決の失敗を引き起こすことがあります。
-
ノード上の conntrack テーブルが満杯になるとパケット損失が発生し、名前解決の失敗につながることがあります。
クラスター内の DNS サービスの安定性とパフォーマンスを向上させるために、NodeLocal DNSCache アドオンをインストールすることを推奨します。このアドオンは、各ノードでローカル DNS キャッシュを実行することにより、クラスターの DNS パフォーマンスを向上させます。NodeLocal DNSCache の詳細と ACK クラスターへのデプロイ方法については、「NodeLocal DNSCache アドオンの使用」をご参照ください。
NodeLocal DNSCache をインストールした後、DNS キャッシュ設定を Pod に注入する必要があります。次のコマンドを実行して、指定した名前空間にラベルを追加します。この名前空間で作成された新しい Pod には、DNS キャッシュ設定が自動的に注入されます。他の注入方法の詳細については、上記のドキュメントをご参照ください。
kubectl label namespace default node-local-dns-injection=enabled
適切な CoreDNS バージョンの使用
CoreDNS は Kubernetes との良好な下位互換性を提供しています。しかし、CoreDNS を最新の安定バージョンに更新しておくことが重要です。ACK コンソールの [アドオン] ページでは、CoreDNS のインストール、アップグレード、設定が可能です。[アドオン] ページで CoreDNS アドオンのステータスを確認してください。アップグレードが利用可能な場合は、オフピーク時にスケジュールしてください。
-
アップグレードの実行方法の詳細については、「非マネージド CoreDNS の自動アップグレード」をご参照ください。
-
CoreDNS バージョンのリリースノートについては、「CoreDNS」をご参照ください。
v1.7.0 より前の CoreDNS バージョンには、以下を含むがこれらに限定されない潜在的なリスクがあります。
-
CoreDNS と API サーバー間の接続が異常な場合 (たとえば、API サーバーの再起動、移行、またはネットワークジッターが原因)、CoreDNS はエラーログの書き込みに失敗するため再起動します。詳細については、「klog の logtostderr フラグを設定する」をご参照ください。
-
CoreDNS は起動時に追加のメモリを消費します。デフォルトのメモリ制限は、大規模なクラスターでメモリ不足 (OOM) の問題を引き起こす可能性があります。深刻な場合、CoreDNS Pod は再起動ループに入ることがあり、自動的に回復できなくなります。詳細については、「初期化フェーズ中に CoreDNS が大量のメモリを使用する」をご参照ください。
-
CoreDNS には、ヘッドレスサービスドメイン名およびクラスター外のドメイン名の解決に影響を与える可能性のあるいくつかの問題があります。詳細については、「plugin/kubernetes: デフォルトプロセッサで tombstone を処理する」および「長時間の切断後に CoreDNS が kubernetes api サーバーに再接続するとデータが同期されない」をご参照ください。
-
クラスターノードが異常な場合、一部の古い CoreDNS バージョンのデフォルトの toleration ポリシーにより、CoreDNS Pod が異常なノードにスケジュールされても退避されず、名前解決エラーが発生することがあります。
推奨される最小 CoreDNS バージョンは、クラスターの Kubernetes バージョンによって異なります。詳細は次の表のとおりです。
|
クラスターバージョン |
推奨最小バージョン |
|
1.14.8 より前 |
v1.6.2 (サポート終了) |
|
1.14.8 以降、1.20.4 より前 |
v1.7.0.0-f59c03d-aliyun |
|
1.20.4 以降、1.21.0 より前 |
v1.8.4.1-3a376cc-aliyun |
|
1.21.0 以降 |
v1.11.3.2-f57ea7ed6-aliyun |
CoreDNS の運用ステータスのモニタリング
メトリックのモニタリング
CoreDNS は、名前解決の結果などのヘルス メトリックを標準の Prometheus インターフェイスを通じて公開し、CoreDNS サーバーや上流の DNS サーバーのエラー検出を支援します。
Managed Service for Prometheus は、CoreDNS 用の組み込みメトリックモニタリングとアラートルールを提供します。ACK コンソールで Prometheus とそのダッシュボード機能を有効にできます。詳細については、「CoreDNS コンポーネントのモニタリング」をご参照ください。
自己管理の Prometheus インスタンスを使用して Kubernetes クラスターをモニタリングしている場合、Prometheus で関連メトリックを監視し、主要なメトリックにアラートを設定できます。詳細については、「CoreDNS Prometheus 公式ドキュメント」をご参照ください。
ログ
DNS エラーが発生した場合、CoreDNS のログは根本原因を迅速に診断するのに役立ちます。CoreDNS の名前解決ログと Log Service のコレクションを有効にすることを推奨します。詳細については、「CoreDNS ログの分析とモニタリング」をご参照ください。
Kubernetes イベント配信
CoreDNS v1.9.3.6-32932850-aliyun 以降では、k8s_event プラグインを有効にして、重要な CoreDNS ログを Kubernetes イベントとしてイベントセンターに配信できます。k8s_event プラグインの詳細については、「k8s_event」をご参照ください。
この機能は、新しい CoreDNS デプロイメントではデフォルトで有効になっています。CoreDNS を以前のバージョンから v1.9.3.6-32932850-aliyun 以降にアップグレードする場合は、手動で設定ファイルを変更してこの機能を有効にする必要があります。
-
次のコマンドを実行して、CoreDNS 設定ファイルを開きます。
kubectl -n kube-system edit configmap/coredns -
kubeAPI と k8s_event プラグインを追加します。
apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } // 追加の開始 (他の違いは無視) kubeapi k8s_event { level info error warning // info、error、warning レベルの重要なログを配信します。 } // 追加の終了 kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } // ... (残りの設定は省略) } -
CoreDNS Pod のステータスとログを確認します。ログに
reloadという単語が含まれている場合、変更は成功です。
CoreDNS の高可用性
CoreDNS はクラスターの権威 DNS です。CoreDNS の障害は、クラスター内のサービスへのアクセスを妨げ、広範囲にわたるアプリケーションの停止を引き起こす可能性があります。CoreDNS の高可用性を確保するために、以下の対策を講じることができます。
CoreDNS の負荷評価
クラスターで DNS ストレステストを実行して、負荷を評価できます。DNSPerf など、多くのオープンソースツールがこれを実現するのに役立ちます。クラスターの DNS 負荷を正確に評価できない場合は、以下の推奨事項をご参照ください。
-
すべてのシナリオで、CoreDNS Pod の数を少なくとも 2 に設定することを推奨します。単一 Pod のリソース制限は、少なくとも 1 コアと 1 GiB のメモリである必要があります。
-
CoreDNS が提供できる名前解決の QPS は、CPU 消費量と正の相関があります。NodeLocal DNSCache を使用すると、各 CPU コアは通常 10,000 QPS 以上をサポートできます。DNS リクエストの QPS 要件は、サービスの種類によって大きく異なります。各 CoreDNS Pod のピーク時の CPU 使用率を監視できます。ピーク時に CPU 消費量が 1 コアを超える場合は、CoreDNS レプリカをスケールアウトします。ピーク時の CPU 使用率を判断できない場合は、保守的に 1:8 のレプリカ対ノード比を使用します。
CoreDNS レプリカ数の調整
CoreDNS レプリカ数は、CoreDNS が使用できるコンピューティングリソースを直接決定します。評価に基づいて CoreDNS レプリカ数を調整できます。
UDP には再送メカニズムがないため、IPVS UDP の欠陥によりクラスターノードでパケット損失のリスクがある場合、CoreDNS Pod をスケールインまたは再起動すると、クラスター全体で最大 5 分間、名前解決のタイムアウトやエラーが発生する可能性があります。IPVS の欠陥が原因で発生する解決エラーの解決方法の詳細については、「名前解決エラーのトラブルシューティング」をご参照ください。
-
推奨ポリシーに基づいて自動調整
以下の
dns-autoscalerをデプロイできます。これは、推奨される 1:8 のレプリカ対ノード比に基づいて、CoreDNS レプリカ数をリアルタイムで自動的に調整します。レプリカ数は、次の数式を使用して計算されます:replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica))。結果は、maxとminの値によっても制約されます。 -
手動調整
次のコマンドを実行して、CoreDNS レプリカ数を手動で調整できます。
kubectl scale --replicas={target} deployment/coredns -n kube-system # {target} を目的のレプリカ数に置き換えてください。 -
ワークロードの自動スケーリングを使用しない
Horizontal Pod Autoscaler (HPA) や CronHPA などのワークロード自動スケーリングメカニズムもレプリカ数を調整できますが、頻繁なスケーリングを実行します。スケールインは解決エラーを引き起こす可能性があるため、CoreDNS にはワークロードの自動スケーリングを使用しないでください。
CoreDNS Pod 仕様の調整
Pod 仕様を変更することで、CoreDNS のリソースを調整することもできます。ACK マネージド Pro クラスターでは、CoreDNS Pod のデフォルトのメモリ制限は 2 GiB で、CPU 制限はありません。一貫したパフォーマンスのためには、CPU 制限を少なくとも 1024m にすることを推奨します。これらのリソースリクエストと制限は、コンソールで調整できます。
CoreDNS Pod のスケジューリング
誤ったスケジューリング設定は、CoreDNS Pod のデプロイを妨げ、CoreDNS の障害につながる可能性があります。この操作を実行する前に、「スケジューリング」に精通していることを確認してください。
単一障害点を避けるために、CoreDNS Pod を異なるアベイラビリティゾーンと異なるクラスターノードにデプロイすることを推奨します。v1.8.4.3 より前の CoreDNS アドオンバージョンには、デフォルトで優先ノードアンチアフィニティがあり、リソースが不足している場合に Pod が同じノードにデプロイされる可能性があります。この場合、Pod を削除して再スケジューリングをトリガーするか、アドオンを最新バージョンにアップグレードしてください。v1.8 より前の CoreDNS アドオンバージョンはメンテナンスされなくなりました。できるだけ早く最新バージョンにアップグレードしてください。
CoreDNS を実行しているノードが、高い CPU またはメモリ使用量で飽和状態になっていないことを確認してください。これは、名前解決の QPS とレスポンスレイテンシーに影響します。クラスターノードのリソースに余裕がある場合は、カスタムパラメーターを使用して CoreDNS を独立したクラスターノードにスケジュールし、安定した名前解決サービスを提供することを検討してください。
CoreDNS 設定の最適化
ACK は CoreDNS のデフォルト設定を提供します。CoreDNS がビジネスコンテナに適切な DNS サービスを提供できるように、設定内のパラメーターを確認し、最適化する必要があります。CoreDNS は高度に設定可能です。詳細については、「DNS ポリシーと名前解決の設定」および「CoreDNS 公式ドキュメント」をご参照ください。
古い Kubernetes クラスターのデフォルトの CoreDNS 設定には、いくつかのリスクがある可能性があります。以下の項目を確認し、最適化することを推奨します。
また、Container Intelligence Service の定期検査および障害診断機能を使用して、CoreDNS 設定ファイルを確認することもできます。サービスが異常な CoreDNS ConfigMap 設定を報告した場合、上記の項目を確認してください。
CoreDNS は、設定をリフレッシュする際に余分なメモリを消費することがあります。CoreDNS ConfigMap を変更した後は、Pod のステータスを監視してください。Pod のメモリが不足している場合は、CoreDNS Deployment のコンテナメモリ制限を適時に変更してください。メモリを 2 GiB に調整することを推奨します。
kube-dns サービスのアフィニティの無効化
アフィニティ設定は、異なる CoreDNS レプリカ間で著しい負荷の不均衡を引き起こす可能性があります。以下の手順に従って無効にすることを推奨します。
コンソール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
kube-system 名前空間で、kube-dns サービスの右側にある YAML の編集 をクリックします。
-
sessionAffinity フィールドが
Noneに設定されている場合は、以下の手順をスキップできます。 -
sessionAffinity フィールドが
ClientIPに設定されている場合は、以下の手順を実行します。
-
-
sessionAffinity と sessionAffinityConfig フィールドおよびそのすべてのサブキーを削除します。その後、更新 をクリックします。
# 以下のすべてのコンテンツを削除します。 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 -
kube-dns サービスの右側にある YAML の編集 を再度クリックします。sessionAffinity フィールドが
Noneに設定されていることを確認します。Noneの値は、Kube-DNS サービスが正常に更新されたことを示します。
CLI
-
次のコマンドを実行して、kube-dns サービスの設定詳細を表示します。
kubectl -n kube-system get svc kube-dns -o yaml-
sessionAffinity フィールドが
Noneに設定されている場合は、以下の手順をスキップできます。 -
sessionAffinity フィールドが
ClientIPに設定されている場合は、以下の手順を実行します。
-
-
次のコマンドを実行して、kube-dns という名前のサービスを開いて編集します。
kubectl -n kube-system edit service kube-dns -
sessionAffinity 関連の設定 (sessionAffinity、sessionAffinityConfig、およびそのすべてのサブキー) を削除し、保存して終了します。
# 以下のすべてのコンテンツを削除します。 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 -
変更が完了したら、再度次のコマンドを実行して、sessionAffinity フィールドが
Noneであるかどうかを確認します。値がNoneの場合、Kube-DNS サービスは正常に変更されています。kubectl -n kube-system get svc kube-dns -o yaml
autopath プラグインの無効化
一部の初期の CoreDNS バージョンで有効になっている autopath プラグインは、エッジケースで解決エラーを引き起こす可能性があります。プラグインが有効になっているかどうかを確認し、設定ファイルを編集して無効にします。詳細については、「Autopath」をご参照ください。
autopath プラグインを無効にすると、クライアント側の名前解決リクエストの QPS が最大 3 倍に増加し、単一のドメイン名を解決するのにかかる時間も最大 3 倍に増加する可能性があります。CoreDNS の負荷とサービスへの影響を監視してください。
-
kubectl -n kube-system edit configmap corednsコマンドを実行して、CoreDNS 設定ファイルを開きます。 -
autopath @kubernetes行を削除し、保存して終了します。 -
CoreDNS Pod のステータスとログを確認します。ログに
reloadという単語が含まれている場合、変更は成功です。
CoreDNS のグレースフルシャットダウンの設定
lameduck は、CoreDNS のグレースフルシャットダウンメカニズムです。CoreDNS が停止または再起動されるときに、進行中のリクエストが適切に完了し、突然中断されないようにします。lameduck メカニズムは次のように機能します。
-
CoreDNS プロセスが終了しようとすると、lameduck モードに入ります。
-
lameduckモードでは、CoreDNS は新しいリクエストの受け入れを停止しますが、すでに受信したリクエストの処理を、すべてのリクエストが完了するか、lameduckタイムアウト期間が経過するまで続行します。
コンソール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
kube-system 名前空間で、coredns ConfigMap の右側にある YAML の編集 をクリックします。
-
以下の CoreDNS 設定ファイルを参照してください。health プラグインが有効になっていることを確認し、lameduck タイムアウトを
15sに調整します。その後、OK をクリックします。
.:53 {
errors
# health プラグインは、CoreDNS のバージョンによって設定が異なる場合があります。
# シナリオ 1: health プラグインはデフォルトで有効になっていません。
# シナリオ 2: health プラグインはデフォルトで有効になっていますが、lameduck 時間は設定されていません。
# health
# シナリオ 3: health プラグインはデフォルトで有効になっており、lameduck 時間は 5s に設定されています。
# health {
# lameduck 5s
# }
# 3 つのシナリオすべてについて、以下のように設定を変更して lameduck パラメーターを 15s に設定します。
health {
lameduck 15s
}
# 他のプラグインは変更する必要がなく、ここでは省略します。
}
CoreDNS Pod が期待どおりに実行されている場合、グレースフルシャットダウン設定は正常に更新されます。CoreDNS Pod が異常な場合は、Pod のイベントとログを表示して原因を特定できます。
CLI
-
次のコマンドを実行して、CoreDNS 設定ファイルを開きます。
-
以下の Corefile を参照してください。
healthプラグインが有効になっていることを確認し、lameduck パラメーターを15sに調整します。 -
CoreDNS 設定ファイルを変更した後、保存して終了します。
-
CoreDNS が期待どおりに実行されている場合、グレースフルシャットダウン設定は正常に更新されます。CoreDNS Pod が異常な場合は、Pod のイベントとログを表示して原因を特定できます。
kubectl -n kube-system edit configmap/coredns
.:53 {
errors
# health プラグインは、CoreDNS のバージョンによって設定が異なる場合があります。
# シナリオ 1: health プラグインはデフォルトで有効になっていません。
# シナリオ 2: health プラグインはデフォルトで有効になっていますが、lameduck 時間は設定されていません。
# health
# シナリオ 3: health プラグインはデフォルトで有効になっており、lameduck 時間は 5s に設定されています。
# health {
# lameduck 5s
# }
# 3 つのシナリオすべてについて、以下のように設定を変更して lameduck パラメーターを 15s に設定します。
health {
lameduck 15s
}
# 他のプラグインは変更する必要がなく、ここでは省略します。
}
forward プラグインプロトコルの設定
NodeLocal DNSCache を使用する場合、通信チェーンは「アプリケーション → NodeLocal DNSCache (TCP) → CoreDNS (TCP)」となります。デフォルトでは、CoreDNS はソースリクエストと同じプロトコルを使用して上流 DNS サーバーと通信します。これは、ワークロードからの外部ドメイン名解決リクエストが NodeLocal DNSCache と CoreDNS を通過し、TCP を介して VPC DNS サーバー (ECS インスタンスにデフォルトで設定されている 2 つの IP アドレス 100.100.2.136 と 100.100.2.138) に送信されることを意味します。
VPC DNS サーバーは TCP のサポートが限定的です。NodeLocal DNSCache を使用する場合、解決エラーを避けるために、CoreDNS が常に上流 DNS サーバーとの通信に UDP を優先するように CoreDNS 設定を変更する必要があります。CoreDNS 設定ファイル (kube-system 名前空間の coredns という名前の ConfigMap) を変更します。詳細については、「ConfigMap の管理」をご参照ください。forward プラグインで、上流リクエストのプロトコルを prefer_udp として指定します。変更後、CoreDNS は上流通信に UDP を優先します。変更は次のとおりです。
# 変更前
forward . /etc/resolv.conf
# 変更後
forward . /etc/resolv.conf {
prefer_udp
}
ready プラグインの設定
CoreDNS バージョン 1.5.0 以降では、readiness プローブを有効にするために ready プラグインを設定する必要があります。
-
次のコマンドを実行して、CoreDNS 設定ファイルを開きます。
kubectl -n kube-system edit configmap/coredns -
ファイルに
readyを含む行があるかどうかを確認します。ない場合は、ready行を追加し、Esc キーを押し、:wq!と入力してから Enter キーを押して、変更した設定ファイルを保存し、編集モードを終了します。apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready # この行が存在しない場合は追加します。インデントが Kubernetes と一致していることを確認してください。 kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 prefer_udp } cache 30 loop log reload loadbalance } -
CoreDNS Pod のステータスとログを確認します。ログに
reloadという単語が含まれている場合、変更は成功です。
multisocket プラグインの設定
CoreDNS v1.12.1 では multisocket プラグインが導入されました。このプラグインを有効にすると、CoreDNS が複数のソケットを使用して同じポートでリッスンできるようになり、高 CPU シナリオでの CoreDNS パフォーマンスが向上します。プラグインの詳細については、「コミュニティドキュメント」をご参照ください。
coredns ConfigMap で multisocket を有効にする必要があります。
.:53 {
...
prometheus :9153
multisocket [NUM_SOCKETS]
forward . /etc/resolv.conf
...
}
NUM_SOCKETS は、同じポートでリッスンするソケットの数を決定します。
設定の推奨事項:NUM_SOCKETS を、推定 CPU 使用率、CPU リソース制限、および利用可能なクラスターリソースに合わせて調整します。例:
-
ピーク時に CoreDNS が 4 コアを消費し、利用可能なリソースが 8 コアの場合、
NUM_SOCKETSを 2 に設定します。 -
ピーク時に CoreDNS が 8 コアを消費し、64 コアが利用可能な場合、
NUM_SOCKETSを 8 に設定します。
最適な設定を決定するために、異なる設定で QPS と負荷をテストすることを推奨します。
NUM_SOCKETS を指定しない場合、デフォルト値は GOMAXPROCS となり、これは CoreDNS Pod の CPU 制限に等しくなります。Pod の CPU 制限が設定されていない場合、値は Pod が実行されているノードの CPU コア数に等しくなります。

