前書き

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

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

始める前にDNSをより完全に理解するには、https://www.digitalocean.com/community/tutorials/an-introduction-to-dns-terminology-components-and-concepts [DNS用語の概要、コンポーネント、および概念]。 慣れていないKubernetesトピックについては、https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes [An Introduction to Kubernetes]をご覧ください。

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

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

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

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

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

  • kubeletは、各新しいポッドの + / etc / resolv.conf + `+ nameserver `オプションを ` 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サービスの完全なDNS `+ A +`レコードは、次の例のようになります。

..svc.cluster.local

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

..pod.cluster.local

さらに、portsという名前のKubernetesサービスに対して「+ SRV」レコードが作成されます。

_._...svc.cluster.local

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

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

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

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

.

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

..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クエリ解決を実行するhttps://github.com/skynetservices/skydns[SkyDNS]を実行するコンテナー

  • * dnsmasq:* SkyDNSからの応答をキャッシュする一般的な軽量DNSリゾルバーとキャッシュ

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

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

CoreDNS

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

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

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

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

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

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

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

CoreDNSとkube-dnsとの違いの詳細については、https://kubernetes.io/blog/2018/07/10/coredns-ga-for-kubernetes-cluster-dns/ [Kubernetes CoreDNS GA発表]。

追加の構成オプション

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"

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

結論

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

Kubernetes DNSサービスの詳細については、https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/ [Kubernetesの公式のサービスとPodsのドキュメント]を参照してください。