Distributed Cloud Container Platform for Kubernetes (ACK One) は、マルチクラスターサービス (MCS) 機能を提供し、ドメイン名を使用して Kubernetes クラスター間でサービスにアクセスできるようにします。 これにより、ビジネスコードを変更したり、ビジネスポッドの dnsConfig フィールドや CoreDNS 構成を変更したりすることなく、クラスター間のサービストラフィックルーティングを実現できます。
前提条件
フリート管理機能が有効になっていること。 詳細については、「マルチクラスター管理を有効にする」をご参照ください。
2 つのクラスターがフリートインスタンスに関連付けられていること。 1 つのクラスターはサービスプロバイダーとして機能します。 もう 1 つのクラスターはサービスコンシューマーとして機能します。 詳細については、「関連付けられたクラスターを管理する」をご参照ください。
関連付けられたクラスターの Kubernetes バージョンが 1.22 以降であること。
サービス プロバイダー クラスター内のポッドとサービス コンシューマー クラスター内のポッドは相互に通信できます。詳細については、「MCS の概要」をご参照ください。
説明クラスター間でポッド CIDR 接続を有効にした後、クラスターのノードプールのセキュリティグループで、相互接続されたクラスターのポッド CIDR ブロックからのトラフィックが許可されていることを確認します。
サービスプロバイダークラスター、サービスコンシューマークラスター、およびフリートインスタンスの kubeconfig ファイルを取得し、kubectl を使用してクラスターとインスタンスに接続すること。 詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
MCS アーキテクチャ
サービスプロバイダークラスター内のサービスにサービスコンシューマークラスター内のクライアントポッドからアクセスできるようにするには、次の手順を実行します。
service1
という名前のサービスと、service1 サービスを使用して公開されるアプリケーションポッドをサービスプロバイダークラスターに作成します。 サービスコンシューマークラスターにservice1
という名前のサービスを作成します。フリートインスタンスで service1 という名前のマルチクラスターサービスを作成します。 マルチクラスターサービスを作成するときは、サービス名を service1 に設定し、名前空間をサービスプロバイダークラスターの service1 サービスの名前空間に設定します。 さらに、マルチクラスターサービスの構成で、サービスプロバイダークラスターとサービスコンシューマークラスターの名前を指定します。
サービスコンシューマークラスターにクライアントポッドを作成します。 これにより、クライアントポッドを使用して、ドメイン名を使用してサービスプロバイダークラスターの service1 サービスのバックエンドポッドにアクセスできます。
このトピックでは、アプリケーションとサービスは kubectl を使用してデプロイされます。 フリートインスタンスの GitOps 機能と アプリケーション配布 機能を使用して、上記の resource を関連付けられたクラスターに配布することもできます。
手順 1: サービスプロバイダークラスターに service1 という名前のサービスを作成する
kubeconfig ファイルを使用してサービスプロバイダークラスターに接続します。 次に、次のコードブロックを使用して、
web-demo-svc-provider.yaml
という名前のファイルを作成します。apiVersion: v1 kind: Service metadata: name: service1 namespace: provider-ns spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: web-demo sessionAffinity: None type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: web-demo namespace: provider-ns spec: replicas: 1 selector: matchLabels: app: web-demo template: metadata: creationTimestamp: null labels: app: web-demo spec: containers: - env: - name: ENV_NAME value: cluster-provider image: registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.5.0 imagePullPolicy: Always name: web-demo dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler
次のコマンドを実行して、
service1
という名前のサービスと、サービスを使用して公開されるアプリケーションポッドを作成します。kubectl apply -f web-demo-svc-provider.yaml
手順 2: サービスコンシューマークラスターに service1 という名前のサービスを作成する
kubeconfig ファイルを使用してサービスコンシューマークラスターに接続します。 次に、次のコードブロックを使用して
web-demo-svc-consumer.yaml
という名前のファイルを作成します。説明この手順では、アプリケーションポッドを作成する必要はありません。
apiVersion: v1 kind: Service metadata: name: service1 namespace: provider-ns spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: web-demo sessionAffinity: None type: ClusterIP
次のコマンドを実行して、
service1
という名前のサービスを作成します。kubectl apply -f web-demo-svc-consumer.yaml
手順 3: フリートインスタンスでマルチクラスターサービスを作成する
kubeconfig ファイルを使用してフリートインスタンスに接続します。 次に、次のコードブロックを使用して、
multiclusterservice.yaml
という名前のファイルを作成します。説明<your consumer cluster id>
と<your provider cluster id>
を実際のクラスター ID に置き換えます。マルチクラスターサービスの
name
とnamespace
は、サービスプロバイダークラスターのservice1
サービスの名前と名前空間と同じである必要があります。
apiVersion: networking.one.alibabacloud.com/v1alpha1 kind: MultiClusterService metadata: name: service1 namespace: provider-ns spec: consumerClusters: - name: <your consumer cluster id> providerClusters: - name: <your provider cluster id>
次のコマンドを実行して、フリートインスタンスで
service1
という名前のマルチクラスターサービスを作成します。kubectl apply -f multiclusterservice.yaml
手順 4: サービスコンシューマークラスターにクライアントポッドを作成して、サービスプロバイダークラスターの service1 サービスにアクセスする
kubeconfig ファイルを使用してサービスコンシューマークラスターに接続します。 次に、次のコードブロックを使用して
client-pod.yaml
という名前のファイルを作成します。apiVersion: v1 kind: Pod metadata: name: curl-client namespace: customer-ns spec: containers: - name: curl-client image: registry-cn-hangzhou.ack.aliyuncs.com/dev/curl:8.11.1 command: ["sh", "-c", "sleep 12000"]
次のコマンドを実行して、サービスコンシューマークラスターにクライアントポッドをデプロイします。
kubectl apply -f client-pod.yaml
次のコマンドを実行して、サービスコンシューマークラスターのクライアントポッドにログインし、サービスプロバイダークラスターの
service1
サービスにアクセスします。kubectl exec -it -n customer-ns curl-client -- sh curl service1.provider-ns
予期される出力:
This is cluster-provider!