ACK 仮想ノードは、Alibaba Cloud DNS PrivateZone を介したサービス検出をサポートしています。Service にアノテーションを追加すると、仮想ノードコントローラーが自動的にその DNS レコードを PrivateZone に同期します。これにより、Virtual Private Cloud (VPC) 内の Pod やその他のクライアントが、ドメイン名で Elastic Container Instance (ECI) をバックエンドとする Service にアクセスできるようになります。
対応する Service の種類:ヘッドレス、ClusterIP、および内部 LoadBalancer。
PrivateZone の利用には料金がかかります。料金の詳細については、「課金」をご参照ください。
仕組み
PrivateZone は、VPC 環境向けの非公開 DNS 解決サービスです。ECS インスタンスや VPC 内で実行されるコンテナなど、さまざまなクライアントに対して、ドメイン名の名前解決および内部ドメイン名の高速化サービスを提供します。
仮想ノードクラスターで PrivateZone を有効化すると、仮想ノードコントローラーは svc.cluster.local.<clusterID> という名前の非公開 DNS ゾーンを作成し、アノテーション付きの Service の DNS レコードをこのゾーンに同期します。DNS レコードの形式は <service-name>.<namespace> です。
| Service の種類 | 同期される DNS レコード | 解決先 |
|---|---|---|
| ヘッドレス | バックエンドの各 Pod ごとに 1 件のレコード | Pod の IP アドレス |
| ClusterIP | 1 件のレコード | Cluster IP(クラスター内通信用の仮想 IP) |
| 内部 LoadBalancer | 1 件のレコード | Cluster IP(クラスター内通信用の仮想 IP) |
同期後、Service は VPC 内でドメイン名によるアクセスが可能になります:
| アクセス範囲 | ドメイン名の形式 | 適用対象 |
|---|---|---|
| クラスター内、同一名前空間 | <service-name> | すべての Service の種類 |
| クラスター内、異なる名前空間 | <service-name>.<namespace> | すべての Service の種類 |
| クラスター外(FQDN) | <service-name>.<namespace>.svc.cluster.local.<clusterID> | ヘッドレス Service のみ |
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
ack-virtual-node コンポーネントがインストール済みであること。詳細については、「ack-virtual-node コンポーネントのデプロイ」をご参照ください。
クラスター内に CoreDNS がインストールされていないこと。本機能は CoreDNS と併用できません。クラスター内に CoreDNS コンポーネントが存在しないことを確認してください。
Alibaba Cloud DNS コンソールで PrivateZone が有効化されていること。
PrivateZone の有効化
「ACK コンソール」にログインし、左側のナビゲーションウィンドウで [クラスター] をクリックします。
クラスターの名前をクリックします。左側のナビゲーションウィンドウで、[設定] > [ConfigMap] を選択します。
[名前空間] を kube-system に設定し、eci-profile を探し、[編集] をクリックします。
enablePrivateZoneをtrueに設定し、次に [OK] をクリックします。ゾーンが正しく作成されたことを確認します。
「Alibaba Cloud DNS コンソール」で、左側のナビゲーションウィンドウの [プライベートゾーン] をクリックします。
[権威ゾーン] タブで、[ユーザー定義ゾーン] に移動し、`svc.cluster.local.<cluster ID>` という名前のゾーンが表示されることを確認します。
Service の DNS レコードを PrivateZone へ同期
DNS レコードはデフォルトで PrivateZone へ同期されません。Service に対して同期を有効化するには、以下のアノテーションを追加します。
service.beta.kubernetes.io/alibaba-cloud-private-zone-enable: "true"以下の例では、1 つの Deployment と 3 つの Service(各対応種類 1 つずつ)を作成し、すべてに上記アノテーションを付与します。
以下の内容を
test-pz.yamlとして保存します。apiVersion: v1 kind: Service metadata: name: nginx-headless-service annotations: service.beta.kubernetes.io/alibaba-cloud-private-zone-enable: "true" spec: ports: - port: 80 protocol: TCP selector: app: nginx clusterIP: None --- apiVersion: v1 kind: Service metadata: name: nginx-clusterip-service annotations: service.beta.kubernetes.io/alibaba-cloud-private-zone-enable: "true" spec: ports: - port: 80 protocol: TCP selector: app: nginx type: ClusterIP --- apiVersion: v1 kind: Service metadata: name: nginx-intranet-service annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet" service.beta.kubernetes.io/alibaba-cloud-private-zone-enable: "true" spec: ports: - port: 80 protocol: TCP selector: app: nginx type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx alibabacloud.com/eci: "true" # Pod を ECI にスケジュール spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80マニフェストを適用します。
kubectl create -f test-pz.yamlDNS レコードが正しく同期されたことを確認します。
Alibaba Cloud DNS コンソールで、[非公開ゾーン] をクリックします。
「ユーザー定義ゾーン」の下で、[権威ゾーン] タブで、「`svc.cluster.local.<クラスターID>`」という名前のゾーンを見つけ、[設定項目] をクリックします。
[設定] タブで、各サービスに 1 つずつ、合計 3 つの DNS レコードが
<service-name>.defaultのフォーマットで表示されていることを確認します:
nginx-headless-service.default— 各 Pod の IP アドレスごとに複数の A レコードnginx-clusterip-service.default— Cluster IP を指す 1 件の A レコードnginx-intranet-service.default— Cluster IP を指す 1 件の A レコード