マルチクラスター サービス (MCS) を使用すると、ある ACK クラスター内の Pod がロードバランサーを作成せずに、別のクラスターで実行中のサービスにアクセスできます。サービス提供者クラスターでは、ServiceExport リソースを使用してサービスをエクスポートし、Fleet インスタンスが自動的にそのエンドポイント情報をサービス利用者クラスターに同期します。その後、サービス利用者クラスターで ServiceImport を作成することで、エクスポートされたサービスを利用可能にします。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
フリート管理が有効であること。詳細については、「マルチクラスター管理を有効化する」をご参照ください。
Fleet インスタンスに関連付けられた 2 つのクラスター: サービスプロバイダークラスター (ACK クラスター 1) とサービス利用者クラスター (ACK クラスター 2)。 「Fleet インスタンスにクラスターを関連付ける」をご参照ください。
両方のクラスターで Kubernetes 1.22 以降が実行されていること。
両方のクラスターの kubeconfig ファイルがあり、kubectl が各クラスターに接続するように設定されていること。 詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
仕組み

管理者がサービス提供者クラスター (ACK クラスター 1) およびサービス利用者クラスター (ACK クラスター 2) に名前空間、Deployment、サービスをデプロイし、ServiceExport および ServiceImport を含む MCS リソースを作成します。
Fleet インスタンスが関連付けられた ACK クラスター内の ServiceExport および ServiceImport を監視し、MCS のエンドポイント情報を同期します。
ACK クラスター 2 内の Pod が ACK クラスター 1 内のサービス 1 にアクセスできます。
ステップ 1:サービス提供者クラスターのセットアップ
サービスおよびそのリソースが既に ACK クラスター 1 に存在する場合は、このステップはスキップしてください。
ACK クラスター 1 に名前空間を作成します。
kubectl create ns provider-ns以下の内容で
app-meta.yamlというファイルを作成します。apiVersion: v1 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以下の内容で
service-export.yamlというファイルを作成します。apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceExport metadata: name: service1 # エクスポート対象のサービス名と一致させる必要があります。 namespace: provider-ns # エクスポート対象のサービスの名前空間と一致させる必要があります。ACK クラスター 1 で ServiceExport を適用します。
kubectl apply -f service-export.yaml
ステップ 2:サービス利用者クラスターのセットアップ
ACK クラスター 2 にも同じ名前空間を作成します。
kubectl create ns provider-ns以下の内容で
service-import.yamlというファイルを作成します。apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceImport metadata: name: service1 # エクスポート済みのサービス名と一致させる必要があります。 namespace: provider-ns # エクスポート済みのサービスの名前空間と一致させる必要があります。 spec: ports: - name: http port: 80 protocol: TCP type: ClusterSetIPspecパラメーターの説明は、以下の表をご参照ください。パラメーター 説明 metadata.nameサービス名。エクスポート済みのサービス名と一致させる必要があります。 metadata.namespace名前空間。エクスポート済みのサービスの名前空間と一致させる必要があります。 spec.ports.nameポート名。エクスポート済みのサービスと一致させる必要があります。 spec.ports.protocolプロトコル。エクスポート済みのサービスと一致させる必要があります。 spec.ports.appProtocolアプリケーション プロトコル。エクスポート済みのサービスと一致させる必要があります。 spec.ports.portポート番号。エクスポート済みのサービスと一致させる必要があります。 spec.ips仮想 IP アドレス。Fleet インスタンスによって設定されます — このフィールドは空欄のままにしてください。 spec.type有効な値: ClusterSetIPおよびHeadless。ClusterIP: Noneを指定したソース サービスの場合はHeadlessを使用します。それ以外の場合はClusterSetIPを使用します。spec.sessionAffinityセッション アフィニティ。有効な値: ClientIPおよびNone。エクスポート済みのサービスと一致させる必要があります。spec.sessionAffinityConfigセッション アフィニティ構成。エクスポート済みのサービスと一致させる必要があります。 ACK クラスター 2 で ServiceImport を適用します。
kubectl apply -f service-import.yaml
ステップ 3:他クラスター間でのサービスへのアクセス
ServiceImport が作成されると、Fleet インスタンスが自動的に ACK クラスター 2 に amcs- プレフィックス付きのマルチクラスター サービスを作成します。サービス 1 には、サービス名またはドメイン名のいずれかを使用してアクセスできます。
方法 1:サービス名を使用
ACK クラスター 2 のサービス一覧を照会し、
amcs-service1サービスが作成されたことを確認します。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 内の Pod から、以下のコマンドを実行します。
curl amcs-service1.provider-ns
方法 2:ドメイン名を使用
ACK クラスター 2 で CoreDNS をインストールまたは更新します。CoreDNS のバージョンは 1.9.3 以降である必要があります。詳細については、「CoreDNS」および「コンポーネントの管理」をご参照ください。
ACK クラスター 2 で CoreDNS の ConfigMap を編集モードで開きます。
kubectl edit configmap coredns -n kube-systemCorefileフィールドに、マルチクラスター サービスのドメイン名解決を有効化するためにmulticluster clusterset.localを追加します。apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready multicluster clusterset.local # この行を追加します。 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-systemACK クラスター 2 内の Pod から、以下のコマンドを実行します。
curl service1.provider-ns.svc.clusterset.local(任意)より短い URL を使用するには、クライアント Pod の
clusterset.localをdnsConfig.searchesフィールドに追加します。apiVersion: apps/v1 kind: Deployment metadata: name: client-pod namespace: consumer-ns spec: ... template: ... spec: dnsPolicy: "ClusterFirst" dnsConfig: searches: - svc.clusterset.local - clusterset.local - consumer-ns.svc.cluster.local - svc.cluster.local - cluster.local containers: - name: client-pod ...この構成を適用後、以下の短縮形式を使用できます。
curl service1.provider-ns
次のステップ
ACK One コンソールでも MCS を設定できます。詳細については、「ACK One コンソールで MCS を使用する」をご参照ください。