ACK 仮想ノードは、Alibaba Cloud DNS PrivateZone に基づくサービスディスカバリをサポートしています。この機能は、Headless、ClusterIP、および内部 LoadBalancer タイプのサービスの DNS レコードを PrivateZone に同期します。このトピックでは、PrivateZone を有効にし、ECI Pod にバインドされたサービスの DNS レコードを PrivateZone に同期して、ドメイン名を使用して対応するサービスにアクセスできるようにする方法について説明します。
背景情報
Alibaba Cloud DNS PrivateZone (内部 DNS 名前解決) は、主に Alibaba Cloud VPC イントラネット環境向けの、企業イントラネットシナリオのための包括的な DNS 名前解決サービスです。VPC イントラネット環境のさまざまなクライアント (ECS インスタンスやコンテナーなど) に、名前解決と内部ドメイン名のアクセラレーションサービスを提供します。PrivateZone の使用には料金が発生します。詳細については、「課金」をご参照ください。
前提条件
クラスターに ack-virtual-node コンポーネントがインストールされていること。詳細については、「ack-virtual-node コンポーネントをデプロイする」をご参照ください。
この機能は CoreDNS と併用できません。クラスターに CoreDNS コンポーネントがインストールされていないことを確認してください。
Alibaba Cloud DNS コンソールで PrivateZone が有効化されていること。
PrivateZone の有効化
eci-profile 設定を変更して PrivateZone を有効にします。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、変更するクラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[名前空間] として [kube-system] を選択し、[eci-profile] を見つけて、[編集] をクリックします。
enablePrivateZoneの値をtrueに変更し、[OK] をクリックします。
PrivateZone が有効になっていることを確認します。
Alibaba Cloud DNS コンソールの左側のナビゲーションウィンドウで、[プライベートゾーン] をクリックします。
[カスタムドメイン名] タブの [ビルトイン認証局] タブで、[Svc.cluster.local.<cluster ID>] という名前のゾーンが生成されていることを確認します。
サービスの DNS レコードを PrivateZone に同期する
テスト用の Deployment とサービスを作成します。
次の YAML コンテンツを test-pz.yaml として保存します。
次の YAML は、1 つの Deployment と 3 つのサービスを作成します。サービスの種類は Headless、ClusterIP、LoadBalancer です。
重要デフォルトでは、サービスの DNS レコードは PrivateZone に同期されません。サービスに
service.beta.kubernetes.io/alibaba-cloud-private-zone-enable: "true"アノテーションを追加すると、仮想ノードコントローラーがサービスの DNS レコードを PrivateZone に同期します。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" # Add a specific label to schedule pods to ECI spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80Deployment とサービスを作成します。
kubectl create -f test-pz.yaml
サービスの DNS レコードが PrivateZone に同期されていることを確認します。
Alibaba Cloud DNS コンソールの左側のナビゲーションウィンドウで、[プライベートゾーン] をクリックします。
[カスタムドメイン名] タブの [ビルトイン認証局] タブで、[Svc.cluster.local.<cluster ID>] という名前のゾーンを見つけ、[解決設定] をクリックします。
[DNS レコード] タブで、サービスの DNS レコードが自動的に同期されていることを確認できます。
ゾーン内の DNS レコードのフォーマットは
<service-name>.<namespace>で、それぞれの IP 名前解決に対応します。名前解決のルールは次のとおりです。Headless Service: 複数の DNS レコードに対応し、それぞれがバックエンド Pod の IP アドレスに対応します。
ClusterIP Service: 1 つの DNS レコードに対応し、クラスター IP (クラスター内で内部通信を行うためにクラスターがサービスに割り当てた仮想 IP アドレス) に対応します。
LoadBalancer Service: 1 つの DNS レコードに対応し、クラスター IP (クラスター内で内部通信を行うためにクラスターがサービスに割り当てた仮想 IP アドレス) に対応します。

同期後、VPC 環境でプライベートドメイン名を通じてサービスにアクセスできます。
短いドメイン名でのアクセス: クラスター内では、
<service-name>を使用して同じ名前空間内のサービスにアクセスするか、<service-name>.<namespace>を使用して別の名前空間内のサービスにアクセスします。長いドメイン名でのアクセス: クラスター外では、
<service-name>.<namespace>.svc.cluster.local.<clusterId>を使用してサービスにアクセスします。これは Headless Service にのみ適用されます。