DNS は Kubernetes クラスターにおける重要なサービスです。クライアント構成が不適切な場合や大規模クラスターでは、DNS に解決タイムアウトや障害が発生する可能性があります。本トピックでは、これらの問題を回避するための、Kubernetes クラスターにおける DNS のベストプラクティスを説明します。
注意事項
このトピックは、CoreDNS のマネージド版、または自動モードが有効な ACK クラスターには適用されません。CoreDNS のマネージド版は負荷に基づいて自動的にスケーリングされるため、手動調整は不要です。
このトピックの内容
DNS のベストプラクティスには、クライアント側とサーバー側の両方の最適化が含まれます:
-
クライアント側では、適切なコンテナイメージ、ノード OS、および NodeLocal DNSCache を使用することで、ドメイン名解決リクエストを最適化し、レイテンシーを削減し、名前解決の失敗を最小限に抑えることができます。
-
CoreDNS サーバー側では、CoreDNS の稼働状況を監視することで DNS の例外を検知し、根本原因を迅速に特定できます。また、CoreDNS の Deployment を調整して、高可用性と秒間クエリ数 (QPS) のスループットを向上させることもできます。
CoreDNS の詳細については、「CoreDNS の公式ドキュメント」をご参照ください。
ドメイン名解決リクエストの最適化
ドメイン名解決は、Kubernetes クラスターで最も頻繁に行われるネットワーク操作の 1 つです。これらのリクエストの多くは、最適化または回避することで、DNS インフラストラクチャのレイテンシーと負荷を削減できます。ドメイン名解決リクエストは、次の方法で最適化できます。
-
(推奨) 接続プールの使用:コンテナ化されたアプリケーションが別の Service に頻繁にリクエストを送信する場合、接続プールを使用して、アップストリームサービスへのアクティブな接続をメモリにキャッシュします。これにより、各リクエストの DNS 解決と TCP ハンドシェイクのオーバーヘッドが解消されます。
-
非同期モードまたはロングポーリングモードを使用して、ドメイン名の IP アドレスを取得します。
-
DNS キャッシュの使用:
-
(推奨) アプリケーションを変更して接続プールを使用できない場合は、アプリケーション側で DNS 解決結果をキャッシュすることを検討してください。詳細については、NodeLocal DNSCache の使用をご参照ください。
-
NodeLocal DNSCache を使用できない場合は、コンテナに組み込まれている Name Service Cache Daemon (NSCD) キャッシュを使用できます。詳細については、Kubernetes クラスターでの NSCD の使用をご参照ください。
-
-
resolv.conf ファイルの最適化:resolv.conf ファイルの ndots パラメータと search パラメータのメカニズムがあるため、コンテナ内でのドメイン名の記述方法が、ドメイン名解決の効率を決定します。ndots パラメータと search パラメータのメカニズムの詳細については、DNS ポリシー構成とドメイン名解決をご参照ください。
-
ドメイン名構成の最適化:コンテナ内のアプリケーションがドメイン名にアクセスする場合、解決試行を最小限に抑え、解決のレイテンシーを削減するために、次のように構成します。
-
Pod から同じ名前空間内の Service にアクセスするには、
<service-name>を使用します。ここで、service-nameは Service の名前です。 -
Pod から別の名前空間内の Service にアクセスするには、
<service-name>.<namespace-name>を使用します。ここで、namespace-nameは Service が存在する名前空間です。 -
Pod が外部ドメイン名にアクセスする場合は、完全修飾ドメイン名 (FQDN) を使用します。FQDN は末尾のドット (.) で終わり、
searchリストからドメインを追加することによって発生する複数の無効な DNS ルックアップを防ぎます。たとえば、www.aliyun.com にアクセスするには、その FQDN である www.aliyun.com. を使用します。-
Kubernetes 1.22 以降のクラスターでは、検索ドメインを単一のピリオド (.) として構成することで、同様の効果を実現できます (Issue 125883 を参照)。
dnsPolicy: None dnsConfig: nameservers: ["192.168.0.10"] ## CoreDNS Service の実際の 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 を使用することは避けてください。代わりに、Debian や CentOS などの他のベースイメージを使用してください。Alpine コンテナイメージに組み込まれている
musl libcライブラリには、標準の glibc と比較して実装上の違いがいくつかあり、以下のような問題が発生する可能性があります。-
TCP フォールバック:Alpine 3.18 以前のバージョンは、Truncated (TC) フラグが返された場合に TCP へのフォールバックをサポートしていません。
-
検索ドメイン: Alpine 3.3 以前のバージョンでは search パラメーターがサポートされていないため、サービスディスカバリーが機能しなくなります。
-
最適化の競合: Alpine が /etc/resolv.conf に設定されているすべての DNS サーバーに同時にクエリを実行すると、NodeLocal DNSCache の最適化がバイパスされ、無効になる可能性があります。
-
conntrack の競合状態:古い Linux カーネルでは、同じソケットを使用する A および AAAA レコードへの同時リクエストが conntrack の送信元ポートの競合を引き起こし、パケット損失が発生する可能性があります。
これらの問題の詳細については、「musl libc」をご参照ください。
-
-
Go アプリケーションを使用する場合は、CGO 実装と Pure Go 実装における DNS リゾルバーの違いに注意してください。
IPVS の欠陥による DNS タイムアウトの回避
クラスターが kube-proxy の負荷分散モードとして IPVS を使用している場合、CoreDNS がスケールダウンまたは再起動されると、DNS 名前解決のタイムアウトが確率的に発生することがあります。この問題は、コミュニティ Linux カーネルの欠陥が原因です。詳細については、IPVS をご参照ください。
IPVS の欠陥による影響を緩和するには、次のいずれかの方法を使用できます。
-
NodeLocal DNSCache の使用。詳細については、NodeLocal DNSCache の使用をご参照ください。
-
kube-proxy での IPVS UDP セッション維持タイムアウト期間の変更。詳細については、kube-proxy で IPVS UDP セッション維持のタイムアウト期間を変更する方法をご参照ください。
NodeLocal DNSCache の使用
CoreDNS では、次のような問題が発生する可能性があります。
-
まれに、A および AAAA の同時クエリによってパケット損失が発生し、DNS 名前解決に失敗することがあります。
-
ノード上で
conntrackテーブルがいっぱいになると、パケット損失が発生し、DNS 名前解決に失敗することがあります。
クラスターにおける DNS の安定性とパフォーマンスを向上させるには、NodeLocal DNSCache コンポーネントをインストールします。このコンポーネントは、各クラスターノードで DNS キャッシュを実行することで、クラスターの DNS パフォーマンスを向上させます。NodeLocal DNSCache の詳細、および ACK クラスターへのデプロイ方法については、NodeLocal DNSCache コンポーネントの使用をご参照ください。
NodeLocal DNSCache をインストールした後、Pod に DNS キャッシュ構成をインジェクトする必要があります。次のコマンドを実行して、特定の Namespace に label を追加できます。この Namespace で作成される新しい Pod には、DNS キャッシュ構成が自動的にインジェクトされます。その他のインジェクション方法の詳細については、前の段落で参照しているドキュメントをご参照ください。
kubectl label namespace default node-local-dns-injection=enabled
適切な CoreDNS バージョンの使用
CoreDNS は、Kubernetes バージョンとの下位互換性に優れています。CoreDNS を最新の安定バージョンに更新してください。ACK コンソールの [アドオン] ページで、CoreDNS のインストール、アップグレード、および構成ができます。[アドオン] ページで CoreDNS コンポーネントのステータスを確認してください。アップグレードが利用可能な場合は、オフピーク時間にアップグレードをスケジュールしてください。
-
CoreDNS のアップグレード方法の詳細については、「非マネージド CoreDNS の自動アップグレード」をご参照ください。
-
CoreDNS のリリースノートについては、「CoreDNS」をご参照ください。
CoreDNS v1.7.0 より前のバージョンには、次のようないくつかの潜在的なリスクがあります。
-
API server の再起動、移行、またはネットワークジッターなどにより、CoreDNS と API server 間の接続に異常が発生した場合、CoreDNS はエラーログの書き込みに失敗して再起動する可能性があります。詳細については、「Set klog's logtostderr flag」をご参照ください。
-
CoreDNS は起動時に追加のメモリを消費します。デフォルトのメモリ制限では、大規模クラスターでメモリ不足 (OOM) の問題が発生する可能性があります。深刻な場合、CoreDNS Pod が再起動ループに陥り、回復できなくなることがあります。詳細については、「CoreDNS uses a lot memory during initialization phase」をご参照ください。
-
CoreDNS には、headless Service のドメイン名やクラスター外のドメイン名の解決に影響を与える可能性のある問題がいくつかあります。詳細については、「plugin/kubernetes: handle tombstones in default processor」および「Data is not synced when CoreDNS reconnects to kubernetes api server after protracted disconnection」をご参照ください。
-
クラスターノードに異常が発生した場合、一部の古い CoreDNS バージョンのデフォルトの Toleration ポリシーにより、CoreDNS Pod が異常なノードにスケジュールされる可能性があります。これらの Pod は自動的に退避されず、DNS 名前解決の失敗につながります。
推奨される CoreDNS の最小バージョンは、クラスターの Kubernetes バージョンによって異なります。
|
クラスター バージョン |
最小 CoreDNS バージョン |
|
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 の障害は、クラスター内の Service へのアクセスに失敗し、広範囲なサービス停止につながる可能性があります。CoreDNS の高可用性を確保するために、以下の対策を講じることができます。
CoreDNS コンポーネントの負荷評価
クラスターで DNS 負荷テストを実行して、コンポーネントの負荷を評価できます。DNSPerf をはじめとする多くのオープンソースツールが役立ちます。クラスター内の DNS 負荷を正確に評価できない場合は、以下の推奨事項に従ってください。
-
CoreDNS Pod の数は常に少なくとも 2 つに設定し、単一 Pod のリソース制限は少なくとも 1 コア、1 GiB とします。
-
CoreDNS のドメイン名解決 QPS は、その CPU 消費量と正の相関があります。NodeLocal DNSCache が有効な場合、各 CPU コアは 10,000 QPS 以上をサポートできます。ドメイン名リクエストの QPS 需要は、サービスの種類によって大きく異なります。各 CoreDNS Pod のピーク時の CPU 使用率を監視できます。ピーク時に Pod の CPU 使用量が 1 コアを超える場合、CoreDNS レプリカをスケールアウトすることを推奨します。ピーク時の CPU 使用率を判断できない場合は、控えめに Pod とクラスターノードの比率を 1:8 で使用できます。つまり、追加するクラスターノード 8 つごとに、CoreDNS Pod を 1 つ追加します。
CoreDNS Pod 数の調整
CoreDNS Pod の数は、CoreDNS が使用できるコンピューティングリソースを直接決定します。評価に基づいて CoreDNS Pod の数を調整できます。
UDP パケットには再送メカニズムがないため、IPVS の UDP に関する不具合によりクラスターノードでパケット損失のリスクがある場合、CoreDNS Pod のスケールインまたは再起動により、クラスター全体で最大 5 分間、DNS 名前解決でタイムアウトや例外が発生する可能性があります。IPVS の不具合によって引き起こされる名前解決の例外に対する解決策については、「DNS 名前解決の問題のトラブルシューティング」をご参照ください。
-
推奨ポリシーに基づく自動調整
次の
dns-autoscalerをデプロイできます。これは、推奨ポリシー (ポッドとクラスターノードの比率 1:8) に基づいて、CoreDNS ポッドの数をリアルタイムで自動的に調整します。ポッド数は、計算式 replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica)) を使用して計算され、maxおよびminパラメーターによって制限されます。 -
手動調整
次のコマンドを実行して、CoreDNS Pod の数を手動で調整できます。
kubectl scale --replicas={target} deployment/coredns -n kube-system # {target} を目的の Pod 数に置き換えます。 -
ワークロードの自動スケーリングを使用しない
Horizontal Pod Autoscaler (HPA) や CronHPA などのワークロードの自動スケーリング機能も Pod 数を自動的に調整できますが、頻繁なスケーリング操作が発生します。Pod のスケールイン時に DNS 名前解決の例外が発生するため、ワークロードの自動スケーリング機能で CoreDNS Pod の数を制御することは避けてください。
CoreDNS Pod 仕様の調整
CoreDNS のリソースを調整するもう 1 つの方法は、Pod の仕様を変更することです。ACK マネージド Pro 版クラスターでは、CoreDNS Pod のデフォルトのメモリ制限は 2Gi で、CPU 制限はありません。CPU 制限を 4096m に、最小値を 1024m に設定します。コンソールで CoreDNS Pod の設定を調整できます。
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 設定には、リスクが含まれている場合があります。以下のように確認し、最適化してください。
また、コンテナインテリジェンスサービスの定期検査および障害診断機能を使用して、CoreDNS 設定ファイルを確認することもできます。コンテナインテリジェンスサービスからの検査結果で CoreDNS ConfigMap 設定に異常があることが示されている場合は、前述の各項目を確認してください。
CoreDNS は、設定を更新する際に追加のメモリを消費することがあります。CoreDNS ConfigMap を変更した後は、Pod のステータスを監視してください。Pod がメモリ不足になった場合は、CoreDNS Deployment のコンテナのメモリ制限を速やかに増やしてください。メモリ制限を 2 GB に調整することを推奨します。
kube-dns Service のセッションアフィニティの無効化
セッションアフィニティは、CoreDNS レプリカ間で大幅な負荷の不均衡を引き起こす可能性があります。次の手順に従って無効化してください。
コンソール
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
kube-system 名前空間で、kube-dns Service の右側にある YAML の編集 をクリックします。
-
sessionAffinity フィールドが
Noneに設定されている場合は、これ以上の操作は必要ありません。 -
sessionAffinity フィールドが
ClientIPに設定されている場合は、次の手順に進みます。
-
-
sessionAffinity および sessionAffinityConfig フィールドとそのすべてのサブキーを削除し、更新 をクリックします。
# 以下の内容をすべて削除します。 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 -
再度 kube-dns Service の右側にある YAML の編集 をクリックし、sessionAffinity フィールドが
Noneに設定されていることを確認します。値がNoneであれば、kube-dns Service が正常に変更されたことを示します。
CLI
-
次のコマンドを実行して、kube-dns Service の設定情報を表示します。
kubectl -n kube-system get svc kube-dns -o yaml-
sessionAffinity フィールドが
Noneに設定されている場合は、これ以上の操作は必要ありません。 -
sessionAffinity フィールドが
ClientIPに設定されている場合は、次の手順に進みます。
-
-
次のコマンドを実行して、kube-dns という名前の Service を開いて編集します。
kubectl -n kube-system edit service kube-dns -
sessionAffinity 関連の設定 (sessionAffinity、sessionAffinityConfig、およびそのすべてのサブキー) を削除し、保存して終了します。
# 以下の内容をすべて削除します。 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 -
変更が完了したら、再度次のコマンドを実行して、sessionAffinity フィールドが
Noneに設定されているか確認します。値がNoneの場合、kube-dns Service への変更は成功です。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という単語が含まれている場合、変更は成功です。
グレースフルシャットダウンの設定
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 が異常になった場合は、そのイベントとログを表示して原因を特定できます。
CLI
-
次のコマンドを実行して、CoreDNS 設定ファイルを開きます。
-
Corefile で、
healthプラグインが有効になっていることを確認し、lameduck パラメーターを15sに設定します。 -
CoreDNS 設定ファイルを変更した後、保存して終了します。
-
CoreDNS が正常に実行されていれば、変更は成功です。CoreDNS 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 は TCP を使用して CoreDNS と通信します。次に、CoreDNS は受信リクエストと同じプロトコルを使用してアップストリーム DNS サーバーと通信します。したがって、デフォルトでは、ビジネスコンテナからクラスター外のドメイン名を解決するリクエストは、NodeLocal DNSCache と CoreDNS を経由し、最終的に TCP 経由で VPC DNS サーバー (ECS インスタンスではデフォルトで 100.100.2.136 と 100.100.2.138) に到達します。
VPC DNS サーバーは、TCP のサポートが制限されています。 NodeLocal DNSCache を使用する場合、名前解決の例外を避けるために、アップストリーム 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 コア数に等しいです。