このトピックでは、Alibaba Cloud Container Compute Service (ACS) クラスタでサポートされているドメインネームシステム (DNS) 解決ポリシーとキャッシュポリシーについて説明します。
DNS 解決パイプライン
このセクションでは、以下のシナリオにおける DNS 解決パイプラインを示します。
以下の図に示されているタイムアウトや試行回数などの用語については、このトピックの「解決ポリシー」セクションと「キャッシュポリシー」セクションを参照してください。
コンテナ化されていないアプリケーションが Elastic Compute Service (ECS) インスタンス上で実行されている場合。
たとえば、次の図に示すように、App という名前のアプリケーションが ECS インスタンス上で実行されているとします。

コンテナ化されたアプリケーションが Kubernetes クラスタのポッド内で実行されている場合。ポッドは ClusterFirst DNS ポリシーを使用します。
たとえば、次の図に示すように、App という名前のアプリケーションが Kubernetes クラスタのポッド内で実行されているとします。

解決ポリシー
クライアント側
ほとんどの場合、ポッドの DNS クエリは glibc が提供するインターフェースを使用して処理されます。次の表は、/etc/resolv.conf ファイルで設定できるパラメータと、さまざまな環境でのデフォルト値を示しています。これらのパラメータは、glibc が DNS 解決を実行する方法を指定します。
パラメータ | 説明 | glibc のデフォルト値 | ECS | ClusterFirst DNS ポリシーを使用するポッドのデフォルト値 | Default DNS ポリシーを使用するポッドのデフォルト値 | ホストネットワークと Default DNS ポリシーを使用するポッドのデフォルト値 |
| ドメイン名を解決する DNS サーバー。 | なし | 仮想プライベートクラウド (VPC) にデプロイされた DNS サーバー② | CoreDNS のクラスタ IP アドレス③ | VPC にデプロイされた DNS サーバー | VPC にデプロイされた DNS サーバー |
| 完全修飾ドメイン名 (FQDN) 以外のドメイン名には、ドメイン名が解決される前に、 | なし | なし | <ns>.svc.cluster.localsvc.cluster.localcluster.local | なし | なし |
| ドメイン名文字列のドットの数が ndots パラメータの値より大きい場合、ドメイン名は FQDN であり、直接解決されます。ドメイン名文字列のドットの数が ndots パラメータの値より小さい場合、ドメイン名は解決される前に、search パラメータで指定されたサフィックスが付加されます。 | 1 | 1 | 5 | 1 | 1 |
| 各 DNS 解決のタイムアウト期間。単位:秒。 | 5 | 2 | 5 | 5 | 2 |
| DNS 解決が失敗した場合に実行できる再試行の最大回数。 | 2 | 3 | 2 | 2 | 3 |
| DNS クエリをラウンドロビン方式で DNS サーバーに送信します。 | 無効 | 有効 | 無効 | 無効 | 有効 |
| このパラメータを指定すると、同じソケットを使用して 2 つの DNS リクエストが送信された場合、クライアントは最初の DNS リクエストを送信した後にソケットを閉じ、新しいソケットを開いて 2 番目の DNS リクエストを送信します。 | 無効 | 有効 | 無効 | 無効 | 有効 |
①attempts パラメータは、特定のシナリオ、たとえば、SERVFAIL、NOTIMP、または REFUSED が返された場合、または解決結果なしで NOERROR が返された場合にのみ有効になります。詳細については、attempts パラメータの紹介を参照してください。
②VPC にデプロイされた DNS サーバーは、VPC 内の ECS インスタンスのデフォルトの DNS サーバーです。DNS サーバーの IP アドレスは 100.100.2.136 と 100.100.2.138 です。DNS サーバーは、権威DNS名と Alibaba Cloud DNS PrivateZone に追加されたドメイン名を解決します。
③CoreDNS のクラスタ IP アドレスは、kube-system ネームスペースの kube-dns サービスの IP アドレスです。kube-dns サービスは、内部ドメイン名、権威DNS名、および Alibaba Cloud DNS PrivateZone に追加されたドメイン名に対する DNS クエリを CoreDNS に転送します。
resolv.conf の設定方法の詳細については、resolv.conf を参照してください。
特定の場合、クライアント側の DNS 解決設定は、上記の記述と異なる場合があります。
Alpine Linux イメージを使用してコンテナをデプロイする場合、DNS 解決設定が大きく異なる場合があります。これは、Alpine Linux が glibc を musl libc に置き換えているためです。以下に、いくつかの違いを示します。
Alpine Linux は、/etc/resolv.conf ファイルの single-request パラメータと single-request-reopen パラメータをサポートしていません。
Alpine 3.3 以前のバージョンは、検索ドメインを指定できる search パラメータをサポートしていません。その結果、サービスディスカバリの実装に失敗します。
musl libc は、/etc/resolv.conf ファイルで指定された DNS サーバーに送信されたクエリを並列処理します。その結果、NodeLocal DNSCache は DNS 解決を最適化できません。
musl libc は、同じソケットを使用する A クエリと AAAA クエリを並列処理します。これにより、以前のカーネルバージョンの conntrack ポートでパケット損失が発生します。
説明詳細については、musl libc を参照してください。
Golang または Node.js を使用してアプリケーションを開発する場合、アプリケーションは組み込みの DNS リゾルバを使用する場合があります。これも DNS 解決に大きな違いをもたらします。
クラスタ内の内部 DNS サーバー
デフォルトでは、CoreDNS の /etc/resolv.conf ファイルは、CoreDNS をホストする ECS インスタンスの /etc/resolv.conf ファイルから継承されます。ただし、CoreDNS は組み込みの forward プラグインを使用して DNS クエリを転送します。
次の表は、forward プラグインのパラメータを示しています。詳細については、forward を参照してください。
パラメータ | 説明 | CoreDNS のデフォルト値 | NodeLocal DNSCache のデフォルト値 |
| アップストリームサーバーとの通信に UDP を優先的に使用します。 | 有効 | 無効 |
| アップストリームサーバーとの通信に TCP を強制的に使用します。 | 無効 | 有効 |
| アップストリームサーバーが異常とみなされるまでに発生する必要があるヘルスチェックの連続失敗回数。 | 2 | 2 |
| アップストリームサーバーへの接続が維持される期間。デフォルトの期間は 10 秒です。 | 10s | 10s |
| アップストリームサーバーを選択するために使用されるポリシー。 | random | random |
| ヘルスチェックが実行される間隔。 | 0.5s | 0.5s |
| アップストリームサーバーに送信できる同時クエリの最大数。 | なし | なし |
| アップストリームサーバーへの接続のタイムアウト期間。 | 30 秒。タイムアウト期間は、実際の接続時間に基づいて動的に短縮されます。 | 30 秒。タイムアウト期間は、実際の接続時間に基づいて動的に短縮されます。 |
| アップストリームサーバーに送信されたリクエストのタイムアウト期間。 | 2s | 2s |
キャッシュポリシー
クライアント側
クライアント側の DNS キャッシュポリシーは、コンテナとアプリケーションの設定によって異なります。クライアント側の DNS キャッシュポリシーは、要件に基づいて設定できます。
クラスタ内の内部 DNS サーバー
パラメータ | 説明 | CoreDNS のデフォルト値 | ACS の CoreDNS のデフォルト値 |
success Max TTL | 成功した DNS 解決のキャッシュの最大有効期間 (TTL)。 | 3600s | 30s |
success Min TTL | 成功した DNS 解決のキャッシュの最小 TTL。 | 5s | 5s |
success Capacity | キャッシュできる成功した DNS 解決結果の最大数。 | 9984 | 9984 |
denial Max TTL | 失敗した DNS 解決のキャッシュの最大 TTL。 | 1800s | 30s |
denial Min TTL | 失敗した DNS 解決のキャッシュの最小 TTL。 | 5s | 5s |
denial Capacity | キャッシュできる失敗した DNS 解決結果の最大数。 | 9984 | 9984 |
ServerError TTL | 異常なアップストリーム DNS サーバーから返された DNS 解決結果の最大 TTL。 | 5s | 0s。インストールされている CoreDNS のバージョンが 1.8.4.2 より前の場合、デフォルト値は 5s です。 |
serve_stale | クライアントがアップストリーム DNS サーバーに接続できない場合、古いローカル DNS キャッシュを使用します。 | 無効 | 無効 |
DNS キャッシュの実際の TTL は、返された DNS レコードの TTL、最大 TTL、および最小 TTL によって決まります。
返された DNS レコードの TTL が最大 TTL より大きい場合、最大 TTL が DNS キャッシュの実際の TTL として使用されます。
返された DNS レコードの TTL が最小 TTL より小さい場合、最小 TTL が DNS キャッシュの実際の TTL として使用されます。
返された DNS レコードの TTL が最小 TTL より大きく、最大 TTL より小さい場合、返された DNS レコードの TTL が DNS キャッシュの実際の TTL として使用されます。
DNS 解決の最適化
このトピックでは、Kubernetes クラスタの DNS 解決パスと関連パラメータについて説明します。パラメータ設定は、ポッド YAML ファイルまたは CoreDNS ConfigMap で変更できます。例:
クライアントポッド YAML ファイルで dnsPolicy:Default を指定すると、ポッドはポッドをホストする ECS インスタンスの DNS 設定を継承します。したがって、VPC 内の DNS サーバーの IP アドレスは、ポッドの /etc/resolv.conf ファイルに自動的に指定されます。
apiVersion: v1
kind: Pod
metadata:
name: example
namespace: default
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/example-ns/example:v1
name: example
# dnsPolicy パラメータを Default に設定します。
dnsPolicy: Default
# ポッドの /etc/resolv.conf ファイル。
# cat /etc/resolv.conf
nameserver 100.100.2.136
nameserver 100.100.2.138ECS インスタンスの /etc/resolv.conf ファイルと比較して、ポッドの /etc/resolv.conf ファイルには、rotate single-request-reopen timeout:2 attempts:3 オプションが含まれていません。これにより、ネットワークのジッターが発生した場合に解決エラーが発生する可能性があります。フォールトトレランス機能を向上させるには、これらのオプションを追加する必要があります。次の内容に基づいてポッド YAML ファイルを変更します。
apiVersion: v1
kind: Pod
metadata:
name: example
namespace: default
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/example-ns/example:v1
name: example
# dnsPolicy パラメータを Default に設定します。
dnsPolicy: Default
# 次のオプションを追加します。
dnsConfig:
options:
- name: timeout
value: "2"
- name: attempts
value: "3"
- name: rotate
- name: single-request-reopen
# オプションを /etc/resolv.con に追加した後、ポッドを再デプロイして変更を適用します。
# cat /etc/resolv.conf
nameserver 100.100.2.136
nameserver 100.100.2.138
options rotate single-request-reopen timeout:2 attempts:3