KubernetesDNSサービスの概要
序章
ドメインネームシステム(DNS)は、IPアドレスなどのさまざまな種類の情報を覚えやすい名前に関連付けるためのシステムです。 デフォルトでは、ほとんどのKubernetesクラスタは、サービス検出のための軽量メカニズムを提供するように内部DNSサービスを自動的に構成します。 組み込みのサービス検出により、ポッドやサービスが作成、削除、ノード間で移動されている場合でも、アプリケーションがKubernetesクラスター上で相互に簡単に検索して通信できるようになります。
Kubernetes DNSサービスの実装の詳細は、最近のバージョンのKubernetesで変更されています。 この記事では、KubernetesDNSサービスのkube-dnsバージョンとCoreDNSバージョンの両方を見ていきます。 それらがどのように動作し、Kubernetesが生成するDNSレコードを確認します。
始める前にDNSをより完全に理解するには、 DNSの用語、コンポーネント、および概念の概要をお読みください。 なじみのないKubernetesトピックについては、Kubernetesの概要をお読みください。
Kubernetes DNSサービスは何を提供しますか?
Kubernetesバージョン1.11より前は、KubernetesDNSサービスはkube-dnsに基づいていました。 バージョン1.11では、kube-dnsのセキュリティと安定性に関する懸念に対処するためにCoreDNSが導入されました。
実際のDNSレコードを処理するソフトウェアに関係なく、両方の実装は同じように機能します。
kube-dns
という名前のサービスと1つ以上のポッドが作成されます。kube-dns
サービスは、KubernetesAPIからの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アドレスに解決できます。
KubernetesDNSレコードの例
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つの異なる実装の詳細をいくつか見ていきましょう。
KubernetesDNS実装の詳細
前のセクションで説明したように、Kubernetesバージョン1.11では、kube-dns
サービスを処理するための新しいソフトウェアが導入されました。 変更の動機は、サービスのパフォーマンスとセキュリティを向上させることでした。 最初に、元のkube-dns
の実装を見てみましょう。
kube-dns
Kubernetes1.11より前のkube-dns
サービスは、kube-system
名前空間のkube-dns
ポッドで実行される3つのコンテナで構成されています。 3つのコンテナは次のとおりです。
- kube-dns:DNSクエリ解決を実行するSkyDNSを実行するコンテナー
- dnsmasq:SkyDNSからの応答をキャッシュする人気のある軽量DNSリゾルバーとキャッシュ
- サイドカー:メトリクスレポートを処理し、サービスのヘルスチェックに応答するサイドカーコンテナ
Dnsmasqのセキュリティの脆弱性、およびSkyDNSのスケーリングパフォーマンスの問題により、代替システムであるCoreDNSが作成されました。
CoreDNS
Kubernetes 1.11以降、新しいKubernetesDNSサービスであるCoreDNSが一般提供に昇格しました。 これは、本番環境で使用する準備ができており、多くのインストールツールとマネージドKubernetesプロバイダーのデフォルトのクラスターDNSサービスになることを意味します。
CoreDNSは、Goで記述された単一のプロセスであり、以前のシステムのすべての機能をカバーしています。 単一のコンテナがDNSクエリを解決してキャッシュし、ヘルスチェックに応答し、メトリックを提供します。
CoreDNSは、パフォーマンスおよびセキュリティ関連の問題に対処することに加えて、その他のマイナーなバグを修正し、いくつかの新機能を追加します。
- stebDomainsと外部サービスの使用間の非互換性に関するいくつかの問題が修正されました
- 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との違いについては、 KubernetesCoreDNSGAの発表をご覧ください。
追加の構成オプション
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サービスの詳細については、サービスとポッドの公式KubernetesDNSドキュメントを参照してください。