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

Container Service for Kubernetes:DNS の概要

最終更新日:Jun 26, 2025

Kubernetes クラスタ内のポッドは、ドメイン名を使用して、クラスタ内のサービスまたはクラスタ外のサービスにアクセスします。ドメイン名は IP アドレスに解決されます。ドメイン名と IP アドレス間のマッピングを維持するために、ドメインネームシステム(DNS)が使用されます。このトピックでは、DNS の基本について説明し、Container Service for Kubernetes(ACK)が DNS を実装するために提供するコンポーネントを紹介し、ACK クラスタの DNS 解決を構成する方法について説明します。

ACK クラスタでの DNS 解決の仕組み

インターネットに接続されているデバイスは、IP アドレスを使用して相互に通信します。ただし、IP アドレスは覚えにくいものです。ドメイン名には意味情報が含まれています。 IP アドレスと比較して、ドメイン名は覚えやすいものです。ほとんどの場合、クライアントはドメイン名にリクエストを送信します。次の図は、example.com ドメイン名がクライアントからリクエストを受信したときの DNS 解決手順を示しています。

  1. 宛先サーバーは、DNS サーバーにドメイン名と IP アドレスを登録します。

  2. クライアントは、DNS サーバーに example.com ドメイン名の IP アドレスを問い合わせます。

  3. DNS サーバーは、サーバー上の DNS レコードを確認し、クライアントに IP アドレスを返します。

  4. クライアントは、宛先サーバーと通信するために 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 を構成する」をご参照ください。

kubectl を使用して CoreDNS にデプロイされたリソースをクエリする

  1. 次のコマンドを実行して、CoreDNS デプロイメントをクエリします。

    kubectl get deployment -l k8s-app=kube-dns -n kube-system 

    予期される出力:

    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    coredns   2/2     2            2           1h
  2. 次のコマンドを実行して、CoreDNS サービスをクエリします。

    kubectl get service -n kube-system kube-dns

    予期される出力:

    NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
    kube-dns   ClusterIP   172.**.**.**   <none>        53/UDP,53/TCP,9153/TCP   1h

default 名前空間のポッドが database-svc サービスにアクセスしようとするときの DNS 解決手順を次の図に示します。

  1. ポッドは /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                                                     // ドメイン解決オプション (キーと値のペア) を設定します。複数のキーと値のペアがサポートされています。
  2. ポッドは kube-dns サービスに DNS クエリを送信します。ドメイン名は、ドメイン名が解決される前に、search パラメーターで指定されたサフィックスが順番に追加されます。

    1. database-svc.default.svc.cluster.local: ポッドと同じ名前空間にあるサービス。

    2. database-svc.svc.cluster.local: 別の名前空間にあるサービス。

    3. database-svc.cluster.local: クラスター内の内部ドメイン名。

    4. database-svc: 外部ドメイン名。

  3. CoreDNS ポッドは 172.4.XX.XX を返します。

  4. ポッドは 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 名前空間に追加されます。

  1. ポッドは最初にノード上の DNS キャッシュにクエリを実行します。

  2. 解決は、キャッシュヒットが発生するかどうかによって進行します。

    1. database-svc サービスのレコードがキャッシュ内に見つかった場合、キャッシュヒットが発生します。この場合、キャッシュに記録されている IP アドレスが返されます。ポッドは IP アドレスに接続します。

    2. database-svc サービスのレコードがキャッシュ内に見つからない場合、キャッシュミスが発生します。この場合、ポッドは CoreDNS に DNS クエリを送信します。CoreDNS によって返された結果は、ノード上の DNS キャッシュに同期されます。

ACK クラスタの DNS 解決を構成する

ACK クラスタの DNS 解決は、次の観点から構成できます。

クラスタの観点から DNS 解決を構成する

ノードの kubelet 構成には、ClusterDomain パラメーターが含まれています。クラスター内の各ノードの kubelet 構成の ClusterDomain パラメーターが同じ値に設定されていることを確認する必要があります。そうでない場合、クラスターでネットワークエラーが発生する可能性があります。

  • ClusterDomain

    ClusterDomain パラメーターは、クラスター内のすべてのサービスで使用されるトップレベルドメイン名を指定します。デフォルト値: cluster.local。ドメイン名のサフィックスが ClusterDomain パラメーターの値である場合、それは内部ドメイン名です。ドメイン名のサフィックスが ClusterDomain パラメーターの値でない場合、それは外部ドメイン名です。クラスターの作成中に ClusterDomain パラメーターを指定できます。ClusterDomain パラメーターの値が、使用する外部ドメイン名と重複しないようにしてください。

    image.png

ノードの観点から 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 ポリシーとドメイン名解決」をご参照ください。