ACK の DNS クエリは CoreDNS および NodeLocal DNSCache を経由し、各レイヤーで調整可能なパラメーターが設定されています。
DNS 解決アーキテクチャ
ACK における DNS 解決は、アプリケーションの実行場所と NodeLocal DNSCache の有効・無効状態によって異なります。
図中のtimeoutパラメーターおよびattemptsパラメーターは、「解決ポリシー」および「キャッシュポリシー」で定義されています。
ホストベースのアプリケーション(非コンテナ化)
Elastic Compute Service (ECS) インスタンス上で直接実行されるアプリケーションは、ホストの /etc/resolv.conf を使用します。このファイルは Virtual Private Cloud (VPC) DNS サーバを指しています。
標準的なコンテナ化された Pod(dnsPolicy: ClusterFirst)
デフォルトでは、Pod は ClusterFirst ポリシーを使用します。すべての DNS クエリはクラスター内の CoreDNS サービスに送信されます。
NodeLocal DNSCache が有効な Pod
NodeLocal DNSCache が有効な場合、Pod は同一ノード上のローカルキャッシュエージェントにクエリを送信します。これにより、次の 2 つのメリットがあります。
-
遅延の低減:DNS クエリがローカルで解決され、CoreDNS へのネットワークホップをスキップできます。
-
conntrack テーブル保護:クエリは conntrack エントリを作成せずにローカルエージェントを使用するため、conntrack 競合が減少し、UDP DNS による conntrack テーブルの枯渇を防ぎます。
解決ポリシー
クライアント側
これらの /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 が |
DNSPolicy が |
NodeLocal DNSCache を使用する Pod |
DNSPolicy が Default に設定され、ホストネットワークを使用する Pod |
|
|
ドメイン名の解決に使用する DNS サーバ。 |
なし |
VPC DNS サーバ② |
CoreDNS ClusterIP③ |
VPC DNS サーバ |
|
VPC DNS サーバ |
|
|
FQDN 以外のドメイン名には、解決前に |
なし |
なし |
|
なし |
|
なし |
|
|
ドメイン名に含まれるドットの数が |
1 |
1 |
5 |
1 |
3 |
1 |
|
|
単一の DNS 解決リクエストのタイムアウト時間。単位:秒。 |
5 |
2 |
5 |
5 |
1 |
2 |
|
|
解決失敗時の最大再試行回数。 |
2 |
3 |
2 |
2 |
2 |
3 |
|
|
DNS サーバに対してラウンドロビン方式でクエリを送信します。 |
無効 |
有効 |
無効 |
無効 |
無効 |
有効 |
|
|
有効にすると、リゾルバは同じソケット上で連続するリクエストの間にソケットを再オープンします。 |
無効 |
有効 |
無効 |
無効 |
無効 |
有効 |
^①^ attempts パラメーターは、サーバーが SERVFAIL、NOTIMP、または 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 のデフォルト値 |
|
|
可能であれば、アップストリームサーバとの通信に UDP を使用します。 |
有効 |
無効 |
|
|
すべてのアップストリーム通信に TCP を強制します。 |
無効 |
有効 |
|
|
アップストリームサーバが正常でないとマークされるまでの連続ヘルスチェック失敗回数。 |
2 |
2 |
|
|
アップストリームサーバへの接続を維持する時間。 |
10s |
10s |
|
|
アップストリームサーバを選択するポリシー。 |
|
|
|
|
ヘルスチェックの間隔。 |
0.5s |
0.5s |
|
|
アップストリームへの最大同時接続数。 |
なし |
なし |
|
|
アップストリームサーバへの接続タイムアウト時間。実際の接続時間に基づいて動的に短縮されます。 |
30s |
30s |
|
|
アップストリームサーバからのデータ受信タイムアウト時間。 |
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 サーバ設定を継承しますが、rotate、single-request-reopen、timeout: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 に切り替えてください。