マルチクラスターサービス (MCS) 機能を使用すると、ロードバランサーを作成することなく、Kubernetesクラスター間でサービスにアクセスできます。 このトピックでは、フリートインスタンスにServiceExportおよびServiceImportを作成してMCSを設定し、Kubernetesクラスター間でサービスにアクセスする方法について説明します。
前提条件
フリート管理機能が有効になっています。 詳細については、「マルチクラスター管理の有効化」をご参照ください。
2つのクラスター (サービスプロバイダークラスターとサービスコンシューマークラスター) がフリートインスタンスに関連付けられています。 詳細については、「クラスターとフリートインスタンスの関連付け」をご参照ください。
関連するクラスターのKubernetesバージョンは1.22以降です。
プロバイダーおよびコンシューマークラスターのkubeconfigファイルが取得され、kubectlを使用してクラスターに接続します。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
概要
MCS機能を使用すると、Kubernetesクラスター間でサービスにアクセスできます。 次の図は、MCS機能のアーキテクチャを示しています。

管理者は、名前空間、デプロイメント、サービスなどのアプリケーションリソースをサービスプロバイダークラスター (ACKクラスター1) およびサービスコンシューマークラスター (ACKクラスター2) にデプロイしました。 管理者は、ServiceExportおよびServiceImportを含むMCSリソースも作成しました。
フリートインスタンスは、関連するACKクラスターのServiceExportとServiceImportをリッスンし、MCSエンドポイント情報を同期します。
ACKクラスター2のクライアントポッドは、ACKクラスター1のサービス1にアクセスできます。
手順1: サービスプロバイダーのリソースを作成する
サービスプロバイダーが存在するACKクラスター1にKubernetesサービスとリソースが既にデプロイされている場合は、この手順をスキップします。
ACKクラスター1で次のコマンドを実行して、サービスプロバイダーの名前空間を作成します。
この例では、
provider-ns名前空間が作成されます。kubectl create ns provider-nsACKクラスター1にKubernetesサービスとサービスプロバイダーのデプロイを作成します。
app-meta.yamlという名前のファイルを作成し、次の内容をファイルに追加します。apiVersion: v1 # The Service provider. kind: Service metadata: name: service1 namespace: provider-ns spec: ports: - name: http port: 80 protocol: TCP targetPort: 8080 selector: app: web-demo sessionAffinity: None type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: web-demo name: web-demo namespace: provider-ns spec: replicas: 2 selector: matchLabels: app: web-demo template: metadata: labels: app: web-demo spec: containers: - image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/web-demo:0.4.0 name: web-demo env: - name: ENV_NAME value: cluster1-beijing次のコマンドを実行して、ACKクラスター1にリソースを作成します。
kubectl apply -f app-meta.yaml次のコマンドを実行して、ACKクラスター1にServiceExportを作成し、マルチクラスターサービスを介してエクスポートするサービスを指定します。
apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceExport metadata: name: service1 # The value must be the same as the name of the Service that you want to export. namespace: provider-ns # The value must be the same as the namespace of the Service that you want to export.下表に、各パラメーターを説明します。
パラメーター
説明
metadata.name
エクスポートするサービスの名前。
metadata.nameスペース
エクスポートするサービスの名前空間。
手順2: Service consumerクラスターの設定
ACKクラスター2で次のコマンドを実行して、Serviceコンシューマーの名前空間を作成します。
この例では、
provider-ns名前空間が作成されます。kubectl create ns provider-nsファイルを作成し、次のコンテンツをファイルに追加して、ACKクラスター2にServiceImportを作成します。
apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceImport metadata: name: service1 namespace: provider-ns spec: ports: # The values in this field must be the same as the ports used by the Service that you want to export. - name: http port: 80 protocol: TCP type: ClusterSetIPServiceImportの
specセクションには、部分的なパラメーターのみが表示されます。 次の表に、specセクションのすべてのパラメーターを示します。パラメーター
説明
metadata.name
サービス名。 名前は、エクスポートするサービスの名前と同じである必要があります。
metadata.nameスペース
サービスの名前空間。 名前空間は、エクスポートするサービスの名前空間と同じである必要があります。
仕様。 ports. 名前
ポートの名前。 値は、エクスポートするサービスの値と同じである必要があります。
仕様。 ports. プロトコル
プロトコル。 値は、エクスポートするサービスの値と同じである必要があります。
仕様。 ports. appProtocol
アプリケーションプロトコル。 値は、エクスポートするサービスの値と同じである必要があります。
仕様。 ports. ポート
ポートを転送します。 値は、エクスポートするサービスの値と同じである必要があります。
仕様。 ips
サービスの仮想IPアドレス。 このパラメーターはフリートインスタンスによって指定されます。 このパラメーターは無視できます。
仕様。 タイプ
有効な値:
ClusterSetIPおよびHeadless。サービスの
ClusterIPパラメーターがNoneに設定されている場合、サービスはヘッドレスサービスです。 このシナリオでは、typeをHeadlessに設定します。他のシナリオでは、
typeをClusterSetIPに設定します。仕様。 sessionAffinity
セッションのアフィニティ。 有効な値:
ClientIPおよびNone。 値は、エクスポートするサービスの値と同じである必要があります。仕様。 sessionAffinityConfig
セッションアフィニティ設定。 値は、エクスポートするサービスの値と同じである必要があります。
手順3: クラスター間のサービスへのアクセス
ACKクラスター2のクライアントポッドは、次のいずれかの方法を使用して、ACKクラスター1のサービス1にアクセスできます。
方法1: サービスの名前を使用する
ACKクラスター2でServiceImportを作成した後、フリートインスタンスは、amcs- in ACKクラスター2のプレフィックスが付いたマルチクラスターサービスを作成します。
ACKクラスター2のクライアントポッドは、amcs-service1.provider-nsを使用してACKクラスター1のサービス1にアクセスできます。
ACKクラスター2で次のコマンドを実行して、サービス情報を照会します。
kubectl get service -n provider-ns期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE amcs-service1 ClusterIP 172.xx.xx.xx <none> 80/TCP 26mACKクラスター2のクライアントポッドで次のコマンドを実行し、ACKクラスター1のサービス1にアクセスします。
curl amcs-service1.provider-ns
方法2: サービスのドメイン名を使用する
CoreDNSをACK Cluster 2にインストールまたは更新します。 CoreDNSのバージョンは1.9.3以降である必要があります。 詳細については、「CoreDNS」および「コンポーネントの管理」をご参照ください。
CoreDNSのCorefile設定を変更します。
次のコマンドを実行して、CoreDNSのConfigMapを変更します。
kubectl edit configmap coredns -n kube-system[Corefile] フィールドに
multicluster clusterset.localを追加して、マルチクラスターサービスのドメイン名解決を有効にします。apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready multicluster clusterset.local # Add this configuration to enable domain name resolution for multi-cluster Services. kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified ttl 30 fallthrough in-addr.arpa ip6.arpa } ... } kind: ConfigMap metadata: name: coredns namespace: kube-system
ACKクラスター2のクライアントポッドで次のコマンドを実行し、ACKクラスター1のサービス1にアクセスします。
curl service1.provider-ns.svc.clusterset.local(オプション) ACK Cluster 2のクライアントポッドの
dnsConfig.searchesフィールドを変更して、マルチクラスタサービスにアクセスします。追加
clusterset.localにdnsConfig.searchesクライアントポッドのフィールド。apiVersion: apps/v1 kind: Deployment metadata: name: client-pod namespace: consumer-ns spec: ... template: ... spec: dnsPolicy: "ClusterFirst" dnsConfig: searches: #dnsConfig. Add clusterset.local. - svc.clusterset.local - clusterset.local - consumer-ns.svc.cluster.local - svc.cluster.local - cluster.local containers: - name: client-pod ...次のコマンドを実行して、マルチクラスターサービスにアクセスします。
curl service1.provider-ns
関連ドキュメント
コンソールでMCSを設定することもできます。 詳細については、「ACK OneコンソールでのMCSの使用」をご参照ください。