DNS 解決は、ACK Serverless クラスターにおけるサービスディスカバリーの手法の 1 つです。本トピックでは、ACK Serverless クラスターにおける DNS 解決の仕組みと、ACK Serverless クラスターがサポートする DNS ベースのサービスディスカバリーソリューションについて説明します。
本トピックの内容
注意事項
-
ACK Serverless クラスターの作成時に DNS サービスディスカバリーコンポーネントを有効にしない場合、Pod はデフォルトで Virtual Private Cloud (VPC) が提供する DNS サーバーを使用してDNS 解決を行います。このモードでは、Kubernetes のサービス名の解決はサポートされません。
-
既存のACK Serverless クラスターで DNS サービスディスカバリーソリューションを有効にした場合、影響を受けるのは新しく作成される Pod のみです。ソリューションを有効にする前に作成された Pod は、自動的に DNS 設定ファイルを切り替えません。新しいサービスディスカバリーソリューションを適用するには、これらの Pod を再作成する必要があります。
-
マネージド CoreDNS は、非マネージド CoreDNS を段階的に置き換えており、最終的に非マネージド CoreDNS は廃止される予定です。将来的には、コンソールで非マネージド CoreDNS が見つからない場合があります。非マネージド CoreDNS を使用する必要がある場合は、チケットを送信してください。
ACK Serverless クラスター:DNS 解決の仕組み
ACK Serverless クラスターで Pod を作成すると、デフォルトで /etc/resolv.conf ファイルの内容は以下のようになります。このファイルは、DNS サーバー、検索ドメイン、およびその他のパラメータを指定します。
# この Pod が使用する DNS サーバーの IP アドレス。
nameserver 172.xx.x.xx
# サービス名を解決する際に追加するドメインサフィックス。以下の例は、kube-system 名前空間内の Pod の場合です。
search kube-system.svc.cluster.local svc.cluster.local cluster.local
# その他のオプション
options ndots:5
DNS 設定ファイルと Pod の DNSPolicy フィールドの詳細については、「DNS 解決と設定」をご参照ください。
ACK Serverless クラスターがサポートする DNS サービスディスカバリーソリューション
|
ソリューション |
説明 |
|
マネージド CoreDNS |
推奨される方法です。Pod は、マネージド CoreDNS コンポーネントを使用してドメイン名を解決します。ACK Serverless が CoreDNS を作成および保守し、正常に動作することを保証します。これにより、CoreDNS の動作状態を監視したり、手動で運用保守を行ったりする必要がなくなります。また、このソリューションでは、クラスター内の ECI インスタンスを消費しません。 |
|
非マネージド CoreDNS |
Pod は、非マネージド CoreDNS コンポーネントを使用して DNS 解決を行います。CoreDNS を正しく設定し、そのレプリカの状態を継続的に監視する必要があります。 |
|
PrivateZone |
Pod は、PrivateZone コンポーネントを使用して DNS 解決を行います。ACK Serverless は、PrivateZone 内の DNS レコードを自動的に作成および更新します。 |
マネージド CoreDNS
マネージド CoreDNS コンポーネントは、kube-system 名前空間内の kube-dns Service のクラスター IP を通じて DNS サービスを公開します。クライアント Pod は、以下のようにマネージド CoreDNS を使用します。

|
ステップ |
説明 |
|
① |
クライアント Pod がアップストリームサービス (TargetService) にアクセスする際、まずローカル DNS 設定ファイル ( このソリューションでは、DNS サーバーアドレスは、ACK Serverless クラスターの kube-system 名前空間内にある kube-dns Service のクラスター IP です。ACK Serverless クラスターは、kube-dns クラスター IP のバックエンドを動的に管理するため、ユーザーが介入する必要はありません。 |
|
② |
クライアント Pod が外部ドメイン名をリクエストすると、マネージド CoreDNS は DNS クエリを VPC が提供する DNS サーバー (例:100.100.2.136 および 100.100.2.138) に転送して解決します。 |
|
③ |
クライアント Pod が DNS サーバーからアップストリームサービス (TargetService) の IP アドレスを受信した後、その IP アドレスにリクエストを送信します。 |
マネージド CoreDNS の有効化
-
マネージド CoreDNS コンポーネントを有効にすると、ACK Serverless クラスターは kube-system 名前空間に kube-dns という名前の ClusterIP Service を自動的に作成します。この Service は変更しないでください。
-
マネージド CoreDNS コンポーネントは、より多くのリージョンに段階的に展開されています。コンソールでマネージド CoreDNS コンポーネントが見つからない場合は、お使いのリージョンではまだ利用できません。マネージド CoreDNS の設定をカスタマイズする機能も段階的にリリースされています。この機能が必要な場合は、チケットを送信してサポートを依頼してください。
-
方法 1:新しいACK Serverless クラスターの場合、クラスター作成時に [サービスディスカバリー] で [CoreDNS (マネージド)] を選択して、マネージド CoreDNS コンポーネントを有効にします。
[コンポーネント設定] ステップで、[サービス検出] 設定に [CoreDNS] を選択します。
-
方法 2: 既存の ACK サーバーレスクラスター の場合、クラスター詳細ページに移動して を選択し、CoreDNS タブをクリックして CoreDNS コンポーネントを見つけ、インストール をクリックします。詳細については、「アドオンの管理」をご参照ください。
非マネージド CoreDNS
非マネージド CoreDNS は、Kubernetes クラスター内で DNS 解決を担当するコンポーネントです。カスタム内部サービスドメイン名と外部ドメイン名の両方の解決をサポートします。非マネージド CoreDNS は、カスタム DNS サーバー、カスタムホスト、CNAME レコード、リライトルールなど、クラスターレベルのカスタマイズができる豊富なプラグインセットを提供します。Kubernetes と同様に、CoreDNS プロジェクトは Cloud Native Computing Foundation (CNCF) によってホストされています。CoreDNS の詳細については、「CNCF ウェブサイト」をご参照ください。CoreDNS の詳細については、「CoreDNS: DNS and Service Discovery」をご参照ください。
非マネージド CoreDNS コンポーネントは、kube-system 名前空間内の kube-dns Service のクラスター IP を介して DNS サービスを公開します。以下の図は、クライアント Pod が非マネージド CoreDNS を使用する方法を示しています。

|
ステップ |
説明 |
|
① |
クライアント Pod がアップストリームサービス (TargetService) にアクセスする際、まずローカル DNS 設定ファイル ( このソリューションでは、DNS サーバーアドレスは、ACK Serverless クラスターの kube-system 名前空間内にある kube-dns Service のクラスター IP です。 |
|
② |
クライアント Pod が外部ドメイン名をリクエストすると、CoreDNS は DNS クエリを VPC が提供する DNS サーバー (例:100.100.2.136 および 100.100.2.138) に転送して解決します。 |
|
③ |
クライアント Pod が DNS サーバーからアップストリームサービス (TargetService) の IP アドレスを受信した後、その IP アドレスにリクエストを送信します。 |
非マネージド CoreDNS の有効化
-
方法 1:新しいACK Serverless クラスターの場合、クラスター作成時に [サービスディスカバリー] で [CoreDNS] を選択して、非マネージド CoreDNS コンポーネントを有効にします。
-
方法 2: 既存の ACK Serverless クラスター の場合、クラスターの詳細ページに移動し、 を選択します。[ネットワーク] タブをクリックし、CoreDNS コンポーネントを見つけ、インストール をクリックします。詳細については、「アドオンの管理」をご参照ください。
PrivateZone
Alibaba Cloud DNS PrivateZone は、Alibaba Cloud Virtual Private Cloud (VPC) 環境で提供されるプライベートドメイン名解決サービスです。PrivateZone コントローラーを使用して、ACK Serverless クラスターの各名前空間内の Service および Endpoint リソースをリアルタイムで監視できます。コントローラーは API サーバーと連携して、リソースのドメイン名を PrivateZone に自動的に同期します。ACK Serverless クラスター内の Pod は、PrivateZone DNS 解決サービスを使用して Kubernetes サービスディスカバリーを有効にできます。詳細については、ACK Serverless クラスターの「Alibaba Cloud DNS PrivateZone に基づくサービスディスカバリー」をご参照ください。
PrivateZone は、VPC が提供する DNS サーバー (例:100.100.2.136 および 100.100.2.138) を通じて DNS サービスを公開します。以下の図は、クライアント Pod が PrivateZone を使用する方法を示しています。

|
ステップ |
説明 |
|
① |
PrivateZone コントローラーは、API サーバーに接続してクラスター内の Service 作成および更新イベントを監視します。 |
|
② |
PrivateZone コントローラーが Service の作成または更新イベントを検出すると、この情報を PrivateZone 内の権威ゾーンの DNS レコードと同期します。 |
|
③ |
クライアント Pod がアップストリームサービス (TargetService) にアクセスする際、まずローカル DNS 設定ファイル ( このソリューションでは、DNS サーバーアドレスは VPC が提供する DNS サーバーの IP アドレス (例:100.100.2.136 および 100.100.2.138) です。DNS サーバーは、PrivateZone から正しい解決レコードを取得し、それをクライアントに返します。 |
|
④ |
クライアント Pod が DNS サーバーからアップストリームサービス (TargetService) の IP アドレスを受信した後、その IP アドレスにリクエストを送信します。 |
PrivateZone の有効化
-
方法 1:新しいACK Serverless クラスターの場合、クラスター作成時に [サービスディスカバリー] で [PrivateZone] を選択して、PrivateZone コンポーネントを有効にします。
-
方法 2:既存のACK Serverless クラスターの場合、
eci-profileConfigMap 内のenablePrivateZoneパラメータをtrueに設定することで、PrivateZone コンポーネントを有効にします。
よくある質問
マネージド CoreDNS、非マネージド CoreDNS、または PrivateZone が有効になっていることを確認する方法
-
マネージドおよび非マネージド CoreDNS
ACK コンソールにログインします。 クラスター詳細ページに移動し、を選択します。 ネットワーク タブをクリックします。 コンポーネントカードの右上に インストール済み が表示されている場合、そのコンポーネントは有効になっています。
-
PrivateZone
Alibaba Cloud DNS PrivateZone コンソールにログインします。Authoritative Zone タブで、クラスター ID を使用してゾーンを検索します。名前がクラスター ID で終わるゾーンが見つかった場合、PrivateZone コンポーネントは有効になっています。
Pod がマネージド CoreDNS、非マネージド CoreDNS、または PrivateZone コンポーネントを使用していることを確認する方法
-
マネージドおよび非マネージド CoreDNS
kubectl execコマンドを実行して Pod にアクセスし、cat /etc/resolv.confを実行します。nameserverフィールドが kube-system 名前空間内の kube-dns Service のクラスター IP アドレスを指している場合、その Pod はマネージド CoreDNS または非マネージド CoreDNS コンポーネントを使用しています。 -
PrivateZone
kubectl execコマンドを実行して Pod にアクセスし、cat /etc/resolv.confを実行します。nameserverフィールドが100.100.2.136と100.100.2.138を指している場合、その Pod は PrivateZone コンポーネントを使用しています。注:これらの IP アドレスは一例であり、実際の IP アドレスとは異なる場合があります。