すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:CLIを使用してMCSを設定する

最終更新日:Nov 14, 2024

マルチクラスターサービス (MCS) 機能を使用すると、ロードバランサーを作成することなく、Kubernetesクラスター間でサービスにアクセスできます。 このトピックでは、フリートインスタンスにServiceExportおよびServiceImportを作成してMCSを設定し、Kubernetesクラスター間でサービスにアクセスする方法について説明します。

前提条件

概要

MCS機能を使用すると、Kubernetesクラスター間でサービスにアクセスできます。 次の図は、MCS機能のアーキテクチャを示しています。

多集群服务

  1. 管理者は、名前空間、デプロイメント、サービスなどのアプリケーションリソースをサービスプロバイダークラスター (ACKクラスター1) およびサービスコンシューマークラスター (ACKクラスター2) にデプロイしました。 管理者は、ServiceExportおよびServiceImportを含むMCSリソースも作成しました。

  2. フリートインスタンスは、関連するACKクラスターのServiceExportとServiceImportをリッスンし、MCSエンドポイント情報を同期します。

  3. ACKクラスター2のクライアントポッドは、ACKクラスター1のサービス1にアクセスできます。

手順1: サービスプロバイダーのリソースを作成する

サービスプロバイダーが存在するACKクラスター1にKubernetesサービスとリソースが既にデプロイされている場合は、この手順をスキップします。

  1. ACKクラスター1で次のコマンドを実行して、サービスプロバイダーの名前空間を作成します。

    この例では、provider-ns名前空間が作成されます。

    kubectl create ns provider-ns
  2. ACKクラスター1にKubernetesサービスとサービスプロバイダーのデプロイを作成します。

    1. 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
    2. 次のコマンドを実行して、ACKクラスター1にリソースを作成します。

      kubectl apply -f app-meta.yaml
    3. 次のコマンドを実行して、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クラスターの設定

  1. ACKクラスター2で次のコマンドを実行して、Serviceコンシューマーの名前空間を作成します。

    この例では、provider-ns名前空間が作成されます。

    kubectl create ns provider-ns
  2. ファイルを作成し、次のコンテンツをファイルに追加して、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: ClusterSetIP

    ServiceImportのspecセクションには、部分的なパラメーターのみが表示されます。 次の表に、specセクションのすべてのパラメーターを示します。

    パラメーター

    説明

    metadata.name

    サービス名。 名前は、エクスポートするサービスの名前と同じである必要があります。

    metadata.nameスペース

    サービスの名前空間。 名前空間は、エクスポートするサービスの名前空間と同じである必要があります。

    仕様。 ports. 名前

    ポートの名前。 値は、エクスポートするサービスの値と同じである必要があります。

    仕様。 ports. プロトコル

    プロトコル。 値は、エクスポートするサービスの値と同じである必要があります。

    仕様。 ports. appProtocol

    アプリケーションプロトコル。 値は、エクスポートするサービスの値と同じである必要があります。

    仕様。 ports. ポート

    ポートを転送します。 値は、エクスポートするサービスの値と同じである必要があります。

    仕様。 ips

    サービスの仮想IPアドレス。 このパラメーターはフリートインスタンスによって指定されます。 このパラメーターは無視できます。

    仕様。 タイプ

    有効な値: ClusterSetIPおよびHeadless

    サービスのClusterIPパラメーターがNoneに設定されている場合、サービスはヘッドレスサービスです。 このシナリオでは、typeHeadlessに設定します。

    他のシナリオでは、typeClusterSetIPに設定します。

    仕様。 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にアクセスできます。

  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    26m
  2. ACKクラスター2のクライアントポッドで次のコマンドを実行し、ACKクラスター1のサービス1にアクセスします。

    curl amcs-service1.provider-ns

方法2: サービスのドメイン名を使用する

  1. CoreDNSをACK Cluster 2にインストールまたは更新します。 CoreDNSのバージョンは1.9.3以降である必要があります。 詳細については、「CoreDNS」および「コンポーネントの管理」をご参照ください。

  2. CoreDNSのCorefile設定を変更します。

    1. 次のコマンドを実行して、CoreDNSのConfigMapを変更します。

      kubectl edit configmap coredns -n kube-system
    2. [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
                                      
  3. ACKクラスター2のクライアントポッドで次のコマンドを実行し、ACKクラスター1のサービス1にアクセスします。

    curl service1.provider-ns.svc.clusterset.local
  4. (オプション) ACK Cluster 2のクライアントポッドのdnsConfig.searchesフィールドを変更して、マルチクラスタサービスにアクセスします。

    1. 追加clusterset.localdnsConfig.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
              ...
    2. 次のコマンドを実行して、マルチクラスターサービスにアクセスします。

      curl service1.provider-ns

関連ドキュメント

コンソールでMCSを設定することもできます。 詳細については、「ACK OneコンソールでのMCSの使用」をご参照ください。