すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:DNS のベストプラクティス

最終更新日:Feb 03, 2026

DNS は Kubernetes クラスターにおける重要なサービスです。クライアントの不適切な構成や大規模なクラスターなど、特定の条件下では、DNS の名前解決でタイムアウトや失敗が発生する可能性があります。このガイドでは、これらの問題を回避するためのベストプラクティスを説明します。

重要

このトピックは、CoreDNS のマネージド版がインストールされているか、自動モードが有効になっている Container Service for Kubernetes (ACK) クラスターには適用されません。これらのクラスターは、手動での調整なしに負荷に基づいて自動的にスケーリングされます。

目次

DNS のベストプラクティスは、クライアントサイドとサーバーサイドの両方の最適化を対象としています:

CoreDNS の詳細については、CoreDNS 公式ドキュメントをご参照ください。

DNS 名前解決リクエストの最適化

DNS 名前解決は、Kubernetes クラスターで最も頻繁に行われるネットワーク操作の 1 つです。多くの名前解決リクエストは、レイテンシーと DNS インフラストラクチャへの負荷を軽減するために最適化または回避できます:

  • (推奨) 接続プールの使用:コンテナ化されたアプリケーションが同じサービスに頻繁にリクエストする場合、接続プールを使用してアップストリームサービスへのアクティブな接続をメモリにキャッシュします。これにより、各リクエストでの DNS 名前解決と TCP ハンドシェイクのオーバーヘッドがなくなります。

  • 非同期またはロングポーリングモードを使用して、ドメイン名に関連付けられた IP を取得します。

  • DNS キャッシュの使用:

    • (推奨) アプリケーションをリファクタリングして接続プールを使用できない場合は、アプリケーション側で DNS 名前解決の結果をキャッシュすることを検討してください。手順については、「NodeLocal DNSCache による安定性の向上」をご参照ください。

    • NodeLocal DNSCache を使用できない場合は、コンテナ内の組み込み Name Service Cache Daemon (NSCD) を使用してください。

  • resolv.conf ファイルの最適化:ndots および search パラメーターが名前解決の効率を決定します。詳細については、「DNS ポリシーの構成とドメイン名の名前解決」をご参照ください。

  • ドメイン構成の最適化:以下の原則に従ってドメイン名を設定し、名前解決の試行回数を最小限に抑え、レイテンシーを短縮します:

    • Pod が同じ名前空間内のサービスにアクセスする場合、<service-name> を使用します。

    • Pod が異なる名前空間内のサービスにアクセスする場合、<service-name>.<namespace-name> を使用します。

    • Pod がクラスター外のドメインにアクセスする場合、末尾にピリオド (.) を追加して完全修飾ドメイン名 (FQDN) を使用します。これにより、リゾルバーは名前を絶対名として扱い、内部クラスタードメインを通じた無効な検索をスキップします。たとえば、www.aliyun.com の代わりに www.aliyun.com. を使用します。

      • Kubernetes 1.33 以降を実行しているクラスターでは、search ドメインを単一のピリオド (.) に設定します (「Issue 125883」をご参照ください)。これにより、すべての DNS リクエストが事実上 FQDN リクエストとなり、不要な検索ドメインの反復が防止されます。

        dnsConfig の設定例:

        dnsPolicy: None
        dnsConfig:
          nameservers: ["192.168.0.10"]  ## ご利用の CoreDNS サービスの実際の ClusterIP に置き換えてください。
          searches:
          - .
          - default.svc.cluster.local  ## 'default' を実際の名前空間に置き換えてください。
          - svc.cluster.local
          - cluster.local

        結果として生成される /etc/resolv.conf

        search . default.svc.cluster.local svc.cluster.local cluster.local
        nameserver 192.168.0.10

        . を最初の検索ドメインとして使用すると、システムはリクエストを即座に FQDN として認識し、自己解決を優先して無効な再帰検索を排除します。

        重要

        上記の設定を有効にするには、dnsPolicyNone に設定する必要があります。

        完全なワークロードの例

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          labels:
            app: nginx
          name: nginx
          namespace: default
        spec:
          progressDeadlineSeconds: 600
          replicas: 3
          revisionHistoryLimit: 10
          selector:
            matchLabels:
              app: nginx
          strategy:
            rollingUpdate:
              maxSurge: 25%
              maxUnavailable: 25%
            type: RollingUpdate
          template:
            metadata:
              labels:
                app: nginx
            spec:
              containers:
              - image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
                imagePullPolicy: Always
                name: nginx
                resources: {}
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
              dnsPolicy: None
              dnsConfig:
                nameservers: ["192.168.0.10"]  ## ご利用の CoreDNS サービスの実際の ClusterIP に置き換えてください。
                searches:
                - .
                - default.svc.cluster.local
                - svc.cluster.local
                - cluster.local
              hostname: nginx
              restartPolicy: Always
              schedulerName: default-scheduler
              securityContext: {}
              subdomain: subdomain
              terminationGracePeriodSeconds: 30

コンテナ内の DNS 構成に関する注意事項

  • DNS リゾルバーが異なると、その基盤となる実装により、動作に微妙な違いが生じることがあります。dig <domain> は成功するのに ping <domain> は失敗するケースに遭遇する可能性があります。

  • Alpine イメージの回避:Alpine Linux の代わりに、Debian や CentOS などのベースイメージを使用することを強く推奨します。Alpine で使用されている musl libc ライブラリは、標準の glibc と比べていくつかの実装上の違いがあり、以下のような問題を引き起こします:

    • TCP フォールバック: Alpine v3.18 以前は、切り捨て (TC) ビットによる TCP へのフォールバックをサポートしていません。

    • 検索ドメイン: Alpine v3.3 以前は search パラメーターをサポートしていないため、クラスター内のサービスディスカバリが機能しません。

    • 最適化の競合: Alpine は /etc/resolv.conf にリストされているすべての DNS サーバーに同時にリクエストを送信するため、NodeLocal DNSCache の最適化をバイパスし、無効にする可能性があります。

    • Conntrack の競合状態 同じソケットを使用して A レコードと AAAA レコードを同時にリクエストすると、古い Linux カーネルでソースポートの競合が発生し、パケット損失や名前解決のタイムアウトを引き起こす可能性があります。

    その他の問題については、musl libc ドキュメントをご参照ください。

  • Go アプリケーションを使用する場合、CGOPure Go の DNS リゾルバーの違いに注意してください。

IPVS モードにおける断続的な DNS タイムアウトの緩和策

ACK クラスターが kube-proxy の負荷分散モードとして IPVS を使用している場合、CoreDNS Pod のスケーリングまたは再起動中に、断続的な DNS 名前解決のタイムアウトが発生することがあります。これは、既知の Linux カーネルの不具合が原因です。「IPVS commit」をご参照ください。

この IPVS の欠陥による影響を緩和するには、以下のいずれかの方法を使用します:

NodeLocal DNSCache による安定性の向上

CoreDNS は、時折以下の問題に遭遇することがあります:

  • A レコードと AAAA レコードの同時クエリによる稀なパケット損失が、DNS の失敗につながる。

  • ノードの conntrack テーブルが満杯になり、パケット損失と DNS の失敗を引き起こす。

DNS の安定性とパフォーマンスを向上させるには、NodeLocal DNSCache をインストールします。このアドオンは、各クラスターノードで DNS キャッシュを実行し、DNS トラフィックをローカルで処理します。

重要

NodeLocal DNSCache をインストールした後、ワークロードに対してインジェクションを有効にする必要があります。次のコマンドを実行して名前空間にラベルを付けます。この名前空間で作成された新しい Pod は、自動的に DNS キャッシュ構成を使用します。

kubectl label namespace default node-local-dns-injection=enabled

詳細な手順とその他のインジェクション方法については、「NodeLocal DNSCache の使用」をご参照ください。

CoreDNS バージョンのメンテナンス

CoreDNS は Kubernetes との強力な下位互換性を維持しています。しかし、CoreDNS を安定したバージョンに更新し続けることが重要です。[アドオン] ページから CoreDNS を管理、アップグレード、構成します。

ACK コンソールで CoreDNS の利用可能なアップグレードが表示された場合は、オフピーク時にできるだけ早くアップグレードを計画してください。

1.7.0 未満の CoreDNS バージョンのリスク

  • ロギングによるクラッシュ: API サーバーへの接続が中断された場合 (API サーバーの再起動、移行、ネットワークジッターなど)、CoreDNS はエラーログの書き込みに失敗するため再起動します。「Set klog's logtostderr flag」をご参照ください。

  • OOM の問題: CoreDNS は起動時に余分なメモリを消費します。デフォルトのメモリ制限では、大規模クラスターでメモリ不足 (OOM) の問題が発生する可能性があります。深刻な場合、再起動ループに陥ることがあります。「CoreDNS uses a lot of memory during initialization phase」をご参照ください。

  • 同期の失敗: CoreDNS には、ヘッドレスサービスのドメイン名や外部ドメイン名の名前解決に影響を与える可能性のあるいくつかの問題があります。詳細については、「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 は自動的に退避できず、ドメイン名の名前解決が異常になる原因となります。

推奨される最小 CoreDNS バージョン

クラスターバージョン

推奨される最小 CoreDNS バージョン

1.14.8 未満

1.6.2 (サポート終了)

1.14.8 から 1.20.4

1.7.0.0-f59c03d-aliyun

1.20.4 から 1.21.0

1.8.4.1-3a376cc-aliyun

1.21.0 以上

1.11.3.2-f57ea7ed6-aliyun

CoreDNS の実行ステータスの監視

メトリックとダッシュボード

CoreDNS は、CoreDNS およびアップストリーム DNS サーバーの例外を検出するために、標準の Prometheus インターフェイスを通じてヘルスおよびパフォーマンスメトリックを公開します。

  • ACK マネージドクラスターManaged Service for Prometheus は、CoreDNS 用の組み込みメトリック監視ダッシュボードとアラートルールを提供します。ACK コンソールで Prometheus とダッシュボード機能を有効にできます。「CoreDNS コンポーネントの監視」をご参照ください。

  • セルフマネージド Prometheus:CoreDNS メトリックをスクレイピングし、重要な指標に対するアラートを設定します。「CoreDNS Prometheus 公式ドキュメント」をご参照ください。

ログ分析

DNS の例外が発生した場合、CoreDNS のログは根本原因の診断に不可欠です。DNS 名前解決のロギングと Simple Log Service (SLS) の収集を有効にすることを推奨します。詳細については、「CoreDNS ログの分析と監視」をご参照ください。

Kubernetes イベントの配信

CoreDNS v1.9.3.6-32932850-aliyun 以降では、k8s_event プラグインを使用して、重要なログを Kubernetes イベントとしてイベントセンターに送信できます。「k8s_event」をご参照ください。

新しくデプロイされた CoreDNS は、デフォルトでこの機能を有効にします。以前のバージョンから v1.9.3.6-32932850-aliyun 以降にアップグレードする場合は、手動で構成ファイルを変更して有効にする必要があります。

  1. CoreDNS の ConfigMap を編集します。

    kubectl -n kube-system edit configmap/coredns
  2. 構成に kubeAPIk8s_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
            }
            # (残りの構成は省略)
        }
  3. CoreDNS Pod のログを確認して更新を検証します。ログに reload という単語が含まれていれば、変更は成功です。

CoreDNS の高可用性の確保

CoreDNS はクラスターの権威 DNS プロバイダーです。その安定性は非常に重要であり、障害が発生するとサービスの名前解決エラーや広範囲なアプリケーションの停止につながる可能性があります。このセクションでは、CoreDNS を監視し、高可用性 (HA) 戦略を実装する方法について説明します。

CoreDNS の負荷評価

DNSPerf などのオープンソースツールを使用して、DNS パフォーマンスをベンチマークします。カスタマイズされた評価を実行できない場合は、以下のベースライン推奨事項に従ってください:

  • 最小レプリカ数:冗長性のために、常に少なくとも 2 つの Pod を維持します。

  • リソース制限:Pod ごとに少なくとも 1 CPU コアと 1 GiB メモリ のリソース制限を設定します。

  • パフォーマンスのスケーリング:CoreDNS のパフォーマンスは CPU と線形にスケーリングします。NodeLocal DNSCache が有効な場合、1 つの CPU コアで通常 10,000 QPS 以上を処理できます。

  • レプリカ比率:ピーク時の CPU 使用量を監視できない場合は、保守的な 1:8 の Pod 対ノード比率 を使用します (クラスターノード 8 つごとに CoreDNS Pod を 1 つ追加します)。

CoreDNS Pod のスケーリング

CoreDNS Pod の数は、利用可能なコンピューティングリソースを決定します。評価結果に基づいて Pod 数を調整します。

重要

UDP には再送機能がないため、IPVS UDP のバグがクラスターノードでパケット損失のリスクを引き起こす場合、CoreDNS Pod のスケールインまたは再起動により、クラスター全体で最大 5 分間の DNS タイムアウトが発生する可能性があります。緩和策については、「DNS 名前解決エラーのトラブルシューティング」をご参照ください。

  • 推奨ポリシーに基づく自動スケーリング

    dns-autoscaler をデプロイして、推奨ポリシー (クラスターノード 8 つごとに Pod 1 つ) に基づいて CoreDNS のレプリカを自動的に調整します。

    replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica))

    これにより、クラスターが成長しても 1:8 の比率が維持されます。

    dns-autoscaler

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dns-autoscaler
      namespace: kube-system
      labels:
        k8s-app: dns-autoscaler
    spec:
      selector:
        matchLabels:
          k8s-app: dns-autoscaler
      template:
        metadata:
          labels:
            k8s-app: dns-autoscaler
        spec:
          serviceAccountName: admin
          containers:
          - name: autoscaler
            image: registry.cn-hangzhou.aliyuncs.com/acs/cluster-proportional-autoscaler:1.8.4
            resources:
              requests:
                cpu: "200m"
                memory: "150Mi"
            command:
            - /cluster-proportional-autoscaler
            - --namespace=kube-system
            - --configmap=dns-autoscaler
            - --nodelabels=type!=virtual-kubelet
            - --target=Deployment/coredns
            - --default-params={"linear":{"coresPerReplica":64,"nodesPerReplica":8,"min":2,"max":100,"preventSinglePointFailure":true}}
            - --logtostderr=true
            - --v=9
  • 手動調整

    次のコマンドを実行して、CoreDNS Pod の数を手動で調整します:

    kubectl scale --replicas={target} deployment/coredns -n kube-system # {target} を目的の Pod 数に置き換えます
  • HPA または CronHPA を使用しない

    ワークロードの自動スケーリングメカニズム (HPA や CronHPA など) は Pod 数を自動的に調整できますが、頻繁なスケーリング操作を実行します。Pod のスケールインによって引き起こされる名前解決の例外 (前述の IPVS UDP の問題) のため、ワークロードの自動スケーリングを使用して CoreDNS の Pod 数を制御しないでください。

CoreDNS Pod 仕様の最適化

CoreDNS のリソースを調整するもう 1 つの方法は、Pod の仕様を変更することです。ACK マネージド Pro 版クラスターでは、CoreDNS Pod のデフォルトのメモリ制限は 2 GiB で、CPU 制限はありません。一貫したパフォーマンスを確保するために、CPU 制限を 4096m (最小 1024m) に設定します。これらのリソースリクエストと制限はコンソールで調整できます。

コンソールで CoreDNS 構成を変更する

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。

  3. [ネットワーク] タブをクリックします。[CoreDNS] カードで、[設定] をクリックします。

    image

  4. CoreDNS 構成を変更し、[OK] をクリックします。

    image

CoreDNS Pod のスケジューリング

重要

適切なスケジューリングと構成は、CoreDNS の安定性にとって非常に重要です。不適切な設定は DNS 名前解決の失敗につながり、クラスター全体のサービス停止を引き起こす可能性があります。この操作を実行する前に、スケジューリングの仕組みをよく理解していることを確認してください。

推奨構成

  • マルチゾーンデプロイメント:単一障害点を防ぐために、CoreDNS レプリカを常に異なるアベイラビリティゾーンとノードにデプロイします。

  • アンチアフィニティ1.8.4.3 より前の CoreDNS バージョンは、デフォルトで「優先」(ソフト) ノードアンチアフィニティを使用します。ノードリソースが不足している場合、複数の Pod が同じノードにスケジュールされる可能性があります。この場合、アドオンをアップグレードするか、手動で Pod を削除して再スケジュールをトリガーします。

  • ライフサイクル管理1.8 未満の CoreDNS バージョンはサポート終了 (EOL) です。できるだけ早く最新バージョンにアップグレードしてください。

  • リソース枯渇の回避:CoreDNS を実行しているノードが飽和状態 (CPU/メモリ使用量が高い) にならないようにしてください。このような飽和状態は DNS クエリのレイテンシーと QPS に直接影響します。

  • 専用ノード: 大規模クラスターでは、最大限の安定性を確保するため、カスタムスケジューリングパラメーター (tolerations/nodeAffinity) を使用して専用ノードで CoreDNS をホストすることを検討してください。

カスタムパラメーターを使用して CoreDNS を専用ノードにデプロイする

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. クラスター ページで、目的のクラスターを探し、その名前をクリックします。左側のナビゲーションウィンドウで、[ノード] > [ノード] を選択します。

  3. [ノード] ページで、[ラベルとテイントの管理] をクリックします。

  4. [ラベルとテイントの管理] ページで、ターゲットノードを選択し、[ラベルの追加] をクリックします。

    説明

    単一ノードで複数の CoreDNS レプリカが実行されるのを避けるため、ノード数は CoreDNS レプリカ数を超える必要があります。

  5. [追加] ダイアログボックスで、以下のパラメーターを設定し、[OK] をクリックします。

    • [名前]:node-role-type

    • [値]:coredns

  6. 左側のナビゲーションウィンドウで [アドオン] をクリックし、[CoreDNS] を検索します。

  7. [CoreDNS] カードの [設定] をクリックします。表示されるダイアログボックスで、[NodeSelector] の右側にある [+ 追加] をクリックします。以下のパラメーターを設定し、[OK] をクリックします。

    • [キー]:node-role-type

    • [値]:CoreDNS

    CoreDNS は、指定されたラベルを持つノードに再スケジュールされます。

CoreDNS 構成の最適化

ACK はデフォルトの CoreDNS 構成を提供します。ただし、ビジネス要件に基づいてこれらのパラメーターを調整する必要があります。CoreDNS の構成は非常に柔軟です。詳細については、「DNS ポリシーとドメイン名の名前解決」および「CoreDNS 公式ドキュメント」をご参照ください。

または、コンテナインテリジェンスサービスの検査および診断機能を使用して CoreDNS 構成ファイルを確認します。検査で CoreDNS ConfigMap が異常であると示された場合は、上記の項目を確認してください。

説明

CoreDNS は構成をリフレッシュする際に余分なメモリを消費する可能性があります。CoreDNS の設定を変更した後、Pod のステータスを監視してください。構成変更後に Pod が OOM で強制終了される場合は、CoreDNS デプロイメントのメモリ制限を増やしてください (推奨:2 GiB)。

kube-dns サービスのアフィニティ構成の無効化

アフィニティ構成は、CoreDNS レプリカ間で大幅な負荷の不均衡を引き起こす可能性があります。以下の手順に従って無効にしてください:

コンソール

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ネットワーク] > [サービス] を選択します。

  3. 名前空間 kube-system で、kube-dns サービスの [YAML を編集] をクリックします。

    • sessionAffinity フィールドの値が None の場合、以下の手順を実行する必要はありません。

    • sessionAffinity フィールドの値が ClientIP の場合、以下の手順を実行します。

  4. sessionAffinitysessionAffinityConfig フィールドおよびそのすべてのサブキーを削除します。その後、[OK] をクリックします。

    # 以下を削除
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  5. [kube-dns] サービスの右側にある [YAML の編集] を再度クリックし、sessionAffinity フィールドが None であることを確認します。そうであれば、kube-dns サービスは変更されています。

CLI

  1. 次のコマンドを実行して、kube-dns サービスの構成を表示します。

    kubectl -n kube-system get svc kube-dns -o yaml
    • sessionAffinity フィールドの値が None の場合、以下の手順を実行する必要はありません。

    • sessionAffinity フィールドの値が ClientIP の場合、以下の手順を実行します。

  2. 次のコマンドを実行して、kube-dns サービスを開いて編集します。

    kubectl -n kube-system edit service kube-dns
  3. sessionAffinity 関連の設定 (sessionAffinitysessionAffinityConfig、およびそのすべてのサブキー) を削除し、保存して終了します。

    # 以下を削除 
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  4. 変更後、再度次のコマンドを実行して、sessionAffinity フィールドの値が None であることを確認します。そうであれば、kube-dns サービスは更新されています。

    kubectl -n kube-system get svc kube-dns -o yaml

autopath プラグインの無効化

一部の初期の CoreDNS バージョンでは autopath プラグインが有効になっており、特定のまれなケースで名前解決エラーを引き起こす可能性があります。有効になっているかどうかを確認し、構成ファイルを編集して無効にします。詳細については、「Autopath issue #3765」をご参照ください。

説明

autopath を無効にすると、クライアントサイドの QPS と名前解決のレイテンシーが最大 3 倍 増加する可能性があります。CoreDNS の負荷とサービスへの影響を監視してください。

  1. kubectl -n kube-system edit configmap coredns コマンドを実行して、CoreDNS 構成ファイルを開きます。

  2. autopath @kubernetes の行を削除し、変更を保存します。

  3. CoreDNS Pod の実行ステータスとログを確認します。ログに reload という単語が含まれていれば、変更は成功です。

グレースフルシャットダウンの構成

lameduck メカニズムは、CoreDNS プロセスが終了しようとするとき (更新または再起動中)、終了する前に既存のリクエストを処理することを保証します。

  • CoreDNS プロセスが終了しようとすると、lameduck モードに入ります。

  • lameduck モードでは、CoreDNS は指定された期間、すでに受信したリクエストの処理を続けながら、システムに新しいリクエストの送信を停止するよう信号を送ります。

コンソール

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. クラスター ページで、変更したいクラスターの名前をクリックします。左側のナビゲーションウィンドウで、[設定] > [ConfigMap] を選択します。

  3. kube-system 名前空間で、coredns ConfigMap の [YAML の編集] をクリックします。

  4. 以下の CoreDNS ConfigMap で、health プラグインが有効になっていることを確認し、lameduck タイムアウトを 15s に設定してから、[OK] をクリックします。

  5. .: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 のステータスは、構成の更新が成功したことを示します。異常が発生した場合は、Pod のイベントとログを参照して根本原因を特定してください。

CLI

  1. 次のコマンドを実行して、CoreDNS 構成ファイルを開きます。

  2. kubectl -n kube-system edit configmap/coredns
  3. 以下の Corefile を参照し、health プラグインが有効になっていることを確認し、lameduck パラメーターを 15s に設定します。

  4. .:53 {
            errors     
            # health プラグインは、CoreDNS のバージョンによって設定が異なる場合があります。
            # シナリオ 1:health プラグインがデフォルトで有効になっていない。     
            # シナリオ 2:health プラグインはデフォルトで有効だが、lameduck 時間が設定されていない。
            # health
            # シナリオ 3:health プラグインはデフォルトで有効で、lameduck 時間が 5s に設定されている。   
            # health {
            #     lameduck 5s
            # }
            # 上記 3 つのシナリオでは、構成を次のように変更し、lameduck パラメーターを 15s に設定します。
            health {
                lameduck 15s
            }
            # 他のプラグインは変更する必要がなく、ここでは省略します。
        }
  5. CoreDNS 構成ファイルを変更した後、変更を保存します。

  6. CoreDNS が正常に実行されていれば、グレースフルシャットダウン構成は正常に更新されています。CoreDNS Pod が異常な場合は、Pod のイベントとログを確認して原因を診断してください。

アップストリームプロトコル (prefer_udp) の最適化

NodeLocal DNSCache を使用する場合、通信チェーンは アプリケーション -> NodeLocal DNSCache (TCP) -> CoreDNS (TCP) となります。デフォルトでは、CoreDNS はその後、TCP を介してアップストリームの VPC DNS (100.100.2.136/138) に到達しようとします。

  • 問題:VPC DNS は TCP のサポートが限定的です。

  • 解決策forward プラグインを変更して prefer_udp を使用します。これにより、受信リクエストが TCP であっても、CoreDNS は UDP を介してアップストリームの VPC DNS と通信するようになります。詳細については、「ConfigMap の管理」をご参照ください。

# 変更前
forward . /etc/resolv.conf
# 変更後
forward . /etc/resolv.conf {
  prefer_udp
}

readiness プローブ用の ready プラグインの構成

CoreDNS v1.5.0 以降では、readiness プローブが機能するために ready プラグインが必須です。

  1. 次のコマンドを実行して、CoreDNS ConfigMap を開きます。

    kubectl -n kube-system edit configmap/coredns
  2. ファイルに 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
      }
  3. CoreDNS Pod の実行ステータスとログを確認します。ログに reload という単語が含まれていれば、変更は成功です。

multisocket プラグインによる名前解決パフォーマンスの向上

CoreDNS v1.12.1 で multisocket プラグインが導入されました。このプラグインを有効にすると、CoreDNS は複数のソケットを使用して同じポートでリッスンできるようになり、高 CPU シナリオでのパフォーマンスが向上します。詳細については、コミュニティドキュメントをご参照ください。

coredns ConfigMap で multisocket を有効にします:

.:53 {
        ...
        prometheus :9153
        multisocket [NUM_SOCKETS]
        forward . /etc/resolv.conf
        ...
}

NUM_SOCKETS は、同じポートでリッスンするソケットの数を決定します。

推奨構成NUM_SOCKETS を、推定 CPU 使用率、CPU リソース制限、および利用可能なクラスターリソースに合わせて調整します。例:

  • ピーク消費が 4 コア で、利用可能なコアが 8 コア の場合、NUM_SOCKETS を 2 に設定します。

  • ピーク消費が 8 コア で、利用可能なコアが 64 コア の場合、NUM_SOCKETS を 8 に設定します。

最適な構成を決定するには、さまざまな設定で QPS と負荷をテストしてください。

デフォルト:指定しない場合、デフォルトは GOMAXPROCS となり、これは CoreDNS Pod の CPU 制限に等しくなります。Pod の CPU 制限が設定されていない場合、Pod が存在するノードの CPU コア数に等しくなります。