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

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

最終更新日:Jun 21, 2026

DNS は Kubernetes クラスターにおける重要なサービスです。クライアント構成が不適切な場合や大規模クラスターでは、DNS に解決タイムアウトや障害が発生する可能性があります。本トピックでは、これらの問題を回避するための、Kubernetes クラスターにおける DNS のベストプラクティスを説明します。

注意事項

このトピックは、CoreDNS のマネージド版、または自動モードが有効な ACK クラスターには適用されません。CoreDNS のマネージド版は負荷に基づいて自動的にスケーリングされるため、手動調整は不要です。

このトピックの内容

DNS のベストプラクティスには、クライアント側とサーバー側の両方の最適化が含まれます:

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 として扱います。リゾルバーは最初にドメイン名をそのまま解決しようとし、不要な検索ドメインの展開をスキップします。

        重要

        上記の構成を有効にするには、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 Service の実際の 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 を使用することは避けてください。代わりに、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 の使用

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 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 以降にアップグレードする場合は、設定ファイルを手動で変更して有効にする必要があります。

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

    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 の障害は、クラスター内の 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 パラメーターによって制限されます。

    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 数に置き換えます。
  • ワークロードの自動スケーリングを使用しない

    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 設定の変更

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

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[操作] > [アドオン] を選択します。

  3. ネットワーク タブをクリックして CoreDNS カードを見つけます。カードで 設定 をクリックします。

  4. CoreDNS の設定を変更し、OK をクリックします。

    ダイアログボックスには、パラメーターを更新するとコンポーネントの YAML テンプレートが再生成され、kubectl で行った変更が上書きされる可能性があるというメッセージが表示されます。設定可能なパラメーターには、[MemoryRequest][CpuRequest][MemoryLimit] (低すぎる値を設定すると OOMKilled がトリガーされる可能性があります)、[CpuLimit] (CpuRequest の 2 倍を推奨)、および [NodeSelector] (キーと値のペア) が含まれます。

CoreDNS Pod のスケジューリング

重要

スケジューリング設定が正しくないと、CoreDNS Pod がデプロイされず、CoreDNS の障害につながる可能性があります。この操作を実行する前に、スケジューリングについてよく理解していることを確認してください。

単一ノードまたは単一アベイラビリティーゾーンの障害を避けるために、異なるアベイラビリティーゾーンおよびクラスターノードにまたがって CoreDNS Pod をデプロイすることを推奨します。v1.8.4.3 より前の CoreDNS コンポーネントバージョンには、ノードレベルでのデフォルトのソフトアンチアフィニティポリシーがあるため、リソースが不十分な場合に一部またはすべての Pod が同じノードにデプロイされる可能性があります。この問題が発生した場合は、Pod を削除して再スケジューリングをトリガーするか、コンポーネントを最新バージョンにアップグレードしてください。v1.8 より前の CoreDNS コンポーネントバージョンは保守されなくなったため、できるだけ早くアップグレードする必要があります。

CoreDNS が実行されるクラスターノードでは、CPU やメモリを使い切るべきではありません。これはドメイン名解決の QPS とレスポンスレイテンシーに影響するためです。クラスターノードのリソースに余裕があれば、安定したドメイン名解決サービスを提供するために、カスタムパラメーターを使用して 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 の設定は非常に柔軟です。詳細については、「DNS ポリシーの設定とドメイン名の解決」および「公式 CoreDNS ドキュメント」をご参照ください。

以前のバージョンの Kubernetes クラスターでデプロイされたデフォルトの CoreDNS 設定には、リスクが含まれている場合があります。以下のように確認し、最適化してください。

また、コンテナインテリジェンスサービスの定期検査および障害診断機能を使用して、CoreDNS 設定ファイルを確認することもできます。コンテナインテリジェンスサービスからの検査結果で CoreDNS ConfigMap 設定に異常があることが示されている場合は、前述の各項目を確認してください。

説明

CoreDNS は、設定を更新する際に追加のメモリを消費することがあります。CoreDNS ConfigMap を変更した後は、Pod のステータスを監視してください。Pod がメモリ不足になった場合は、CoreDNS Deployment のコンテナのメモリ制限を速やかに増やしてください。メモリ制限を 2 GB に調整することを推奨します。

kube-dns Service のセッションアフィニティの無効化

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

コンソール

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

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ネットワーク] > [サービス] を選択します。

  3. kube-system 名前空間で、kube-dns Service の右側にある YAML の編集 をクリックします。

    • sessionAffinity フィールドが None に設定されている場合は、これ以上の操作は必要ありません。

    • sessionAffinity フィールドが ClientIP に設定されている場合は、次の手順に進みます。

  4. sessionAffinity および sessionAffinityConfig フィールドとそのすべてのサブキーを削除し、更新 をクリックします。

    # 以下の内容をすべて削除します。
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  5. 再度 kube-dns Service の右側にある YAML の編集 をクリックし、sessionAffinity フィールドが None に設定されていることを確認します。値が None であれば、kube-dns Service が正常に変更されたことを示します。

CLI

  1. 次のコマンドを実行して、kube-dns Service の設定情報を表示します。

    kubectl -n kube-system get svc kube-dns -o yaml
    • sessionAffinity フィールドが None に設定されている場合は、これ以上の操作は必要ありません。

    • sessionAffinity フィールドが ClientIP に設定されている場合は、次の手順に進みます。

  2. 次のコマンドを実行して、kube-dns という名前の Service を開いて編集します。

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

    # 以下の内容をすべて削除します。
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  4. 変更が完了したら、再度次のコマンドを実行して、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 の負荷とビジネスへの影響を監視してください。

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

  2. autopath @kubernetes の行を削除してファイルを保存します。

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

グレースフルシャットダウンの設定

lameduck は、CoreDNS でグレースフルシャットダウンを可能にするメカニズムです。これにより、CoreDNS が停止または再起動する必要がある場合に、進行中のリクエストが突然中断されることなく完了するようになります。lameduck は次のように機能します。

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

  • lameduck モードでは、CoreDNS は新しいリクエストの受け入れを停止しますが、既存のリクエストはすべて完了するか、lameduck タイムアウト期間を超えるまで処理を続けます。

コンソール

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

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

  3. kube-system 名前空間で、coredns ConfigMap の右側にある YAML の編集 をクリックします。

  4. CoreDNS 設定ファイルで、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 が正常に実行されていれば、変更は成功です。CoreDNS 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 が異常になった場合は、そのイベントとログを表示して原因を特定できます。

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 プラグインを設定する必要があります。

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

    kubectl -n kube-system edit configmap/coredns
  2. ファイルに 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
      }
  3. 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 コア数に等しいです。