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

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

最終更新日:Sep 18, 2026

DNS は Kubernetes クラスターの重要な Service です。不適切なクライアント設定や大規模クラスターなどの特定の条件下では、DNS で名前解決のタイムアウトや失敗が発生する可能性があります。このトピックでは、これらの問題を回避できるように、Kubernetes クラスターでの DNS のベストプラクティスを紹介します。

注意

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

このトピックの内容

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

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

ドメイン名解決リクエストの最適化

ドメイン名解決は、Kubernetes クラスターで最も頻繁に行われるネットワーク操作の 1 つです。これらのリクエストの多くは、最適化または回避することで、DNS インフラストラクチャへのレイテンシーと負荷を削減できます。ドメイン名解決リクエストを最適化するには、次の方法があります。

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

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

  • DNS キャッシュの使用:

    • (推奨) コネクションプールを使用するようにアプリケーションを変更できない場合は、アプリケーション側でドメイン名解決結果をキャッシュすることを検討してください。詳細については、「NodeLocal DNSCache の使用」をご参照ください。

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

  • resolv.conf ファイルの最適化:resolv.conf ファイル内の ndots パラメーターと search パラメーターのメカニズムにより、コンテナ内でのドメイン名の記述方法が、ドメイン名解決の効率を決定します。ndots パラメーターと search パラメーターのメカニズムの詳細については、「DNSポリシーの設定とドメイン名解決」をご参照ください。

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

    • Pod から同じ Namespace 内の Service にアクセスする際は、<service-name> を使用します。ここで、service-name は Service の名前です。

    • Pod から別の Namespace 内の Service にアクセスする際は、<service-name>.<namespace-name> を使用します。ここで、namespace-name は Service が存在する Namespace です。

    • Pod が外部ドメイン名にアクセスする場合、search リストのドメインが付加されることによる複数の無効な DNS ルックアップを防ぐため、末尾にドット (.) が付く完全修飾ドメイン名 (FQDN) を使用します。たとえば、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 を実際の Namespace に置き換えてください。
          - 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 に設定する必要があります。

        完全なワークロード例

        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 の競合状態:同じソケットを使用する A レコードと AAAA レコードの同時リクエストにより、古い Linux カーネルで 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 キャッシュ設定をインジェクションする必要があります。次のコマンドを実行して、特定の名前空間にラベルを追加できます。この名前空間で作成された新しい Pod には、DNS キャッシュ設定が自動的にインジェクションされます。その他のインジェクション方法の詳細については、前の段落で参照したドキュメントをご参照ください。

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

適切な CoreDNS バージョンの使用

CoreDNS は Kubernetes バージョンとの高い下位互換性を備えています。CoreDNS は最新の安定バージョンを維持してください。Container Service for Kubernetes (ACK) コンソールの [アドオン] ページで、CoreDNS のインストール、アップグレード、設定ができます。[アドオン] ページで CoreDNS コンポーネントのステータスを確認してください。アップグレードが利用可能な場合は、オフピーク時間にアップグレードをスケジュールしてください。

v1.7.0 より前の CoreDNS バージョンには、以下のような潜在的なリスクがいくつかあります。

  • API サーバーの再起動、移行、またはネットワークジッターなどが原因で CoreDNS と API サーバー間の接続性に異常がある場合、CoreDNS はエラーログを書き込めずに再起動することがあります。詳細については、「Set klog's logtostderr flag」をご参照ください。

  • CoreDNS は起動時に追加のメモリを消費します。大規模なクラスターでは、デフォルトのメモリ制限によってメモリ不足 (OOM) の問題が発生する可能性があります。深刻な場合には、これにより CoreDNS Pod が再起動ループに陥り、回復できなくなることがあります。詳細については、「CoreDNS uses a lot 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 は自動的に退避されず、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 で関連するメトリクスを監視し、主要な指標に対するアラートを設定できます。詳細については、「Prometheus に関する CoreDNS 公式ドキュメント」をご参照ください。

ログ

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. 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 に障害が発生すると、クラスター内の 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 がピーク時に 1 CPU コア以上を使用する場合、CoreDNS レプリカのスケールアウトを推奨します。ピーク時の CPU 使用率を判断できない場合は、保守的に Pod とクラスターノードの比率を 1:8 で使用できます。つまり、8 つのクラスターノードを追加するごとに、1 つの CoreDNS Pod を追加します。

CoreDNS Pod 数の調整

CoreDNS Pod の数は、CoreDNS が使用できるコンピューティングリソースを直接決定します。評価に基づいて CoreDNS Pod の数を調整できます。

重要

UDP パケットには再送メカニズムがないため、IPVS UDP の欠陥によりクラスターノードでパケット損失が発生するリスクがある場合、CoreDNS Pod のスケールインまたは再起動によって、最大 5 分間、クラスター全体の DNS 解決でタイムアウトや例外が発生する可能性があります。IPVS の欠陥が原因で発生する解決例外の解決策については、「DNS 解決問題のトラブルシューティング」をご参照ください。

  • 推奨ポリシーに基づいた自動調整

    以下の dns-autoscaler をデプロイできます。これは、推奨ポリシー (Pod とクラスターノードの比率 1:8) に基づいて、CoreDNS Pod の数をリアルタイムで自動的に調整します。Pod の数は、次の式を使用して計算されます: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 のスケールイン時には解決例外が発生するため、ワークロードの自動スケーリングを使用して CoreDNS Pod の数を制御しないでください。

CoreDNS Pod 仕様の調整

CoreDNS リソースを調整するもう 1 つの方法は、Pod 仕様を変更することです。ACK managed Pro cluster では、CoreDNS Pod のデフォルトのメモリ制限は 2Gi で、CPU 制限はありません。CPU 制限は 4096m に設定することを推奨します。また、CPU 制限の最小値は 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. 設定 をクリックします。設定 ダイアログボックスで、[NodeSelector] の右側にある [+ 追加] をクリックし、次のパラメーターを設定して、OK をクリックします。

    • [Key]:node-role-type

    • [Value]:coredns

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

CoreDNS 設定の最適化

Container Service for Kubernetes (ACK) では、CoreDNS のデフォルト設定を提供しています。CoreDNS が業務コンテナに対して適切な DNS サービスを提供できるように、これらのパラメーターを確認して最適化してください。CoreDNS 設定は柔軟にカスタマイズできます。詳細については、「Configure DNS policies and resolve domain names」および「official CoreDNS documentation」をご参照ください。

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

Container Intelligence Service の定期点検機能と障害診断機能を使用して、CoreDNS 設定ファイルを確認することもできます。Container Intelligence Service の点検結果で CoreDNS ConfigMap の設定異常が示された場合は、前述の各項目を確認してください。

説明

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

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

セッションアフィニティにより、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 関連の設定 (sessionAffinity、sessionAffinityConfig、およびそれらのすべてのサブキー) を削除してから、保存して終了します。

    # 次の内容をすべて削除します。
    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 のタイムアウトを 15 s に設定します。次に、OK をクリックします。

  5. .:53 {
            errors       
            # health プラグインは、CoreDNS のバージョンによって設定が異なる場合があります。
            # シナリオ 1:health プラグインがデフォルトで有効になっていない。   
            # シナリオ 2:health プラグインは有効になっているが、lameduck の期間が設定されていない。
            # health      
            # シナリオ 3:health プラグインは有効になっており、lameduck の期間が 5s に設定されている。   
            # health {
            #     lameduck 5s
            # }      
            # すべてのシナリオで、次のとおり設定を変更して lameduck パラメーターを 15s に設定します。
            health {
                lameduck 15s
            }       
            # ほかのプラグインは変更不要のため、ここでは省略しています。
        }

CoreDNS Pod が正常に稼働している場合、変更は成功です。CoreDNS Pod が異常になった場合は、イベントとログを確認して原因を特定できます。

CLI

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

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

  4. .:53 {
            errors     
            # health プラグインは、CoreDNS のバージョンによって設定が異なる場合があります。
            # シナリオ 1:health プラグインがデフォルトで有効になっていない。     
            # シナリオ 2:health プラグインは有効になっているが、lameduck の期間が設定されていない。
            # health
            # シナリオ 3:health プラグインは有効になっており、lameduck の期間が 5s に設定されている。   
            # health {
            #     lameduck 5s
            # }
            # すべてのシナリオで、次のとおり設定を変更して 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 設定を変更する必要があります。kube-system 名前空間にある coredns という名前の ConfigMap を変更することを推奨します。詳細については、「Manage ConfigMaps」をご参照ください。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 のパフォーマンスが向上します。プラグインの詳細については、「community documentation」をご参照ください。

coredns ConfigMap を使用して multisocket を有効にする必要があります:

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

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

推奨設定:推定 CPU 使用率、CPU リソース制限、および利用可能なクラスターリソースに合わせて NUM_SOCKETS を設定します。たとえば、次のとおりです:

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

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

最適な設定を判断するために、異なる設定で QPS と負荷をテストすることを推奨します。

NUM_SOCKETS を指定しない場合、デフォルト値は GOMAXPROCS です。この値は CoreDNS Pod の CPU 制限と同じです。Pod の CPU 制限が設定されていない場合、この値は Pod が実行されているノード上の CPU コア数と同じです。