Kubernetes クラスタ内のポッドは、ドメイン名を使用して、クラスタ内のサービスまたはクラスタ外のサービスにアクセスします。ドメイン名は IP アドレスに解決されます。ドメイン名と IP アドレス間のマッピングを維持するために、ドメインネームシステム(DNS)が使用されます。このトピックでは、DNS の基本について説明し、Container Service for Kubernetes(ACK)が DNS を実装するために提供するコンポーネントを紹介し、ACK クラスタの DNS 解決を構成する方法について説明します。
ACK クラスタでの DNS 解決の仕組み
インターネットに接続されているデバイスは、IP アドレスを使用して相互に通信します。ただし、IP アドレスは覚えにくいものです。ドメイン名には意味情報が含まれています。 IP アドレスと比較して、ドメイン名は覚えやすいものです。ほとんどの場合、クライアントはドメイン名にリクエストを送信します。次の図は、example.com ドメイン名がクライアントからリクエストを受信したときの DNS 解決手順を示しています。
宛先サーバーは、DNS サーバーにドメイン名と IP アドレスを登録します。
クライアントは、DNS サーバーに example.com ドメイン名の IP アドレスを問い合わせます。
DNS サーバーは、サーバー上の DNS レコードを確認し、クライアントに IP アドレスを返します。
クライアントは、宛先サーバーと通信するために IP アドレスに接続します。
ACK が DNS を実装するために提供するコンポーネント
CoreDNS と NodeLocal DNSCache は、ACK マネージドクラスターで DNS を実装するために使用されます。CoreDNS と NodeLocal DNSCache を使い始める前に、Kubernetes の DNS の基本について学ぶために、以下のコンテンツを読むことをお勧めします。
ほとんどの場合、サービスには短い名前が付いています。DNS ルックアップ中に、サービスは <servicename>.<namespace>.svc.<ClusterDomain> 形式の完全なドメイン名で表されます。<ClusterDomain> は、クラスターのドメイン名を参照します。Kubernetes クラスターのデフォルトのドメイン名は cluster.local です。カスタムドメイン名を指定できます。たとえば、default 名前空間の database-svc サービスの完全なドメイン名は database-svc.default.svc.cluster.local です。
ポッドの作成中に、ノード上の kubelet はポッドの /etc/resolv.conf ファイルを構成します。ポッドは、このファイルの構成に基づいて DNS クエリを送信します。
アンマネージド CoreDNS
CoreDNS は、Kubernetes によって提供される DNS リゾルバーです。 CoreDNS は、カスタムの内部ドメイン名と外部ドメイン名を解決できます。 CoreDNS は、Cloud Native Computing Foundation(CNCF)によってホストされています。 CoreDNS の詳細については、「CoreDNS: DNS and Service Discovery」をご参照ください。
ACK は、ACK クラスタのデフォルトの DNS サーバーとして CoreDNS を使用します。 CoreDNS は、kube-system 名前空間のデプロイメントとしてデプロイされます。 CoreDNS は、ClusterIP サービスである kube-dns サービスを使用してクラスタ内で公開されます。 CoreDNS の構成方法の詳細については、「CoreDNS を構成する」をご参照ください。
default 名前空間のポッドが database-svc サービスにアクセスしようとするときの DNS 解決手順を次の図に示します。
ポッドは
/etc/resolv.confファイルをチェックして、DNS サーバーの IP アドレス(172.0.XX.XX)を取得します。これは kube-dns サービスのクラスター IP アドレスです。構成ファイルの例:nameserver 172.0.XX.XX // DNS サーバーの IP アドレスを定義します。 search default.svc.cluster.local svc.cluster.local cluster.local // ドメインサフィックス検索ルールを構成します。サフィックスが多いほど、DNS クエリ試行回数が増加します。 options ndots:5 // ドメイン解決オプション (キーと値のペア) を設定します。複数のキーと値のペアがサポートされています。ポッドは kube-dns サービスに DNS クエリを送信します。ドメイン名は、ドメイン名が解決される前に、
searchパラメーターで指定されたサフィックスが順番に追加されます。database-svc.default.svc.cluster.local: ポッドと同じ名前空間にあるサービス。database-svc.svc.cluster.local: 別の名前空間にあるサービス。database-svc.cluster.local: クラスター内の内部ドメイン名。database-svc: 外部ドメイン名。
CoreDNS ポッドは
172.4.XX.XXを返します。ポッドは IP アドレスに接続して、
database-svcサービスと通信します。
マネージド CoreDNS
マネージド CoreDNS は、アンマネージド CoreDNS と同様に動作しますが、ACK によって完全に管理されます。クラスターリソースを消費せず、ユーザーの O&M 要件がなくなり、ワークロードに基づいて自動的にスケーリングされます。
マネージド CoreDNS は、自動モードが有効になっている ACK マネージドクラスター でもサポートされています。
NodeLocal DNSCache
NodeLocal DNSCache は、各ワーカーノードで DNS キャッシュエージェントを実行して、CoreDNS のワークロードを削減します。これは、クラスタ内の DNS 解決の安定性と可用性を向上させるのに役立ちます。 DNS 解決の安定性を向上させるために、クラスタに NodeLocal DNSCache をインストールすることをお勧めします。 NodeLocal DNSCache のインストール方法と使用方法の詳細については、「NodeLocal DNSCache を構成する」をご参照ください。
default 名前空間のポッドが database-svc サービスにアクセスしようとするときの、クラスター内の DNS 解決手順を次の図に示します。NodeLocal DNSCache はクラスターにインストールされ、node-local-dns-injection: "enabled" ラベルが default 名前空間に追加されます。
ポッドは最初にノード上の DNS キャッシュにクエリを実行します。
解決は、キャッシュヒットが発生するかどうかによって進行します。
database-svcサービスのレコードがキャッシュ内に見つかった場合、キャッシュヒットが発生します。この場合、キャッシュに記録されている IP アドレスが返されます。ポッドは IP アドレスに接続します。database-svcサービスのレコードがキャッシュ内に見つからない場合、キャッシュミスが発生します。この場合、ポッドは CoreDNS に DNS クエリを送信します。CoreDNS によって返された結果は、ノード上の DNS キャッシュに同期されます。
ACK クラスタの DNS 解決を構成する
ACK クラスタの DNS 解決は、次の観点から構成できます。
クラスタの観点から DNS 解決を構成する
ノードの kubelet 構成には、ClusterDomain パラメーターが含まれています。クラスター内の各ノードの kubelet 構成の ClusterDomain パラメーターが同じ値に設定されていることを確認する必要があります。そうでない場合、クラスターでネットワークエラーが発生する可能性があります。
ClusterDomainClusterDomain パラメーターは、クラスター内のすべてのサービスで使用されるトップレベルドメイン名を指定します。デフォルト値:
cluster.local。ドメイン名のサフィックスが ClusterDomain パラメーターの値である場合、それは内部ドメイン名です。ドメイン名のサフィックスが ClusterDomain パラメーターの値でない場合、それは外部ドメイン名です。クラスターの作成中に ClusterDomain パラメーターを指定できます。ClusterDomain パラメーターの値が、使用する外部ドメイン名と重複しないようにしてください。
ノードの観点から DNS 解決を構成する
resolveConfノードの kubelet 構成の
resolveConfパラメーターは、ノード上の DNS 構成ファイルのパスを指定します。ポッド構成のdnsPolicyパラメーターをDefaultに設定すると、kubelet は kubelet のresolveConfパラメーターで指定されたファイル(デフォルトでは/etc/resolv.conf)の内容を、ポッドの/etc/resolv.confファイルにコピーします。
ポッドの観点から DNS 解決を構成する
ポッドの構成には、
dnsPolicyパラメーターとdnsConfigパラメーターが含まれており、これらを使用してポッドのカスタム DNS ポリシーを構成できます。dnsPolicy は、ポッドの DNS 解決ポリシーを指定します。dnsConfig パラメーターは、ポッドの DNS 解決用の DNS サーバーと DNS 検索ドメインを指定します。さまざまなシナリオでdnsPolicyパラメーターとdnsConfigパラメーターを構成する方法の詳細については、「DNS ポリシーとドメイン名解決」をご参照ください。