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

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

最終更新日:Jun 23, 2026

DNS は Kubernetes クラスターで最も重要な基盤サービスの 1 つです。クライアント側の設定が不適切であったり、クラスターの規模が大きかったりすると、DNS の名前解決がタイムアウトしたり、失敗したりする可能性があります。このトピックでは、これらの問題を回避するために、Kubernetes クラスターにおける DNS のベストプラクティスについて説明します。

重要事項

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

目次

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

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

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

DNS の名前解決は、Kubernetes における最も頻繁なネットワークアクティビティの 1 つです。これらのリクエストの多くは最適化または回避できます。名前解決リクエストは、以下の方法で最適化できます:

  • (推奨) 接続プールを使用する。コンテナ化アプリケーションが別のサービスに頻繁にアクセスする場合は、接続プールを使用します。接続プールはアップストリームのサービス接続をメモリにキャッシュするため、アクセスごとに DNS 名前解決と TCP 接続設定のオーバーヘッドを回避できます。

  • 非同期またはロングポーリングモードを使用して、DNS ドメイン名に対応する IP アドレスを取得する。

  • DNS キャッシュを使用する:

    • (推奨) アプリケーションを修正して接続プールを使用できない場合は、アプリケーション側で DNS 名前解決の結果をキャッシュすることを検討してください。詳細については、「NodeLocal DNSCache の使用」をご参照ください。

    • NodeLocal DNSCache が利用できない場合は、Name Service Cache Daemon (NSCD) を使用してコンテナ内で DNS クエリをキャッシュできます。詳細については、「Kubernetes クラスターで NSCD を使用する」をご参照ください。

  • resolv.conf ファイルを最適化する:resolv.conf ファイルの ndots および search パラメーターは、コンテナ設定でのドメイン名の記述方法に基づいて、名前解決の効率に影響します。ndots および search パラメーターの仕組みの詳細については、「DNS ポリシー設定と名前解決」をご参照ください。

  • ドメイン名設定を最適化する。コンテナ化アプリケーションがドメイン名にアクセスする場合、解決試行回数を最小限に抑え、解決時間を短縮するために、ドメイン名を次のように設定します:

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

    • 名前空間をまたいでサービスにアクセスする Pod の場合は、<service-name>.<namespace-name> を使用します。ここで、namespace-name はサービスの名前空間です。

    • 外部ドメインにアクセスする場合は、完全修飾ドメイン名 (FQDN) を使用します。一般的なドメイン名の末尾にドット (.) を追加して、絶対アドレスとして指定します。この方法により、search ドメインの連結による複数の無効な検索を回避できます。たとえば、www.aliyun.com にアクセスする場合は、FQDN www.aliyun.com. を使用します。

      • バージョン 1.33 以降のクラスターでは、検索ドメインを単一の「.」として設定することで (関連する問題:125883)、同様の効果を得ることができます:

        dnsPolicy: None
        dnsConfig:
          nameservers: ["192.168.0.10"]  ## 192.168.0.10 を実際の CoreDNS サービスの 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"]  ## 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 コンテナイメージの 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 のスケールインまたは再起動中に断続的な DNS 名前解決タイムアウトが発生することがあります。この問題は、Linux カーネルの欠陥が原因です。詳細については、「IPVS」をご参照ください。

IPVS の欠陥による影響は、以下のいずれかの方法で軽減できます:

NodeLocal DNSCache の使用

一部のシナリオでは、CoreDNS は以下の問題に遭遇する可能性があります:

  • まれに、A と AAAA の同時クエリがパケット損失を引き起こし、DNS 名前解決の失敗につながることがあります。

  • ノード上の conntrack テーブルが枯渇するとパケット損失が発生し、DNS 名前解決の失敗につながります。

クラスター内の 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 のアップグレードが利用可能な場合は、オフピーク時にアップグレードを実行してください。

v1.7.0 より前の CoreDNS バージョンには、以下を含む既知のリスクがあります:

推奨される最小 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 サーバーの異常を検出できます。

Prometheus for ACK には、組み込みの CoreDNS 監視メトリクスとアラートルールが含まれています。Container Service for Kubernetes コンソールで Prometheus とダッシュボード機能を有効にできます。詳細については、「CoreDNS コンポーネントの監視」をご参照ください。

Kubernetes クラスター用に自己管理の Prometheus インスタンスを実行している場合は、関連するメトリクスを監視し、重要なメトリクスに対してアラートを設定できます。詳細については、「CoreDNS Prometheus 公式ドキュメント」をご参照ください。

オペレーションログ

DNS の異常が発生した場合、CoreDNS のログを使用して根本原因を迅速に診断できます。CoreDNS のドメイン解決ログと SLS ログ収集を有効にできます。詳細については、「CoreDNS ログの分析と監視」をご参照ください。

Kubernetes イベント配信

CoreDNS v1.9.3.6-32932850-aliyun 以降では、k8s_event プラグインを有効にして、重要な CoreDNS ログを Kubernetes イベントとして Event Hub に配信できます。k8s_event プラグインの詳細については、「k8s_event」をご参照ください。

新しくデプロイされた CoreDNS インスタンスでは、この機能はデフォルトで有効になっています。古いバージョンの CoreDNS からアップグレードする場合は、設定ファイルを手動で変更してこの機能を有効にする必要があります。

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

    kubectl -n kube-system edit configmap/coredns
  2. 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
            }
            // 以下省略。
        }
  3. CoreDNS Pod のステータスとログを確認します。ログに reload という単語が含まれている場合、変更は成功です。

CoreDNS の高可用性の確保

CoreDNS はクラスターの権威 DNS として機能します。CoreDNS の障害は内部サービスへのアクセス失敗を引き起こし、ビジネスの大部分を中断させる可能性があります。以下の対策により、CoreDNS の高可用性を確保できます:

CoreDNS コンポーネントの負荷評価

クラスターで DNS ストレステストを実行して、コンポーネントの負荷を評価できます。DNSPerf など、多くのオープンソースツールが役立ちます。DNS の負荷を正確に評価できない場合は、以下の推奨事項に従ってください:

  • 常に少なくとも 2 つの CoreDNS Pod をデプロイし、各 Pod のリソース制限を少なくとも 1 CPU コア、1 GB メモリとします。

  • CoreDNS の QPS 容量は CPU 使用率と直接相関しています。NodeLocal DNSCache を使用すると、各 CPU コアは 10,000 QPS 以上をサポートできます。ビジネスワークロードの DNS QPS 要件は大きく異なります。各 CoreDNS Pod のピーク時の CPU 使用率を監視する必要があります。ビジネスのピーク時に CPU 使用率が 1 コアを超える場合は、CoreDNS のレプリカをスケールアウトしてください。ピーク時の CPU 使用率が不明な場合は、保守的な対策として、クラスターの 8 ノードごとに 1 つの CoreDNS Pod をデプロイします。

CoreDNS Pod 数の調整

CoreDNS Pod の数は、利用可能な計算リソースを直接決定します。評価に基づいてこの数を調整できます。

重要

UDP には再送メカニズムがないため、クラスターノードに IPVS UDP の欠陥が存在する場合、CoreDNS Pod のスケールインまたは再起動により、クラスター全体で最大 5 分間の DNS 名前解決タイムアウトまたは異常が発生する可能性があります。IPVS 関連の解決問題のソリューションについては、「DNS 名前解決の異常のトラブルシューティング」をご参照ください。

  • 推奨ポリシーに基づいて Pod 数を自動的に調整する

    以下の dns-autoscaler をデプロイできます。これは、クラスターの 8 ノードごとに 1 Pod という推奨比率に基づいて、CoreDNS Pod の数をリアルタイムで自動的に調整します。レプリカ数の数式は `replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica))` であり、maxmin の制限によって制約されます。

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

    水平 Pod 自動スケーリング (HPA) や CronHPA などのワークロード自動スケーリングメカニズムは、Pod の数を自動的に調整できますが、頻繁なスケーリング操作をトリガーします。前述のように、Pod のスケールイン中に発生する可能性のある解決の異常のため、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 をクリックします。

    CoreDNS パラメーター設定ダイアログボックスで、MemoryRequest (例:100Mi)、CpuRequest (例:100m)、MemoryLimit (例:2Gi)、CpuLimit などのリソースパラメーターを設定します。また、NodeSelector ノード選択ラベル (例:キー:kubernetes.io/os、値:linux) も設定できます。これらのパラメーターを変更すると、コンポーネントテンプレートの YAML が再生成され、kubectl や他の方法で行われた変更が上書きされる可能性があります。

CoreDNS Pod のスケジューリング

重要

不適切なスケジューリング設定は、CoreDNS Pod のデプロイを妨げ、CoreDNS の障害を引き起こす可能性があります。続行する前に、スケジューリングを完全に理解していることを確認してください。

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

CPU またはメモリ使用率がフルのクラスターノードに CoreDNS をデプロイすることは避けてください。これは DNS の 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 がアプリケーションコンテナに適切にサービスを提供できるように、すべてのパラメーターを確認し、最適化する必要があります。CoreDNS の設定は非常に柔軟です。詳細については、「DNS ポリシー設定と名前解決」および「CoreDNS 公式ドキュメント」をご参照ください。

また、コンテナインテリジェンスオペレーションの定期検査および障害診断機能を使用して、CoreDNS 設定ファイルを確認することもできます。コンテナインテリジェンスオペレーションが CoreDNS ConfigMap 設定の異常を報告した場合は、上記の項目を確認してください。

説明

CoreDNS は設定を再読み込みする際に余分なメモリを消費する可能性があります。CoreDNS 設定項目を変更した後は、Pod のステータスを監視してください。Pod がメモリ不足になった場合は、CoreDNS Deployment のメモリ制限を速やかに増やしてください。メモリを 2 GB に設定することを推奨します。

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

アフィニティ設定は、CoreDNS レプリカ間で著しい負荷不均衡を引き起こす可能性があります。以下のいずれかの方法で無効にできます:

コンソールでの操作

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

  2. クラスターリスト ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、ネットワーク > サービス をクリックします。

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

    • sessionAffinity フィールドの値が None の場合は、以下の手順をスキップできます。

    • sessionAffinity の値が ClientIP の場合は、以下の手順に進みます。

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

    # 以下のすべての内容を削除します。
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  5. kube-dns サービスの右側にある YAML の編集 を再度クリックし、sessionAffinity フィールドの値が None であることを確認します。フィールドの値が None の場合、Kube-DNS サービスの更新は成功です。

コマンドラインでの操作

  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 であることを確認します。値が None の場合、kube-dns サービスの更新は成功です。

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

Autopath プラグインの無効化

一部の古いバージョンの CoreDNS では、Autopath プラグインが有効になっています。このプラグインは、極端なシナリオで不正確な解決結果を生成する可能性があります。設定ファイルを編集して、プラグインが有効になっているかどうかを確認し、無効にすることができます。詳細については、「Autopath」をご参照ください。

説明

Autopath プラグインを無効にすると、クライアント側の DNS クエリ QPS が最大 3 倍に増加し、単一ドメインの解決時間が最大 3 倍に増加する可能性があります。CoreDNS の負荷とビジネスへの影響を監視する必要があります。

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

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

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

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

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

  • CoreDNS が終了すると、Lameduck モードに入ります。

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

コンソールメソッド

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

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

  3. kube-system 名前空間で、coredns 設定項目の右側にある 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 が正常に実行されている場合、グレースフルシャットダウン設定は正常に更新されます。Pod が異常になった場合は、Pod のイベントとログを確認して原因を特定してください。

コマンドラインでの操作

  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 が正常に実行されている場合、グレースフルシャットダウン設定は正常に更新されます。Pod が異常になった場合は、Pod のイベントとログを確認して原因を特定してください。

Forward プラグインがアップストリーム VPC DNS サーバーと通信するためのデフォルトプロトコルの設定

NodeLocal DNSCache は TCP を使用して CoreDNS と通信します。CoreDNS は、アップストリーム DNS サーバーと通信する際に、受信リクエストと同じプロトコルを使用します。デフォルトでは、アプリケーションコンテナからの外部ドメイン解決リクエストは、NodeLocal DNSCache と CoreDNS を経由し、TCP を使用して VPC DNS サーバー (100.100.2.136 および 100.100.2.138) に到達します。

VPC DNS サーバーの TCP サポートは限定的です。NodeLocal DNSCache を使用する場合は、CoreDNS 設定を変更して、解決の異常を避けるために、アップストリーム DNS サーバーとの通信で常に UDP を優先するようにする必要があります。kube-system 名前空間の coredns という名前の ConfigMap を次のように変更できます。詳細については、「ConfigMap の管理」をご参照ください。forward プラグインで、アップストリームプロトコルとして prefer_udp を指定します。この変更後、CoreDNS はアップストリーム通信に UDP を優先して使用します:

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

Ready readiness プローブプラグインの設定

1.5.0 より後の CoreDNS バージョンでは、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 の解決パフォーマンスを向上させる

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 リソース制限、およびクラスターで利用可能なリソースに合わせることを推奨します。例:

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

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

最適な設定を決定するには、さまざまな設定をテストし、QPS と負荷を測定します。

NUM_SOCKETS を指定しない場合、CoreDNS はデフォルトで GOMAXPROCS を使用します。`GOMAXPROCS` の値は、CoreDNS Pod の CPU 制限に等しくなります。CPU 制限が設定されていない場合、値はノードの CPU コア数に等しくなります。