Kubernetes cluster DNS service discovery principle

クラスター DNS サービス

Kubernetes クラスターには DNS サービスがデプロイされており、この DNS サービスは kube-dns のサービス名を通じて公開されています。以下のコマンドを実行して、kube-dns のサービス詳細を確認できます。

kubectl get svc kube-dns -n kube-system

出力:

サービスのバックエンドは、coredns という名前の 2 つの Pod です(CoreDNS による名前解決の原理については後述します)。以下のコマンドを実行して、coredns の Pod 詳細を確認できます。

kubectl get deployment coredns -n kube-system

出力:

クラスター内ドメイン名解決の原理

Kubernetes クラスターのノード上の kubelet には、DNS に関連する 2 つのパラメーター --cluster-dns=${dns-service-ip} と --cluster-domain=${default-local-domain} があり、それぞれクラスター DNS サーバーの IP アドレスとプライマリドメイン名サフィックスを設定するために使用されます。

クラスターのデフォルト名前空間で、dnsPolicy:ClusterFirst モード(dnsPolicy については後述します)の Pod 内の DNS ドメイン名解決設定ファイル /etc/resolv.conf の内容を確認します。

パラメーターの説明は以下の通りです。

nameserver: DNS サーバーの IP アドレスを定義します。

search: ドメイン名の検索サフィックスルールを設定します。search 設定が多いほど、ドメイン名解決の検索一致回数が増えます。クラスター用のサフィックスは default.svc.cluster.local、svc.cluster.local、cluster.local の 3 つあり、正しい解決結果を取得するために最大 8 回のクエリ(IPv4 と IPv6 それぞれ 4 回ずつ)を使用できます。

option: ドメイン名解決設定ファイルのオプションを定義し、複数の KV 値をサポートします。たとえば、このパラメーターが ndots:5 に設定されている場合、アクセスされたドメイン名文字列のドット文字数が ndots 値を超える場合は完全なドメイン名とみなされ、直接解決されます。ndots 値未満の場合は、検索セグメントのサフィックスが追加されてからクエリが実行されます。

上記のファイル設定に基づいて、Pod 内で解決を試みます。

同じ名前空間内のサービス(kubernetes など): 検索ドメインを 1 回追加し、kubernetes.default.svc.cluster.local を送信して、172.24.0.10 への IPv4 ドメイン名解決リクエストを送信します。

異なる名前空間間のサービス(kube-dns.kue-system など): 検索ドメインを 2 回追加し、kube-dns.kue-system.default.svc.cluster.local と kube-dns.kue-system.svc.cluster.local の 2 つの IPv4 ドメイン名解決リクエストを 172.24.0.10 に送信して、正しい結果を解決できます。

クラスター外のサービス(aliyun.com など): 検索ドメインを 3 回追加し、aliyun.com.default.svc.cluster.local、aliyun.com.svc.cluster.local、aliyun.com.cluster.local、および aliyun.com の 4 回の IPv4 ドメイン名解決リクエストを 172.24.0.10 に送信して、正しい結果を解決できます。

Pod の dnsPolicy

Kubernetes クラスターは、dnsPolicy フィールドを通じて各 Pod に異なる DNS ポリシーを設定することをサポートしています。現在、4 つのポリシーがサポートされています。

ClusterFirst: クラスター DNS サービスを通じてドメイン名解決を行います。Pod 内の /etc/resolv.conf に設定された DNS サービスアドレスは、クラスター DNS サービスの kube-dns アドレスです。このポリシーは、クラスターワークロードのデフォルトです。

None: クラスター DNS ポリシーを無視し、dnsConfig フィールドを提供して DNS 設定情報を指定する必要があります。

Default: Pod はクラスターノードのドメイン名解決設定を直接継承します。つまり、クラスター内でノードの /etc/resolv.conf ファイルが直接使用されます。

ClusterFirstWithHostNetwork: hostNetWork ネットワークモードで ClusterFirst ポリシーを強制的に使用します(デフォルトでは Default ポリシーが使用されます)。

CoreDNS
CoreDNS は現在、Kubernetes の標準的なサービスディスカバリコンポーネントです。dnsPolicy: ClusterFirst モードの Pod は、CoreDNS を使用してクラスター内外のドメイン名を解決します。

クラスターには、kube-system 名前空間下に coredns という名前の ConfigMap があります。その Corefile フィールドのファイル設定内容は以下の通りです(Corefile 内のプラグインを通じて CoreDNS 機能が提供されます)。

Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus:9153
forward ./etc/resolv.conf
cache 30
loop
reload
load balance
}
各プラグインの説明は以下の通りです。

errors: 標準出力へのエラーメッセージ。

health: CoreDNS 自体のヘルスステータスレポート。デフォルトのリッスンポートは 8080 で、一般的にヘルスチェックに使用されます。http://localhost:8080/health からヘルスステータスを取得できます。

ready: CoreDNS プラグインのステータスレポート。デフォルトのリッスンポートは 8181 で、一般的に準備状態のチェックに使用されます。http://localhost:8181/ready から準備状態を取得できます。すべてのプラグインが実行中の場合、準備状態は 200 です。

kubernetes: CoreDNS の Kubernetes プラグインで、クラスター内のサービス解決機能を提供します。

prometheus: CoreDNS 自体のメトリクスデータインターフェイス。http://localhost:9153/metrics から Prometheus 形式のモニタリングデータを取得できます。

forward(または proxy): ドメイン名クエリリクエストを事前定義された DNS サーバーに転送します。デフォルト設定では、ドメイン名が Kubernetes ドメイン内にない場合、リクエストは事前定義されたリゾルバー(/etc/resolv.conf)に転送されます。デフォルトでは、ホストの /etc/resolv.conf 設定が使用されます。

cache: DNS キャッシュ。

loop: ループ検出。ループが検出された場合、CoreDNS を停止します。

reload: 変更された Corefile の自動再読み込みを許可します。ConfigMap 設定を編集した後、変更が反映されるまで 2 分待機してください。

loadbalance: A、AAAA、MX レコードの順序をランダム化できるラウンドロビン DNS ロードバランサー。

Related Articles

Explore More Special Offers

  1. Short Message Service(SMS) & Mail Service

    50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00

phone お問い合わせ
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.