Kubernetes、またはK8sとしても知られる、オープンソースのオーケストレーションシステムで、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのものです。そのポータビリティ、柔軟性、自動スケーリング機能により、広く使用されているシステムとなっています。数ある優れた機能の中でも、サービスやPod用のDNSレコードを作成できるオプションは、他のソフトウェアシステムに対して圧倒的な優位性を持っています。Kubernetes DNSサービスを使用すると、IPアドレスの代わりに一貫したDNS名でサービスにアクセスできます。
前提条件
チュートリアルを最大限に活用し、Kubernetes DNSサービスをよりよく理解するために、事前に以下のKubernetesの基本をおさらいしておいてください。また、DNSの概念をより深く理解するために、DNSの用語、コンポーネント、および概念の概要を読むことも役立ちます。さらに、Dockerエコシステムの概要とコンテナ化技術の基本を理解していると、非常に有利になります。
DNSシステムとは?
Domain Name System(DNS)は、IPアドレスなどの様々な情報と、覚えやすい名前を紐付けるための仕組みです。DNSシステムを使用してリクエスト名をIPアドレスに変換することで、エンドユーザーは目的のドメイン名に簡単にアクセスできるようになります。ほとんどのKubernetesクラスターには、サービス検出(サービスディスカバリ)のための軽量なアプローチを提供するために、デフォルトで構成された内部DNSサービスが含まれています。Podやサービスが作成、削除、またはノード間で移動された場合でも、組み込みのサービス検出により、アプリケーションがKubernetesクラスターを特定して通信することが容易になります。
最近のKubernetesのバージョンでは、Kubernetes DNSサービスの技術的な仕様が変更されました。このチュートリアルでは、Kubernetes DNSサービスのkube-dnsとCoreDNSの両方の実装について紹介します。KubernetesのDNSレコードについて詳しく理解し、Kubernetes DNSがどのように機能するかを実演します。
Kubernetes DNSサービスには何が含まれていますか?
以前は、バージョン1.11のリリース前まで、Kubernetes DNSサービスはkube-dnsに基づいていました。しかし、セキュリティとプライバシーは依然として深刻な懸念事項でした。その後、Kubernetesコミュニティは、kube-dnsのセキュリティと安定性の問題に対処するため、新しいバージョン1.11でCoreDNSを導入しました。
DNSレコードの処理にどのソフトウェアバージョンを使用しているかに関わらず、kube-dnsとCoreDNSは同様に機能します。
- 1つの kube-dns サービスと1つ以上のPodが作成されます。
- この kube-dns サービスは、サービスおよびエンドポイントのイベントについてKubernetes APIを監視し、必要に応じてDNSエントリを変更します。作成、編集、または削除の操作によってこれらのKubernetesサービスとそれに関連するPodを変更すると、これらのイベントが自動的にトリガーされます。
- Kubeletは、 kube-dns サービスのクラスターIPを、すべての新しいPodの etc/resolv.conf nameserver オプションに、短いホスト名を可能にする適切な search 設定とともに割り当てます。
|
1 2 3 |
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レコードについてより深く理解しましょう。Kubernetesサービスの完全なDNS Aレコードは次のようになります。
service.namespace.svc.cluster.local
Podは、Podの実際のIPアドレスを表す次の形式のレコードを持ちます。
10.32.0.125.namespace.pod.cluster.local
さらに、 SRV レコードが、Kubernetesサービスの指定されたポートに対して作成されます。
|
1 |
_port-name._protocol.service.namespace.svc.cluster.local |
その結果、組み込みのDNSベースのサービス検出メカニズムのおかげで、アプリケーションやマイクロサービスは、シンプルで一貫したホスト名にアクセスするだけで、クラスター上の他のサービスやPodに到達できます。
短いホスト名の解決とドメインの検索
別のサービスにアクセスするために、常に完全なホスト名を使用する必要はありません。これは、 resolv.conf ファイルに検索ドメインサフィックスが設定されているためです。同じネームスペース内のサービスに接続する場合は、単にその名前で呼び出すことができます:
|
1 |
other-service |
サービスが異なるネームスペースにある場合は、クエリに other-service を追加します:
|
1 |
other-service.other-namespace |
ポッドにアクセスする場合は、少なくとも以下を使用する必要があります:
|
1 |
pod-ip.other-namespace.pod |
デフォルトの .svcサフィックスのみが、 resolv.confファイルで自動的に補完されます。したがって、 .podまで設定を指定することが不可欠です。次に、これまでに学んだ2つの代替Kubernetes DNS実装の複雑な詳細について説明します。
Kubernetes DNSの実装
Kubernetesバージョン1.11では、 kube-dns サービスを管理するための新しいソフトウェアが提供されました。これについては、前のセクションで説明されています。この新しいアップデートの主な理由は、サービスのパフォーマンスとセキュリティを向上させることでした。まずは、最初から kube-dns の統合について見ていきましょう。
-
kube-dns
以前のKubernetes 1.11バージョンでは、 kube-dnsサービスは、 kube-dnsポッド内の kube-system ネームスペースで動作する3つのコンテナを持っていました。以下の3つのコンテナをご覧ください:
- kube-dns: SkyDNSを実行し、DNSクエリ解決サービスとして機能するコンテナ。
- dnsmasq:SkyDNSの応答は、一般的な軽量DNSリゾルバーおよびキャッシュであるdnsmasqによってキャッシュされます。
- sidecar:メトリクスのレポートを実行し、ヘルスチェックに対応する、サービスの傍らで動作するコンテナ。
CoreDNSは、Dnsmasqのセキュリティ脆弱性とSkyDNSのスケーラビリティパフォーマンスに関する懸念の結果として作成されました。
-
CoreDNS
新しいKubernetes DNSサービスとして、CoreDNSはKubernetes 1.11で一般利用可能(General Availability)にアップグレードされました。これは、本番環境に対応しており、多くのインストールツールやマネージドKubernetesプロバイダーによってデフォルトのクラスターDNSサービスとして使用されることを意味します。
CoreDNS は、Kubernetes DNSクラスターとして機能する、柔軟で拡張可能なDNSサーバーです。以前のシステムのすべての機能を実行します。DNSコンテナは、DNSクエリの解決とキャッシュを担当します。CoreDNSは、単一のコンテナでヘルスチェックに対応し、メトリクスを提供します。さらに、いくつかの軽微な欠陥に対処し、パフォーマンスとセキュリティの問題を解決するための新しい機能を提供します:
- stubDomainsの使用と外部サービスとの間のいくつかの競合が解決されました。
- 一部のエントリが返される順序をランダムにすることで、CoreDNSはDNSベースのラウンドロビン負荷分散を向上させることができます。.
- By being better about iterating over each of the search domain suffixes defined in resolv.confで定義されている各検索ドメインサフィックスの反復処理を改善することにより、 autopath と呼ばれる機能は、外部ホスト名を解決する際のDNS応答時間を短縮できます。
- ポッドが存在しない場合でも、kube-dnsの 10.32.0.125.namespace.pod.cluster.localは常に解決されます。 10.32.0.125。CoreDNSは、正しいIPアドレスとネームスペースを持つポッドが存在する場合にのみ解決する、ポッド検証済みモードを提供します。
Kubernetesの endpoints, autopaths、および wildcardsに関する知識を深めるには、どのようにKubernetesがクラスターからゾーンデータを読み取ることを可能にするかに関するチュートリアルを確認してください。
カスタマイズ機能
Kubernetesの customizing DNS serviceのおかげで、DNSポッドを構成し、クラスターのDNS解決をカスタマイズできます。管理者はこれらのサービスを利用して、 resolv.confで定義されているアップストリームのネームサーバーや検索ドメインサフィックスを変更できます。何よりも、 dnsConfig オプションを使用してポッドやコンテナをパーソナライズするアドオン機能があります:

この構成を更新すると、ポッドの resolv.confが強制的に書き換えられ、変更が有効になります。上記のセットアップにより、 nameserver 203.0.113.44および search custom.dns.local行を含むファイルが作成され、これが通常の resolv.conf オプションに直接転送されます。
結論
このチュートリアルでは、Kubernetes DNSサービスの基本と、異なるバージョンにおけるその実装方法について説明しました。また、例を用いてKubernetes DNSレコードについても解説しました。さらに、ポッドのカスタマイズやDNSクエリの解決のための追加の設定オプションについてもいくつか紹介しました。これでKubernetes DNSサービスの基本はカバーできましたが、学習はここで終わりではありません。以下のKubernetesの公式ドキュメントを参照して、このトピックについてさらに詳しく学んでください。
DevOpsの知識をさらに深め、Kubernetesの基本を深く学ぶには、以下の当社ブログのチュートリアルをご覧ください。:
- Helm入門:Kubernetes用パッケージマネージャー
- Ubuntu 20.04にKubernetesをインストールして使用する方法
- Ubuntu 18.04でKubernetesクラスターにPHPアプリケーションをデプロイする方法
快適なコンピューティングを!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。