Kubernetes DNSサービスの紹介

前書き

ドメインネームシステム(DNS)は、IPアドレスなどのさまざまな種類の情報を覚えやすい名前に関連付けるためのシステムです。 デフォルトでは、ほとんどのKubernetesクラスターは、内部DNSサービスを自動的に構成して、サービス検出用の軽量メカニズムを提供します。 組み込みのサービス検出により、ポッドとサービスが作成、削除、ノード間で移動されている場合でも、Kubernetesクラスター上でアプリケーションがお互いを簡単に見つけて通信できるようになります。

Kubernetes DNSサービスの実装の詳細は、Kubernetesの最近のバージョンで変更されました。 この記事では、Kubernetes DNSサービスのkube-dnsバージョンとCoreDNSバージョンの両方を見ていきます。 それらの動作と、Kubernetesが生成するDNSレコードを確認します。

始める前にDNSをより完全に理解するには、An Introduction to DNS Terminology, Components, and Conceptsをお読みください。 なじみのないKubernetesトピックについては、An Introduction to Kubernetesを読むことができます。

Kubernetes DNSサービスは何を提供しますか?

Kubernetesバージョン1.11より前は、Kubernetes DNSサービスはkube-dnsに基づいていました。 バージョン1.11では、kube-dnsのセキュリティと安定性に関する懸念に対処するためにCoreDNSが導入されました。

実際のDNSレコードを処理するソフトウェアに関係なく、両方の実装は同様に機能します。

  • kube-dnsという名前のサービスと1つ以上のポッドが作成されます。

  • kube-dnsサービスは、Kubernetes APIからのserviceおよびendpointイベントをリッスンし、必要に応じてDNSレコードを更新します。 これらのイベントは、Kubernetesサービスおよび関連するポッドを作成、更新、または削除したときにトリガーされます。

  • kubeletは、新しい各ポッドの/etc/resolv.confnameserverオプションをkube-dnsサービスのクラスターIPに設定し、適切なsearchオプションを使用して、より短いホスト名を使用できるようにします。

    resolv.conf

    nameserver 10.32.0.10
    search namespace.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
  • コンテナで実行されているアプリケーションは、example-service.namespaceなどのホスト名を正しいクラスターIPアドレスに解決できます。

Kubernetes DNSレコードの例

Kubernetesサービスの完全なDNSAレコードは、次の例のようになります。

service.namespace.svc.cluster.local

ポッドには、この形式のレコードがあり、ポッドの実際のIPアドレスが反映されます。

10.32.0.125.namespace.pod.cluster.local

さらに、SRVレコードは、Kubernetesサービスの名前付きポートに対して作成されます。

_port-name._protocol.service.namespace.svc.cluster.local

これらすべての結果は、組み込みのDNSベースのサービス検出メカニズムであり、アプリケーションまたはマイクロサービスは、クラスター上の他のサービスまたはポッドにアクセスするために、シンプルで一貫したホスト名をターゲットにすることができます。

ドメインの検索と短いホスト名の解決

resolv.confファイルにリストされている検索ドメインのサフィックスがあるため、別のサービスに接続するために完全なホスト名を使用する必要がない場合がよくあります。 同じ名前空間でサービスをアドレス指定している場合は、サービス名だけを使用して連絡できます。

other-service

サービスが別のネームスペースにある場合は、クエリに追加します。

other-service.other-namespace

ポッドをターゲットにしている場合、少なくとも以下を使用する必要があります。

pod-ip.other-namespace.pod

デフォルトのresolv.confファイルで見たように、.svcサフィックスのみが自動的に補完されるため、.podまでのすべてを指定するようにしてください。

Kubernetes DNSサービスの実際の使用方法がわかったので、2つの異なる実装の詳細を見ていきましょう。

Kubernetes DNS実装の詳細

前のセクションで説明したように、Kubernetesバージョン1.11では、kube-dnsサービスを処理するための新しいソフトウェアが導入されました。 変更の動機は、サービスのパフォーマンスとセキュリティを向上させることでした。 最初に、元のkube-dnsの実装を見てみましょう。

kube-dns

Kubernetes 1.11より前のkube-dnsサービスは、kube-system名前空間のkube-dnsポッドで実行される3つのコンテナで構成されています。 3つのコンテナは次のとおりです。

  • kube-dns:は、DNSクエリ解決を実行するSkyDNSを実行するコンテナです。

  • dnsmasq:は、SkyDNSからの応答をキャッシュする人気のある軽量DNSリゾルバーとキャッシュです。

  • sidecar:メトリックレポートを処理し、サービスのヘルスチェックに応答するサイドカーコンテナ

Dnsmasqのセキュリティ脆弱性、およびSkyDNSでのパフォーマンスの問題のスケーリングにより、代替システムCoreDNSが作成されました。

CoreDNS

新しいKubernetesDNSサービスであるKubernetes1.11の時点で、CoreDNSが一般提供に昇格されました。 これは、本番環境で使用する準備ができており、多くのインストールツールおよび管理対象のKubernetesプロバイダーのデフォルトのクラスターDNSサービスになることを意味します。

CoreDNSはGoで記述された単一のプロセスで、以前のシステムのすべての機能をカバーします。 単一のコンテナがDNSクエリを解決およびキャッシュし、ヘルスチェックに応答し、メトリックを提供します。

パフォーマンスおよびセキュリティ関連の問題に対処することに加えて、CoreDNSは他のいくつかの小さなバグを修正し、いくつかの新しい機能を追加します。

  • stubDomainsと外部サービスの使用との非互換性に関するいくつかの問題が修正されました

  • CoreDNSは、特定のレコードを返す順序をランダム化することにより、DNSベースのラウンドロビンロードバランシングを強化できます。

  • autopathと呼ばれる機能は、resolv.confにリストされている各検索ドメインサフィックスをより賢く反復することにより、外部ホスト名を解決する際のDNS応答時間を改善できます。

  • kube-dnsを使用すると、ポッドが実際に存在しない場合でも、10.32.0.125.namespace.pod.cluster.localは常に10.32.0.125に解決されます。 CoreDNSには、ポッドが適切なIPと適切なネームスペースに存在する場合にのみ正常に解決される「ポッド検証済み」モードがあります。

CoreDNSの詳細と、それがkube-dnsとどのように異なるかについては、the Kubernetes CoreDNS GA announcementを参照してください。

追加の構成オプション

Kubernetesオペレーターは、ポッドとコンテナーが特定のカスタムドメインを解決する方法をカスタマイズしたり、resolv.confで構成されたアップストリームネームサーバーまたは検索ドメインサフィックスを調整したりする必要があります。 これは、ポッドの仕様のdnsConfigオプションを使用して行うことができます。

example_pod.yaml

apiVersion: v1
kind: Pod
metadata:
  namespace: example
  name: custom-dns
spec:
  containers:
    - name: example
      image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 203.0.113.44
    searches:
      - custom.dns.local

この構成を更新すると、ポッドのresolv.confが書き換えられ、変更が有効になります。 構成は標準のresolv.confオプションに直接マップされるため、上記の構成ではnameserver 203.0.113.44およびsearch custom.dns.local行を含むファイルが作成されます。

結論

この記事では、Kubernetes DNSサービスが開発者に提供するものの基本を説明し、サービスとポッドのDNSレコードの例を示し、異なるKubernetesバージョンでシステムがどのように実装されるかを説明し、ポッドの方法をカスタマイズするために利用できる追加の構成オプションを強調しましたDNSクエリを解決します。

Kubernetes DNSサービスの詳細については、the official Kubernetes DNS for Services and Pods documentationを参照してください。

Related