Distributed Cloud Container Platform for Kubernetes (ACK One) が提供するマルチクラスターゲートウェイは、MSE Ingressに基づいて、マルチクラスターデプロイの南北トラフィックを管理できます。 これにより、アクティブゾーン冗長性、トラフィック負荷分散、ヘッダーベースのトラフィックルーティングなどの機能を使用できます。 このトピックでは、マルチクラスタゲートウェイを使用して南北トラフィックを管理する方法について説明します。
背景情報
マルチクラスタゲートウェイの利点
Ingressは、Kubernetesクラスターにデプロイされたサービスの南北トラフィックを管理するために、コンテナサービス部門で一般的に使用されます。 Ingressはクラスターにスコープされます。 Ingressを使用してマルチクラスターアプリケーションのトラフィックを管理することはできません。 ACK Oneでは、MSE IngressをグローバルIngressとして使用して、リージョン内のマルチクラスタアプリケーションの南北トラフィックを一元管理できます。 これらのIngressは強力なトラフィック管理機能を提供し、アクティブゾーン冗長性、トラフィック負荷分散、およびヘッダーベースのトラフィックルーティングを低コストで実装するのに役立ちます。 さらに、マルチクラスタゲートウェイは、初心者のための技術的なギャップを狭めるために使いやすいIngress APIを提供します。
マルチクラスタゲートウェイを使用する場合、料金は課金されます。 マルチクラスターゲートウェイの課金の詳細については、「課金の概要」をご参照ください。
MSE参照
MseIngressConfigは、Microservices Engine (MSE) Ingress Controllerによって提供されるCustomResourceDefinition (CRD) です。 MseIngressConfigsは、MSEクラウドネイティブゲートウェイのライフサイクルを管理し、Ingressリスニングオプションとグローバル設定を構成するために使用されます。 MseIngressConfigの使用方法の詳細については、「MseIngressConfigの設定」をご参照ください。
MSE Ingressは、Nginx-Ingressのコアと一般的に使用されるアノテーションをサポートします。 MSE Ingressは、Nginx-Ingressの欠点をカバーする他の注釈も提供します。 詳細については、「MSE Ingressゲートウェイでサポートされているアノテーション」をご参照ください。
前提条件
ACK One Fleetインスタンスに名前空間が作成されます。 名前空間は、関連するクラスターにデプロイされたアプリケーションの名前空間と同じです。
手順1: ACK One Fleetインスタンスにマルチクラスターゲートウェイを作成する
ACK One Fleetインスタンスにマルチクラスタゲートウェイを作成し、関連付けられたクラスタをマルチクラスタゲートウェイにアタッチします。 デフォルトでは、マルチクラスタゲートウェイはゾーン間でデプロイされ、高可用性を確保します。
コンソールの使用
ACK Oneコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
マルチクラスターゲートウェイページの右上隅にある [ゲートウェイの作成] をクリックします。
表示されるパネルで、ビジネス要件に基づいてマルチクラスターゲートウェイの作成に使用するYAMLファイルを変更し、[作成] をクリックします。
CLIの使用
ACK One FleetインスタンスのvSwitch IDを取得して記録します。
次のコマンドを実行して、vSwitch IDを照会します。
aliyun adcp DescribeHubClusterDetails --ClusterId <YOUR_FLEET_CLUSTERID>
出力の
vSwitch
フィールドにvSwitch IDを記録します。
mseingressconfig.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
${vsw-id1}
を記録したvSwitch IDに置き換えます。 ゲートウェイ構成ファイルに注釈を追加して、ゲートウェイに追加する関連クラスターを指定できます。apiVersion: mse.alibabacloud.com/v1alpha1 kind: MseIngressConfig metadata: name: ackone-gateway # Connect associated clusters to the MSE gateway. #annotations: # mse.alibabacloud.com/remote-clusters: ${cluster1},${cluster2} spec: common: instance: replicas: 3 spec: 2c4g network: # You can configure both an Internet-facing Server load Balancer (SLB) instance and an internal-facing SLB instance. If no SLB instance is specified, an Internet-facing SLB instance is used by default. #publicSLBSpec: slb.s2.small #privateSLBSpec: slb.s2.small vSwitches: - ${vsw-id1} ingress: local: ingressClass: mse name: mse-ingress
次のコマンドを実行して、ACK One Fleetインスタンスにmse-ingressという名前のゲートウェイを作成します。
kubectl apply -f mseingressconfig.yaml
次のコマンドを実行して、ゲートウェイが作成されているかどうかを確認します。
kubectl get mseingressconfig ackone-gateway
期待される出力:
NAME STATUS AGE ackone-gateway Listening 3m15s
出力は、ゲートウェイがリスニング状態にあることを示します。 これは、クラウドネイティブゲートウェイが作成されて実行されていることを意味します。 ゲートウェイは、IngressClassesが
mse
であるIngressをリッスンします。MseIngressConfigから作成されたゲートウェイのステータスは、Pending、Running、Listeningの順に変わります。 状態の説明:
保留中: クラウドネイティブゲートウェイが作成中です。 このプロセスには約3分かかります。
実行中: クラウドネイティブゲートウェイが作成され、実行中です。
リスニング: クラウドネイティブゲートウェイが実行中で、Ingressでリッスンします。
Failed: クラウドネイティブゲートウェイが無効です。 [ステータス] フィールドのメッセージを確認して、問題をトラブルシューティングできます。
手順2: 関連付けられたクラスターをマルチクラスタゲートウェイにアタッチする
コンソールの使用
ACK Oneコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[マルチクラスタゲートウェイ] ページの上部で、[ゲートウェイの選択] ドロップダウンリストから管理するマルチクラスタゲートウェイを選択し、右上隅の [変更] をクリックします。
ModifyGatewayパネルで、MseIngresConfig.yamlファイルを変更します。
annotations
パラメーターでクラスターIDを変更し、[更新] をクリックします。サンプルコード:
annotations: mse.alibabacloud.com/remote-clusters: ${cluster1-id},${cluster2-id}
${cluster1-id}
と${cluster2-id}
は、関連付けられているクラスターのIDです。 複数のクラスターIDはコンマ (,) で区切ります。 クラスターIDを変更して、関連するクラスターを追加または削除できます。マルチクラスターゲートウェイの作成時に関連付けられたクラスターをマルチクラスターゲートウェイに追加しない場合、MseIngresConfig.yamlファイルには
annotations
パラメーターがありません。 指定された関連クラスターをマルチクラスターゲートウェイに追加するには、上記のコードをMseIngresConfig.yamlファイルのmetadata
オブジェクトに追加し、クラスターIDを変更する必要があります。
CLIの使用
ACK One Fleetインスタンスのmseingressconfigで対応するアノテーションを変更して、関連するクラスターを追加または削除できます。
${cluster1-id}
と${cluster2-id}
を、アタッチする関連クラスターのIDに置き換えます。 クラスターIDはコンマ (,) で区切ります。annotations: mse.alibabacloud.com/remote-clusters: ${cluster1-id},${cluster2-id}
次のコマンドを実行して、関連付けられているクラスターがマルチクラスターゲートウェイにアタッチされているかどうかを確認します。
kubectl get mseingressconfig ackone-gateway -ojsonpath="{.status.remoteClusters}"
期待される出力:
[{"clusterId":"c7fb82****"},{"clusterId":"cd3007****"}]
出力は関連するクラスターのIDを示し、失敗した情報は返されません。 これは、関連するクラスタがマルチクラスタゲートウェイにアタッチされることを意味する。
ステップ3: GitOpsを使用してサンプルアプリケーションをデプロイする
GitOpsを使用して、関連するクラスターにサンプルアプリケーションをデプロイします。 詳細については、「GitOpsの使い方」をご参照ください。
関連するクラスターごとにGitOpsアプリケーションを作成します。 この例では、web-demo-cluster1およびweb-demo-cluster2アプリケーションが作成されます。
ソース
:リポジトリURL
をhttps://github.com/AliyunContainerService/gitops-demo.git
に設定します。[Revision]
を[HEAD]
に設定します。Path
をmanifests/helm/web-demo
に設定します。
関連付けられているクラスターを
DESTINATION
に指定し、namespace
をweb-demo
に設定します。Helm Values Files
の環境変数の名前はenvName
で、values
はcluster1
とcluster2
です。
次のコードブロックは、デプロイメントとサービスのYAMLコンテンツを示しています。
ステップ4: MSE Ingressを作成して、関連するクラスターのトラフィックを管理する
IngressのIngressClassをMSE Ingressに設定してMSE Ingressを作成し、異なるアノテーションでトラフィック管理機能を使用できます。 MSE IngressはNGINX Ingressのアノテーションをサポートしています。 MSE Ingressは、NGINX Ingressでサポートされていないトラフィックガバナンス機能を使用できるように、追加のアノテーションも提供します。 MSE Ingressでサポートされているアノテーションの詳細については、「MSE Ingressゲートウェイでサポートされているアノテーション」をご参照ください。 次の例では、マルチクラスタトラフィック管理の使用シナリオについて説明します。
サンプルアプリケーションのDeploymentのIngressオブジェクトとServiceオブジェクトは、同じ名前空間に属している必要があります。
例1: 負荷分散を使用して、デフォルトですべてのバックエンドポッドにトラフィックを分散する
ACK One FleetインスタンスにIngressオブジェクトを作成して、関連付けられたクラスターの名前と同じ名前のバックエンドポッドにトラフィックを分散します。 トラフィック比率を、クラスター1のポッドとクラスター2のポッドの比率に設定します。 たとえば、クラスター1のポッドとクラスター2のポッドの比率が9:1の場合、トラフィック比率を9:1に設定します。 この例では、クラスター1のポッドとクラスター2のポッドの比率は1:1です。 次の図は、トポロジを示しています。
ingress-demo.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
次のIngressオブジェクトのYAMLファイルで、ドメイン名
example.com
の下にある/svc1
を使用して、バックエンドのサービスservice1
を公開します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-demo namespace: web-demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /svc1 pathType: Exact backend: service: name: service1 port: number: 80
次のコマンドを実行して、ACK OneフリートインスタンスにIngressをデプロイします。
kubectl apply -f ingress-demo.yaml
次のコマンドを実行して、マルチクラスタゲートウェイのパブリックIPアドレスを照会します。
kubectl get ingress web-demo -nargocd -ojsonpath="{.status.loadBalancer}"
次のコマンドを実行して、トラフィックルーティング情報を照会します。
XX.XX.XX.XX
を、前の手順で取得したマルチクラスタゲートウェイのパブリックIPアドレスに置き換えます。for i in {1..50}; do curl -H "host: example.com" XX.XX.XX.XX/svc1; sleep 1; done
期待される出力:
This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster2 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is
出力は、トラフィックが両方のクラスターに分散されることを示します。
例2: 指定されたクラスターのみにトラフィックを分配する
ACK OneフリートインスタンスにIngressオブジェクトを作成して、クラスター1のバックエンドポッドにのみトラフィックを分散します。 次の図は、トポロジを示しています。
ingress-demo-cluster-one.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
mse.ingress.kubernetes.io/service-subset
およびmse.ingress.kubernetes.io/subset-labels
アノテーションをIngressオブジェクトのYAMLファイルに追加し、バックエンドのServiceservice1
を公開するためにexample.com
されるドメイン名の下に/service1
を使用します。 MSE Ingressでサポートされているアノテーションの詳細については、「MSE Ingressゲートウェイでサポートされているアノテーション」をご参照ください。mse.ingress.kubernetes.io/service-subset
: サービスのサブセットの名前。 クラスターに関連する名前を使用することを推奨します。mse.ingress.kubernetes.io/subset-labels
: 関連付けられているクラスターのID。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/service-subset: cluster-demo-1 mse.ingress.kubernetes.io/subset-labels: | topology.istio.io/cluster ${cluster1-id} name: web-demo-cluster-one namespace: web-demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /service1 pathType: Exact backend: service: name: service1 port: number: 80
次のコマンドを実行して、ACK OneフリートインスタンスにIngressをデプロイします。
kubectl apply -f ingress-demo-cluster-one.yaml
次のコマンドを実行して、マルチクラスタゲートウェイのパブリックIPアドレスを照会します。
kubectl get ingress web-demo -nargocd -ojsonpath="{.status.loadBalancer}"
次のコマンドを実行して、トラフィックルーティング情報を照会します。
XX.XX.XX.XX
を、前の手順で取得したマルチクラスタゲートウェイのパブリックIPアドレスに置き換えます。for i in {1..50}; do curl -H "host: example.com" XX.XX.XX.XX/service1; sleep 1; done
期待される出力:
This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! ...
出力は、トラフィックがクラスタ1に分散されることを示します。
例3: ヘッダーに一致するトラフィックを指定されたクラスターに配布する
ヘッダーと一致するトラフィックを指定されたクラスターのバックエンドポッドに分散するには、ACK OneフリートインスタンスにExample 1
またはExample 2
という名前のIngressオブジェクトを作成する必要があります。 次に、次のIngressオブジェクトを作成します。 Ingressオブジェクトを個別に使用することはできません。 次の図は、トポロジを示しています。
ヘッダーベースのトラフィックスケジューリングを設定するときは、カナリア注釈とヘッダー一致ポリシーで設定されたIngressを作成し、カナリア注釈なしで別のIngressを作成する必要があります。 両方のIngressは、同じホストとパスで構成されています。 このように、カナリア注釈のないIngressは、トラフィックを別のクラスターのサービスにルーティングできます。 これは、ヘッダーベースのトラフィックスケジューリングを使用するIngressを個別に使用できないためです。 一致しないトラフィックを別のクラスターにルーティングできるように、ヘッダーベースのトラフィックスケジューリングを使用しないIngressと一緒に使用する必要があります。
ingress-demo-header.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
次のIngressオブジェクトのYAMLファイルで、ドメイン名
example.com
の下にある/service1
を使用して、バックエンドのサービスservice1
を公開します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/service-subset: cluster-demo-2 mse.ingress.kubernetes.io/subset-labels: | topology.istio.io/cluster c15d48ca9d1fd43f9bbb89c56a474843c nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "stage" nginx.ingress.kubernetes.io/canary-by-header-value: "gray" name: web-demo-cluster-second namespace: web-demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /service1 pathType: Exact backend: service: name: service1 port: number: 80
次のコマンドを実行して、ACK OneフリートインスタンスにIngressをデプロイします。
kubectl apply -f ingress-demo-header.yaml
次のコマンドを実行して、マルチクラスタゲートウェイのパブリックIPアドレスを照会します。
kubectl get ingress web-demo -nargocd -ojsonpath="{.status.loadBalancer}"
次のコマンドを実行して、トラフィックルーティング情報を照会します。
XX.XX.XX.XX
を、前の手順で取得したマルチクラスターゲートウェイのパブリックIPアドレスに置き換えます。for i in {1..50}; do curl -H "host: example.com" -H "stage: gray" xx.xx.xx.xx/service1; sleep 1; done
期待される出力:
This is env cluster2 ! Config file is This is env cluster2 ! Config file is This is env cluster2 ! Config file is This is env cluster2 ! Config file is This is env cluster2 ! Config file is ...
出力は、
stage: gray
ヘッダーを持つトラフィックがクラスター2に分散されることを示します。
例4: マルチクラスタアプリケーションでのクラスター間ディザスタリカバリの使用
マルチクラスタゲートウェイは、マルチクラスタアプリケーションにクロスクラスタディザスタリカバリ機能を提供します。 この機能は、設定なしで直接使用できます。 たとえば、前述のマルチクラスタゲートウェイは、2つの関連するクラスタのトラフィックを管理します。 いずれかのクラスターのサービスがダウンまたは削除された場合、トラフィックは自動的に他のクラスターにフェールオーバーされます。 例1、例2、および例3では、クラスターの一方のサービスがダウンしている場合、トラフィックはもう一方のクラスターにフェールオーバーします。
次のセクションでは、ディザスタリカバリの実装方法を示すために例3を使用します。 stage: gray
ヘッダーを運ぶトラフィックは、クラスター2にルーティングされます。 クラスター2のデプロイによって作成されたポッドの数が0にスケーリングされると、トラフィックはクラスター1にフェールオーバーされます。 次の図は、トポロジを示しています。
次のコマンドを実行して、マルチクラスタゲートウェイのパブリックIPアドレスを照会します。
kubectl get ingress web-demo -nargocd -ojsonpath="{.status.loadBalancer}"
次のコマンドを実行して、トラフィックルーティング情報を照会します。
XX.XX.XX.XX
を、前の手順で取得したマルチクラスタゲートウェイのパブリックIPアドレスに置き換えます。for i in {1..50}; do curl -H "host: example.com" -H "stage: gray" XX.XX.XX.XX/service1; sleep 1; done
期待される出力:
This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is ...
出力は、トラフィックが自動的にクラスタ1にフェールオーバーされることを示します。
例5: 重みに基づくトラフィックの分配
例1では、ポッド比率を変更して、各クラスターに分散されるトラフィックの割合を調整できます。 この例では、アノテーションを使用して、重みに基づいてトラフィックを異なるクラスターに分散する方法を示します。 この方法を使用してカナリアリリースを実行できます。 ACK One Fleetインスタンスに次のIngressオブジェクトを作成します。 次の図は、トポロジを示しています。
重みベースのトラフィックスケジューリングを設定するときは、カナリア注釈とヘッダー一致ポリシーで設定されたIngressを作成し、カナリア注釈なしで別のIngressを作成する必要があります。 両方のIngressは、同じホストとパスで構成されています。 このように、カナリア注釈のないIngressは、トラフィックを別のクラスターのサービスにルーティングできます。 これは、重みベースのトラフィックスケジューリングを使用するIngressを個別に使用できないためです。 トラフィックを別のクラスターにルーティングできるように、重みベースのトラフィックスケジューリングを使用しないIngressと一緒に使用する必要があります。
ingress-weight.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
次のIngressオブジェクトのYAMLファイルで、
${cluster1-id}
を関連するクラスターのIDに置き換えます。 バックエンドサービスservice1
を公開するためにexample.com
されるドメイン名の下に/svc1-w
を使用する注釈を追加します。mse.ingress.kubernetes.io/service-subset
: サービスのサブセットの名前。 クラスターに関連する名前を使用することを推奨します。mse.ingress.kubernetes.io/subset-labels
: 関連付けられているクラスターのIDを指定します。nginx.ingress.kubernetes.io/canary
: カナリアリリースを有効にするには、値を"true"
に設定します。nginx.ingress.kubernetes.io/canary-weight
: クラスターに配信されるトラフィックの割合を0 ~ 100の範囲で指定します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/service-subset: cluster-demo-1 mse.ingress.kubernetes.io/subset-labels: | topology.istio.io/cluster ${cluster1-id} name: web-demo-weight namespace: web-demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /svc1-w pathType: Exact backend: service: name: service1 port: number: 80 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/service-subset: cluster-demo-2 mse.ingress.kubernetes.io/subset-labels: | topology.istio.io/cluster ${cluster2-id} nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "10" name: web-demo-weight-canary namespace: web-demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /svc1-w pathType: Exact backend: service: name: service1 port: number: 80
次のコマンドを実行して、ACK OneフリートインスタンスにIngressをデプロイします。
kubectl apply -f ingress-weight.yaml -nargocd
次のコマンドを実行して、マルチクラスタゲートウェイのパブリックIPアドレスを照会します。
kubectl get ingress web-demo -nargocd -ojsonpath="{.status.loadBalancer}"
次のコマンドを実行して、トラフィックルーティング情報を照会します。
XX.XX.XX.XX
を、前の手順で取得したマルチクラスターゲートウェイのパブリックIPアドレスに置き換えます。for i in {1..50}; do curl -H "host: example.com" XX.XX.XX.XX/svc1-w; sleep 1; done
期待される出力:
This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster2 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster1 ! Config file is This is env cluster2 ! Config file is This is env cluster1 ! Config file is ...
出力は、90% トラフィックがクラスター1に分散され、10% トラフィックがクラスター2に分散されることを示します。