前書き
ドメインネームシステム(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.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サービスの完全な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を参照してください。