サービス ディスカバリと DNS


このページでは、Google Kubernetes Engine(GKE)がサービス ディスカバリとクラスタ DNS を実装する方法について説明します。

サービス ディスカバリ

Kubernetes でのサービス ディスカバリは、Service の IP アドレスにマッピングされた自動生成サービス名で実装されます。Service 名は my-svc.my-namespace.svc.cluster-domain.example のように標準仕様に準拠しています。Pod は、example.com のような名前を使用して外部サービスにアクセスできます。Kubernetes での DNS の仕組みについては、Service と Pod の DNS をご覧ください。

GKE のクラスタ DNS

新しい Autopilot クラスタは Cloud DNS を使用します。DNS プロバイダは変更できません。

Standard の場合、GKE にはサービス名と外部名を解決するための次のクラスタ DNS オプションが用意されています。

  • kube-dns: デフォルトですべての GKE クラスタにデプロイされるクラスタ アドオン。
  • Cloud DNS: Cloud DNS を利用するクラウド マネージド クラスタ DNS インフラストラクチャ。クラスタ内の DNS サーバー(kube-dns など)を管理する必要はありません。

サービスを GKE 用 Service Directory に登録することもできます。

GKE には、kube-dns または Cloud DNS で使用できるオプションのアドオンとして NodeLocal DNSCache も用意されています。

kube-dns

kube-dns は Standard クラスタのデフォルト DNS プロバイダであり、1.25.9-gke.400 と 1.26.4-gke.500 より前のバージョンを実行している Autopilot クラスタ用の唯一の DNS プロバイダです。

kube-dns は、kube-dns Pod をクラスタ内のノードにスケジュールする Deployment として動作します。

kube-dns の詳細については、kube-dns の使用をご覧ください。

Cloud DNS

Cloud DNS は、バージョン 1.25.9-gke.400 以降とバージョン 1.26.4-gke.500 以降を実行する Autopilot クラスタ用の唯一の DNS プロバイダです。

Cloud DNS は、kube-dns などのクラスタホスト型の DNS プロバイダを使用せずに、Pod と Service の DNS 解決を行います。Cloud DNS コントローラは、ClusterIP、ヘッドレス、外部名サービス用の Cloud DNS に Pod と Service の DNS レコードを自動的にプロビジョニングします。

Cloud DNS の構成方法については、GKE 向け Cloud DNS の使用をご覧ください。

NodeLocal DNSCache

NodeLocal DNSCache は、すべてのクラスタノードで DNS キャッシュ Pod をスケジューリングする DaemonSet として実行されます。この DNS キャッシュにより、DNS ルックアップのレイテンシが改善されます。DNS ルックアップ時間がより整合性を持つようになり、kube-dns または Cloud DNS に対する DNS クエリの数が削減されます。

NodeLocal DNSCache の構成方法については、NodeLocal DNSCache の設定をご覧ください。

単一クラスタの外部にあるサービス ディスカバリ

単一クラスタのスコープ外でサービス ディスカバリを構成するには、次のいずれかの方法を使用します。

Cloud DNS VPC のスコープ

クラスタ DNS に Cloud DNS を使用するクラスタは、GKE クラスタ スコープまたは Virtual Private Cloud(VPC)スコープのいずれかのモードで動作する必要があります。

クラスタ スコープでクラスタを構成すると、DNS レコードはスキーマ <svc>.<ns>.svc.cluster.local を使用するクラスタ内でのみ解決されます。これは kube-dns と同じ動作です。

クラスタを VPC スコープで構成すると、クラスタ サービスの DNS レコードが VPC 全体で解決されます。つまり、同じ VPC 内のクライアント、または Cloud VPN または Cloud Interconnect 経由で VPC に接続しているクライアントは、GKE クラスタ内の Service の DNS レコードを直接解決できます。GKE 以外のクライアントが DNS レコードを解決できるように、固有のクラスタ DNS 名を構成することもできます。たとえば、GKE 以外のクライアントは gke-svc.ns.svc.cluster2 から gke-svc.ns.svc.cluster1 を解決できます。

VPC スコープの DNS の詳細については、GKE 向け Cloud DNS の使用をご覧ください。

マルチクラスタ サービス

マルチクラスタ サービスでは、既存の Service オブジェクトを利用する GKE 用のマルチクラスタ サービス ディスカバリとロード バランシングが提供されます。マルチクラスタ サービスは、単一の仮想 IP アドレスを持つすべての GKE クラスタ間で検出され、アクセスされます。これは、単一クラスタでアクセス可能な ClusterIP Service の動作と同じです。

マルチクラスタ サービスは、クラスタ間で Service を集約し、スキーマ <svc>.<ns>.svc.clusterset.local を使用して、これらの Service が単一のマルチクラスタ DNS レコードとしてアドレス指定できるようにします。これにより、マルチクラスタ サービスを使用する任意の GKE クラスタから、一貫性があり、アドレス指定可能な特定の Service に固有の名前が提供されます。

マルチクラスタ サービスの詳細については、マルチクラスタ サービスをご覧ください。

GKE 用 Service Directory

GKE 用 Service Directory は、すべての Kubernetes Deployment にわたって単一のサービスビューを提供します。Service Directory は、GKE と非 GKE の両方のサービスを 1 つのレジストリに登録できます。以下をお求めの場合、Service Directory が特に便利です。

  • Kubernetes アプリケーションと Kubernetes 以外のアプリケーションを相互に検出可能にするための単一レジストリ。
  • マネージド サービス ディスカバリ ツール。
  • 他のクライアントからアクセス可能なサービスのメタデータを保存する。
  • サービスレベルごとにアクセス権限を設定する。

Service Directory サービスは、DNS、HTTP、gRPC で解決できます。Service Directory は Cloud DNS と統合され、Service Directory 内のサービスに一致する Cloud DNS レコードを作成できます。

詳細については、GKE 用 Service Directory の構成をご覧ください。

/etc/resolv.conf

ClusterFirst DNS ポリシーを使用する Pod の場合、/etc/resolv.conf の値は、クラスタで有効になっている機能によって異なります。

GKE 向け Cloud DNS NodeLocal DNSCache /etc/resolv.conf
有効 有効 169.254.20.10
有効 無効 169.254.169.254
無効 有効 kube-dns サービスの IP アドレス
無効 無効 kube-dns サービスの IP アドレス

次のステップ

  • GKE 向け Cloud DNS の使用方法を確認する。
  • NodeLocal DNSCache を使用して、大量の DNS クエリを必要とするクラスタにスケーラブルな DNS 解決を提供する方法を学習する。