Container Service for Kubernetes (ACK) の仮想ノードは、Alibaba Cloud DNS PrivateZone を使用したサービス検出をサポートしています。この機能は、Headless、ClusterIP、および内部 LoadBalancer Service の DNS レコードを PrivateZone に同期します。このトピックでは、PrivateZone を有効にして ECI Pod に関連付けられた Service の DNS レコードを同期し、ドメイン名でアクセスできるようにする方法について説明します。
背景情報
Alibaba Cloud DNS PrivateZone (内部 DNS 名前解決) は、Alibaba Cloud Virtual Private Cloud (VPC) などのプライベートネットワーク向けに設計された DNS サービスです。VPC 内のクライアント (ECS インスタンスやコンテナなど) がプライベートドメイン名を解決し、解決プロセスを高速化できます。PrivateZone は有料サービスです。詳細については、製品の課金をご参照ください。
前提条件
-
ack-virtual-node コンポーネントがクラスターにインストールされていること。詳細については、ack-virtual-node コンポーネントのデプロイをご参照ください。
-
この機能は CoreDNS と互換性がありません。CoreDNS コンポーネントがクラスターにインストールされていないことを確認してください。
-
Alibaba Cloud DNS コンソールで Alibaba Cloud DNS PrivateZone を有効化済みであること。
PrivateZone の有効化
-
eci-profile ConfigMap を変更して PrivateZone を有効にします。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
名前空間 ドロップダウンリストから kube-system を選択します。eci-profile ConfigMap を見つけ、[操作] 列の 編集 をクリックします。
-
enablePrivateZoneの値をtrueに変更し、OK をクリックします。
-
PrivateZone が有効になっていることを確認します。
-
Alibaba Cloud DNS コンソールの左側のナビゲーションウィンドウで、イントラネットドメイン名の解決 をクリックします。
-
組み込みの権限 タブで、User Defined Zones タブを選択します。svc.cluster.local.<cluster-id> という名前のゾーンが作成されていることを確認します。
-
Service の DNS レコードの PrivateZone への同期
-
テスト用の Deployment と Service を作成します。
-
次の YAML コンテンツを test-pz.yaml として保存します。
このマニフェストは、1 つの Deployment と、Headless、ClusterIP、内部 LoadBalancer の 3 種類の Service を作成します。
重要デフォルトでは、Service の DNS レコードは同期されません。特定の Service の同期を有効にするには、そのマニフェストに
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 this label to schedule the Pod on ECI. spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 -
Deployment と Service を作成します。
kubectl create -f test-pz.yaml
-
-
Service の DNS レコードが PrivateZone に同期されていることを確認します。
-
Alibaba Cloud DNS コンソールの左側のナビゲーションウィンドウで、イントラネットドメイン名の解決 をクリックします。
-
組み込みの権限 タブで、User Defined Zones タブを選択します。svc.cluster.local.<cluster-id> という名前のゾーンを見つけ、[操作] 列の 解決設定 をクリックします。
-
Settings タブで、Service の DNS レコードが自動的に同期されていることを確認します。
ゾーン内の DNS レコードは
<service-name>.<namespace>というフォーマットを使用し、対応する IP アドレスに解決されます。解決ルールは次のとおりです。-
Headless Service: 複数の DNS レコードに対応し、各バックエンド Pod の IP アドレスごとに 1 つのレコードが作成されます。
-
ClusterIP Service: クラスター IP に解決される単一の DNS レコードに対応します。クラスターは、内部通信のためにこの仮想 IP アドレスを Service に割り当てます。
-
内部 LoadBalancer Service: 内部 Server Load Balancer (SLB) インスタンスの IP アドレスに解決される単一の DNS レコードに対応します。
レコードが同期されると、VPC 内からプライベートドメイン名を使用して Service にアクセスできます。
-
短縮ドメイン名でのアクセス: クラスター内では、同じ名前空間内の Service には
<service-name>を使用してアクセスでき、異なる名前空間の Service には<service-name>.<namespace>を使用してアクセスできます。 -
完全修飾ドメイン名 (FQDN) でのアクセス: クラスター外で同じ VPC 内からは、
<service-name>.<namespace>.svc.cluster.local.<cluster-id>を使用して Service にアクセスできます。この方法は Headless Service にのみ適用されます。
-
-