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

Container Service for Kubernetes:DNS 解決およびキャッシュポリシー

最終更新日:Jun 18, 2026

ACK の DNS クエリは CoreDNS および NodeLocal DNSCache を経由し、各レイヤーで調整可能なパラメーターが設定されています。

DNS 解決アーキテクチャ

ACK における DNS 解決は、アプリケーションの実行場所と NodeLocal DNSCache の有効・無効状態によって異なります。

図中の timeout パラメーターおよび attempts パラメーターは、「解決ポリシー」および「キャッシュポリシー」で定義されています。

ホストベースのアプリケーション(非コンテナ化)

Elastic Compute Service (ECS) インスタンス上で直接実行されるアプリケーションは、ホストの /etc/resolv.conf を使用します。このファイルは Virtual Private Cloud (VPC) DNS サーバを指しています。

DNS resolution flow 1

標準的なコンテナ化された Pod(dnsPolicy: ClusterFirst)

デフォルトでは、Pod は ClusterFirst ポリシーを使用します。すべての DNS クエリはクラスター内の CoreDNS サービスに送信されます。

DNS resolution flow 2

NodeLocal DNSCache が有効な Pod

NodeLocal DNSCache が有効な場合、Pod は同一ノード上のローカルキャッシュエージェントにクエリを送信します。これにより、次の 2 つのメリットがあります。

  • 遅延の低減:DNS クエリがローカルで解決され、CoreDNS へのネットワークホップをスキップできます。

  • conntrack テーブル保護:クエリは conntrack エントリを作成せずにローカルエージェントを使用するため、conntrack 競合が減少し、UDP DNS による conntrack テーブルの枯渇を防ぎます。

DNS resolution flow 3

解決ポリシー

クライアント側

これらの /etc/resolv.conf パラメーターは glibc リゾルバによって解釈されます。ClusterFirst Pod の代表的な構成は次のとおりです。

nameserver 10.x.x.x          # CoreDNS ClusterIP
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5 timeout:5 attempts:2

デプロイメント環境ごとのデフォルト値は次のとおりです。

パラメーター

説明

glibc のデフォルト値

ECS

DNSPolicy が ClusterFirst に設定された Pod

DNSPolicy が Default に設定された Pod

NodeLocal DNSCache を使用する Pod

DNSPolicy が Default に設定され、ホストネットワークを使用する Pod

nameserver

ドメイン名の解決に使用する DNS サーバ。

なし

VPC DNS サーバ

CoreDNS ClusterIP

VPC DNS サーバ

  • NodeLocal DNSCache IP

  • CoreDNS ClusterIP

VPC DNS サーバ

search

FQDN 以外のドメイン名には、解決前に search サフィックスが追加され、FQDN が形成されます。

なし

なし

<ns>.svc.cluster.local svc.cluster.local cluster.local

なし

<ns>.svc.cluster.local svc.cluster.local cluster.local

なし

ndots:n

ドメイン名に含まれるドットの数が ndots 値より多い場合、そのドメイン名は FQDN として直接解決されます。それ以外の場合、クエリの前に検索サフィックスが追加されます。

1

1

5

1

3

1

timeout:n

単一の DNS 解決リクエストのタイムアウト時間。単位:秒。

5

2

5

5

1

2

attempts:n

解決失敗時の最大再試行回数。

2

3

2

2

2

3

rotate

DNS サーバに対してラウンドロビン方式でクエリを送信します。

無効

有効

無効

無効

無効

有効

single-request-reopen

有効にすると、リゾルバは同じソケット上で連続するリクエストの間にソケットを再オープンします。

無効

有効

無効

無効

無効

有効

^①^ attempts パラメーターは、サーバーが SERVFAILNOTIMP、または REFUSED を返すか、結果なしで NOERROR を返した場合にのみ適用されます。詳細については、「Attempts parameter request details」をご参照ください。

^②^ VPC DNS サーバ(100.100.2.136 および 100.100.2.138)は ECS インスタンス上のデフォルト DNS サーバです。これらは PrivateZone および権限のあるドメイン名を解決します。

^③^ CoreDNS ClusterIP は、kube-system 名前空間内の kube-dns サービス IP です。内部サービス名を解決し、PrivateZone および権限のあるクエリを転送します。

^④^ NodeLocal DNSCache は、アドオンがデプロイされると、各ノードの 169.254.20.10 でリッスンします。

追加の /etc/resolv.conf オプションについては、「resolv.conf

非標準リゾルバ

上記の glibc デフォルト値は、コンテナが glibc を使用している場合にのみ適用されます。一般的な例外は次の 2 つです。

  • Alpine (musl libc):Alpine に組み込まれている musl ライブラリは glibc を置き換え、異なる動作をします(「musl libc」をご参照ください)。

    • single-request および single-request-reopen オプションを /etc/resolv.conf でサポートしません。

    • Alpine 3.3 以前は search パラメーターや検索ドメインをサポートしないため、サービス検出が中断されます。

    • 複数の DNS サーバに対して同時リクエストを送信するため、NodeLocal DNSCache の最適化が効果を発揮しません。

    • 古いカーネルでは、同じソケット上で A レコードと AAAA レコードの同時リクエストが conntrack 競合状態をトリガーし、断続的なパケット損失を引き起こす可能性があります。

  • 組み込みリゾルバを持つ言語(Go、Node.js):これらのランタイムはしばしば /etc/resolv.conf をバイパスし、システムリゾルバとは異なる方法で解決を行います。

クラスター内 DNS サーバ

デフォルトでは、CoreDNS は ECS の /etc/resolv.conf からアップストリームを読み取り、組み込みの forward プラグインで DNS リクエストを転送します。NodeLocal DNSCache は、同じ転送構成を持つ埋め込み型 CoreDNS インスタンスを実行します。

forward プラグインのパラメーター(完全なリファレンス):

パラメーター

説明

CoreDNS のデフォルト値

NodeLocal DNSCache のデフォルト値

prefer_udp

可能であれば、アップストリームサーバとの通信に UDP を使用します。

有効

無効

force_tcp

すべてのアップストリーム通信に TCP を強制します。

無効

有効

max_fails

アップストリームサーバが正常でないとマークされるまでの連続ヘルスチェック失敗回数。

2

2

expire

アップストリームサーバへの接続を維持する時間。

10s

10s

policy

アップストリームサーバを選択するポリシー。

random

random

health_check

ヘルスチェックの間隔。

0.5s

0.5s

max_concurrent

アップストリームへの最大同時接続数。

なし

なし

dial timeout

アップストリームサーバへの接続タイムアウト時間。実際の接続時間に基づいて動的に短縮されます。

30s

30s

read timeout

アップストリームサーバからのデータ受信タイムアウト時間。

2s

2s

キャッシュポリシー

クライアント側

クライアント側のキャッシュは、コンテナイメージおよびアプリケーションによって異なります。

クラスター内 DNS サーバ

ACK における CoreDNS および NodeLocal DNSCache のキャッシュパラメーターは次のとおりです。

パラメーター

説明

CoreDNS コミュニティのデフォルト値

NodeLocal DNSCache ACK のデフォルト値

CoreDNS ACK のデフォルト値

success Max TTL

成功した結果をキャッシュする最大生存時間(TTL)。

3600s

30s

30s

success Min TTL

成功した結果をキャッシュする最小 TTL。

5s

5s

5s

success Capacity

キャッシュする成功した結果の数。

9984

9984

9984

denial Max TTL

失敗した結果をキャッシュする最大 TTL。

1800s

5s

30s

denial Min TTL

失敗した結果をキャッシュする最小 TTL。

5s

5s

5s

denial Capacity

キャッシュする失敗した結果の数。

9984

9984

9984

ServerError TTL

アップストリームサーバが到達不能な場合の TTL。

5s

0s(NodeLocal DNSCache Helm Chart バージョン 1.5.0 より前のデフォルト値は 5s)

0s(CoreDNS バージョン 1.8.4.2 より前のデフォルト値は 5s)

serve_stale

アップストリームが到達不能な場合、CoreDNS が期限切れのキャッシュエントリを提供できるようにします。

無効

有効(NodeLocal DNSCache Helm Chart バージョン 1.5.0 より前のデフォルトは無効)

有効(CoreDNS バージョン 1.12.1 より前のデフォルトは無効)

説明

有効 TTL は、結果 TTL、Max TTL、および Min TTL によって決定されます。

  • 結果 TTL > Max TTL の場合、有効 TTL は Max TTL になります。

  • 結果 TTL < Min TTL の場合、有効 TTL は Min TTL になります。

  • Min TTL ≤ 結果 TTL ≤ Max TTL の場合、有効 TTL は 結果 TTL になります。

最適化の提案

Pod の YAML、CoreDNS ConfigMap、または NodeLocal DNSCache ConfigMap を編集することで、DNS 動作を調整できます。

フォールトトレランスの強化

dnsPolicy: Default を使用すると、コンテナは ECS の /etc/resolv.conf から VPC DNS サーバ設定を継承しますが、rotatesingle-request-reopentimeout:2、および attempts:3 オプションは継承されません。これらのオプションがないと、ネットワークジッターにより断続的な DNS エラーが発生する可能性があります。

継承される構成:

apiVersion: v1
kind: Pod
metadata:
  name: example
  namespace: default
spec:
  containers:
  - image: registry.cn-hangzhou.aliyuncs.com/example-ns/example:v1
    name: example
  # Pod YAML の dnsPolicy 値は Default です。
  dnsPolicy: Default

# この時点でのコンテナ内の /etc/resolv.conf ファイル。
# cat /etc/resolv.conf
nameserver 100.100.2.136
nameserver 100.100.2.138

不足しているフォールトトレランスオプションを復元するために、dnsConfig を追加します。

apiVersion: v1
kind: Pod
metadata:
  name: example
  namespace: default
spec:
  containers:
  - image: registry.cn-hangzhou.aliyuncs.com/example-ns/example:v1
    name: example
  # Pod YAML の dnsPolicy 値は Default です。
  dnsPolicy: Default
  # 次のフォールトトレランス構成を追加します。
  dnsConfig:
    options:
    - name: timeout
      value: "2"
    - name: attempts
      value: "3"
    - name: rotate
    - name: single-request-reopen

# 変更後、Pod を再デプロイします。コンテナ内の /etc/resolv.conf に options パラメーターが追加されます。
# cat /etc/resolv.conf
nameserver 100.100.2.136
nameserver 100.100.2.138
options rotate single-request-reopen timeout:2 attempts:3

serve_stale を使用した高可用性

serve_stale を使用すると、アップストリーム DNS サーバが到達不能な場合でも、CoreDNS は期限切れのキャッシュエントリを返すことができるため、一時的な停止による解決エラーを防げます。

serve_stale は、CoreDNS unmanaged edition v1.12.1 以降でデフォルトで有効になっています。「RFC-8767」をご参照ください。

構成フォーマット

serve_stale [DURATION] [REFRESH_MODE]
  • DURATION:有効期限が切れたエントリが提供可能となる期間。デフォルト:1h。この期間を超えて正常なリフレッシュが行われなかったエントリは、もはや提供されません。

  • REFRESH_MODE:CoreDNS が期限切れエントリを処理する方法を制御します。

    • verify:まずアップストリームの到達可能性を確認し、利用可能な場合は最新のエントリを返し、そうでない場合は期限切れのエントリを返します。期限切れ応答の遅延は大きくなりますが、最新データが存在する場合に古いデータを提供することを回避できます。

    • immediate:期限切れのエントリを即座に返し、バックグラウンドでアップストリームからリフレッシュします。高速ですが、古いデータを提供する可能性があります。

CoreDNS unmanaged edition v1.12.1.2 以降のデフォルト構成:

cache 30 {
  ...
  serve_stale 30s verify
}
重要

CoreDNS unmanaged edition v1.12.1.1-4035d7a99-aliyun のデフォルト構成:

cache 30 {
  ...
  serve_stale 1h immediate
}

serve_stale 1h immediate を使用すると、反復的なヘッドレスサービスの更新中に DNS 解決を行うなどの極端なシナリオにおいて、CoreDNS が期限切れのエントリを返す可能性があります。このような現象が頻繁に発生する場合は、verify に切り替えてください。