マルチクラスターゲートウェイは、マルチクラウドおよびマルチクラスターシナリオで南北トラフィックを管理するために、Distributed cloud Container Platform for Kubernetes (ACK One) によって提供されるクラウドネイティブゲートウェイです。 マルチクラスタゲートウェイは、フルマネージドのMicroservices Engine (MSE) IngressおよびIngress APIを使用して、レイヤー7で南北トラフィックを管理します。 マルチクラスタゲートウェイを使用して、ゾーンディザスタリカバリを実装し、リクエストヘッダーに基づいてカナリアバージョンを確認できます。 これにより、マルチクラスタアプリケーションのO&Mが簡素化され、コストが削減されます。 ACK One GitOpsの連続配信 (CD) 機能を使用することで、クラスター間でアプリケーションをデプロイし、アクティブなゾーン冗長性またはプライマリ /セカンダリのディザスタリカバリシステムを構築できます。 このソリューションには、データサービスのディザスタリカバリは含まれません。
ディザスタリカバリの概要
クラウドのディザスタリカバリソリューションは次のとおりです。
ゾーン-ディザスタリカバリ
ゾーンディザスタリカバリには、アクティブゾーン冗長性とプライマリ /セカンダリディザスタリカバリが含まれます。 同じリージョンにあるデータセンター間のネットワークレイテンシは低くなります。 したがって、ゾーンディザスタリカバリは、火災、ネットワークの中断、停電などのゾーンレベルの危険なイベントからデータを保護するのに適しています。
アクティブなgeo冗長性
アクティブな地理的冗長ソリューションを使用すると、データセンター間のネットワーク待ち時間が長くなります。 ただし、このソリューションでは、洪水や地震などの地域レベルの災害からデータを効率的に保護できます。
3つのデータセンターで2つのゾーン
2つのゾーンにまたがる3つのデータセンターに基づくディザスタリカバリは、ゾーンディザスタリカバリとアクティブな地理的冗長性の利点を提供します。 このソリューションは、アプリケーションの継続性と可用性を確保する必要があるシナリオに適しています。
アクティブな地理的冗長性と比較して、ゾーンディザスタリカバリの実装はより簡単であるため、ディザスタリカバリにおいて依然として重要な役割を果たします。
メリット
マルチクラスタゲートウェイを使用したディザスタリカバリには、DNSトラフィック分散を使用したディザスタリカバリよりも次の利点があります。
DNSトラフィック分散を使用したディザスタリカバリには、複数のロードバランサーIPアドレス (クラスターごとに1つのIPアドレス) が必要です。 マルチクラスタゲートウェイを使用したディザスタリカバリは、高可用性を確保するために、1つのリージョンで1つのロードバランサーIPアドレスのみを使用し、同じリージョンでのマルチゾーンデプロイメントをデフォルトで使用します。
マルチクラスタゲートウェイを使用したディザスタリカバリはレイヤー7でのリクエスト転送をサポートしますが、DNSトラフィック分散を使用したディザスタリカバリはこの機能をサポートしていません。
ほとんどの場合、クライアントは、DNSトラフィック分散を使用するディザスタリカバリシステムでIPアドレスの切り替え中にDNSクエリ結果をキャッシュする必要があります。 これは、一時的なサービス中断を引き起こす。 マルチクラスターゲートウェイを使用したディザスタリカバリは、別のクラスターのバックエンドポッドにシームレスにフェールオーバーすることで、この問題を解決できます。
マルチクラスタゲートウェイは、リージョンレベルのゲートウェイです。 したがって、ゲートウェイやIngressの作成など、フリートインスタンスのすべての操作を完了できます。 各Container Service for Kubernetes (ACK) クラスターにIngressコントローラーをインストールしたり、Ingressを作成したりする必要はありません。 これにより、マルチクラスター管理コストを削減して、リージョン内のトラフィックを管理できます。
アーキテクチャ
ACK One が提供するマルチクラスタゲートウェイは、フルマネージドMSE Ingressに基づいてトラフィックをルーティングします。 マルチクラスタゲートウェイとACK One GitOpsのマルチクラスタアプリケーション配布機能を併用することで、ゾーンディザスタリカバリシステムを迅速に構築できます。 この例では、GitOpsを使用して、中国 (香港) リージョンのACKクラスター1およびACKクラスター2にアプリケーションをデプロイし、アクティブゾーンの冗長性とプライマリ /セカンダリディザスタリカバリを実装します。 クラスター1とクラスター2は、リージョンの2つの異なるゾーンにデプロイされます。
アプリケーションは、配置およびサービスリソースを使用するwebアプリケーションです。 マルチクラスタゲートウェイは、次の図に示すように、アクティブゾーンの冗長性とプライマリ /セカンダリのディザスタリカバリを実装するために使用されます。
ACK One FleetインスタンスでMseIngressConfigオブジェクトを使用して、MSEゲートウェイを作成します。
中国 (香港) リージョンのAZ 1およびAZ 2にクラスター1およびクラスター2を作成します。
ACK One GitOpsを使用して、アプリケーションをクラスター1とクラスター2に配布します。
マルチクラスターゲートウェイの作成後、重みとリクエストヘッダーに基づいてトラフィックをクラスターにルーティングするようにIngressルールを設定できます。 一方のクラスターがダウンすると、トラフィックは自動的に他方のクラスターに切り替えられます。
前提条件
フリート管理機能が有効になっています。 詳細については、「マルチクラスター管理の有効化」をご参照ください。
ACK Oneフリートインスタンスは、ACK Oneフリートインスタンスと同じ仮想プライベートクラウド (VPC) にデプロイされている2つのACKクラスターに関連付けられています。 詳細については、「クラスターとフリートインスタンスの関連付け」をご参照ください。
FleetインスタンスのkubeconfigファイルはDistributed Cloud Container Platform for Kubernetes (ACK One) コンソールで取得され、kubectlクライアントはFleetインスタンスに接続されています。
- 説明
マルチクラスターゲートウェイの課金の詳細については、「課金の概要」をご参照ください。
ACK One Fleetインスタンスに名前空間が作成されます。 名前空間は、関連するクラスターにデプロイされたアプリケーションの名前空間と同じです。 この例では、名前空間は
gateway-demo
です。
手順1: GitOpsを使用してアプリケーションを複数のクラスターに配布
Argo CD UIを使用したアプリケーションのデプロイ
ACK Oneコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
フリートインスタンスのGitOpsページで、GitOpsコンソールをクリックしてGitOpsコンソールに移動します。
説明GitOpsがACK One フリートインスタンスで有効になっていない場合は、[GitOpsの有効化] をクリックしてGitOpsコンソールにログインします。
GitOpsへのインターネットアクセスを有効にする方法の詳細については、「Argo CDへのパブリックアクセスの有効化」をご参照ください。
アプリケーションリポジトリを追加します。
ArgoCD UIの左側のナビゲーションウィンドウで、[設定] をクリックし、
を選択します。表示されるパネルで、次のパラメーターを設定し、[接続] をクリックします。
セクション
パラメーター
値
Choose your connection method
VIA HTTPS
HTTPSを使用したCONNECT REPO
タイプ
git
プロジェクト
default
リポジトリURL
https://github.com/AliyunContainerService/gitops-demo.git
[サーバー検証のスキップ]
チェックボックスをオンにします。
Gitリポジトリが接続されると、[CONNECTION STATUS] に [Successful] が表示されます。
アプリケーションを作成します。
Argo CDの [アプリケーション] ページで、[新しいアプリ] をクリックし、次のパラメーターを設定します。
セクション
パラメーター
説明
一般
アプリケーション名
アプリケーション名。 カスタムアプリケーション名を指定できます。
プロジェクト名
default
SYNCポリシー
要件に基づいて同期ポリシーを選択します。 有効な値:
手動: Gitリポジトリ内のイメージに変更が加えられた場合、変更をターゲットクラスターに手動で同期する必要があります。
自動: Argo CDは、3分ごとにイメージの変更についてGitリポジトリをチェックし、変更をターゲットクラスターに自動的に同期します。
SYNCオプション
[AUTO-CREATE NAMESPACE]
を選択します。ソース
リポジトリURL
ドロップダウンリストからGitリポジトリを選択し、前の手順で追加したURL
https://github.com/AliyunContainerService/gitops-demo.git
を選択します。リビジョン
ブランチ: [ブランチ] ドロップダウンリストで
[gateway-demo]
を選択します。パス
manifests/helm/web-demo
目的地
クラスターURL
クラスター1またはクラスター2のURLを選択します。
右側の
URL
ドロップダウンリストをクリックし、名前
を選択して、クラスター名に基づいてURLを選択することもできます。名前空間
この例では、
gateway-demo
を使用しています。 アプリケーションリソース (サービスとデプロイメント) は、この名前空間に作成されます。ヘルム
パラメーター
リクエストを処理するクラスター内のバックエンドポッドを指定するには、
envCluster
をcluster-demo-1
またはcluster-demo-2
に設定します。
Argo CD CLIを使用したアプリケーションのデプロイ
ACK One FleetインスタンスでGitOpsを有効にします。 詳細については、「フリートインスタンスのGitOpsの有効化」をご参照ください。
Argo CDにアクセスします。 詳細については、「Argo CD CLIを使用したArgo CDへのログオン」をご参照ください。
アプリケーションを作成してデプロイします。
次のコマンドを実行してGitリポジトリを追加します。
argocd repo add https://github.com/AliyunContainerService/gitops-demo.git --name ackone-gitops-demos
期待される出力:
Repository 'https://github.com/AliyunContainerService/gitops-demo.git' added
次のコマンドを実行して、Gitリポジトリを照会します。
argocd repo list
期待される出力:
TYPE NAME REPO INSECURE OCI LFS CREDS STATUS MESSAGE PROJECT git https://github.com/AliyunContainerService/gitops-demo.git false false false false Successful default
次のコマンドを実行してクラスターを照会します。
argocd cluster list
期待される出力:
SERVER NAME VERSION STATUS MESSAGE PROJECT https://1.1.XX.XX:6443 c83f3cbc90a****-temp01 1.22+ Successful https://2.2.XX.XX:6443 c83f3cbc90a****-temp02 1.22+ Successful https://kubernetes.default.svc in-cluster Unknown Cluster has no applications and is not being monitored.
アプリケーションモードを使用して、アプリケーションを作成し、移行先クラスターにデプロイします。
apps-web-demo.yamlという名前のファイルを作成し、次のコンテンツをファイルに追加します。
repoURL
を実際のリポジトリURLに置き換えます。次のコマンドを実行して、アプリケーションをデプロイします。
kubectl apply -f apps-web-demo.yaml
次のコマンドを実行して、アプリケーションを照会します。
argocd app list
期待される出力:
# app list NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET argocd/web-demo-cluster1 https://10.1.XX.XX:6443 default Synced Healthy Auto <none> https://github.com/AliyunContainerService/gitops-demo.git manifests/helm/web-demo main argocd/web-demo-cluster2 https://10.1.XX.XX:6443 default Synced Healthy Auto <none> https://github.com/AliyunContainerService/gitops-demo.git manifests/helm/web-demo main
手順2: kubectlを使用してACK One Fleetインスタンスからマルチクラスタゲートウェイをデプロイする
ACK One FleetインスタンスにMseIngressConfigオブジェクトを作成してマルチクラスタゲートウェイをデプロイし、関連付けられたクラスタをゲートウェイに接続します。
ACK One FleetインスタンスのvSwitch IDを取得して記録します。 詳細については、「vSwitch IDの取得」をご参照ください。
gateway.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
説明${vsw-id1}
と${vsw-id2}
を前の手順で取得したvSwitch IDに置き換え、${cluster1}
と${cluster2}
を追加する関連クラスターのIDに置き換えます。関連付けられているクラスター
${cluster1}
および${cluster2}
の場合、vSwitch CIDRブロックのすべてのIPアドレスとポートからのアクセスを許可するように、セキュリティグループのインバウンドルールを設定する必要があります。
apiVersion: mse.alibabacloud.com/v1alpha1 kind: MseIngressConfig metadata: annotations: mse.alibabacloud.com/remote-clusters: ${cluster1},${cluster2} name: ackone-gateway-hongkong spec: common: instance: replicas: 3 spec: 2c4g network: vSwitches: - ${vsw-id} ingress: local: ingressClass: mse name: mse-ingress
パラメーター
説明
mse.alibabacloud.com/remote-clusters
マルチクラスターゲートウェイに接続するクラスター。 ACK One Fleetインスタンスに関連付けられているクラスターのIDを入力します。
spec.name
ゲートウェイインスタンスの名前。
spec.com mon.instance.spec
必要に応じて、 ゲートウェイインスタンスの仕様。 デフォルト値は
4c 8g
です。spec.com mon.instance.replicas
必要に応じて、 レプリケートされたゲートウェイインスタンスの数。 デフォルト値:3。
spec.ingress.local.ingressClass
必要に応じて、 マルチクラスタゲートウェイがリッスンするIngressClassesの名前。 この例では、マルチクラスタゲートウェイは、
IngressClasses
がmse
であるすべてのIngressをリッスンします。次のコマンドを実行して、マルチクラスタゲートウェイをデプロイします。
kubectl apply -f gateway.yaml
次のコマンドを実行して、マルチクラスタゲートウェイが作成され、Ingressでリッスンしているかどうかを確認します。
kubectl get mseingressconfig ackone-gateway-hongkong
期待される出力:
NAME STATUS AGE ackone-gateway-hongkong Listening 3m15s
出力は、ゲートウェイが
リスニング
状態であることを示します。 これは、マルチクラスタゲートウェイが作成され、実行されていることを意味します。 ゲートウェイは、IngressClassesがmse
であるIngressをリッスンします。MseIngressConfigから作成されたゲートウェイのステータスは、Pending、Running、Listeningの順に変わります。 状態の説明:
保留中: クラウドネイティブゲートウェイが作成中です。 このプロセスには約3分かかります。
実行中: クラウドネイティブゲートウェイが作成され、実行中です。
リスニング: クラウドネイティブゲートウェイが実行中で、Ingressでリッスンします。
Failed: クラウドネイティブゲートウェイが無効です。 [ステータス] フィールドのメッセージを確認して、問題をトラブルシューティングできます。
次のコマンドを実行して、関連付けられているクラスターがゲートウェイに接続されているかどうかを確認します。
kubectl get mseingressconfig ackone-gateway-hongkong -ojsonpath="{.status.remoteClusters}"
期待される出力:
[{"clusterId":"c7fb82****"},{"clusterId":"cd3007****"}]
出力は関連するクラスターのIDを示し、失敗エラーは返されません。 これは、関連するクラスタがマルチクラスタゲートウェイに接続されていることを意味する。
ステップ3: Ingressを使用してゾーンディザスタリカバリを実装する
マルチクラスターゲートウェイは、Ingressを使用してクラスター間のトラフィックを管理します。 ACK One FleetインスタンスにIngressオブジェクトを作成して、アクティブゾーン冗長性とプライマリ /セカンダリディザスタリカバリを実装できます。
ACK Oneフリートインスタンスにgateway-demo
名前空間が作成されていることを確認します。 アプリケーションの配置のIngressオブジェクトとServiceオブジェクトは、同じ名前空間gateway-demo
に属している必要があります。
アクティブゾーン冗長性
アクティブゾーン冗長性を実装するIngressオブジェクトの作成
ACK One FleetインスタンスにIngressオブジェクトを作成して、アクティブなゾーン冗長性を実装します。
デフォルトでは、トラフィックは、マルチクラスタゲートウェイに接続されているクラスタ1およびクラスタ2のアプリケーションのすべてのレプリケートされたポッドに配信されます。 クラスター1のバックエンドポッドがダウンすると、ゲートウェイはすべてのトラフィックをクラスター2のバックエンドポッドに自動的に配信します。 クラスター1の複製ポッドとクラスター2の複製ポッドの比率は9:1です。 したがって、90% トラフィックはクラスタ1にルーティングされ、10% トラフィックはクラスタ2にルーティングされます。 クラスター1のすべてのバックエンドポッドがダウンすると、ゲートウェイはすべてのトラフィックをクラスター2に自動的にルーティングします。 次の図は、トポロジを示しています。
ingress-demo.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
次のコードでは、ドメイン名
example.com
の下の/svc1
転送ルールを使用して、service1
という名前のバックエンドサービスを公開します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: 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 -n gateway-demo
カナリアバージョンの確認
アクティブなゾーン冗長性のシナリオでは、次の方法を使用して、ビジネスに影響を与えずにアプリケーションのカナリアバージョンを確認できます。
既存のクラスターにアプリケーションを作成します。 サービスと展開の名前
とセレクター
を指定します。 名前とセレクターが元のアプリケーション用に設定されたものと異なることを確認します。 次に、リクエストヘッダーに基づいてアプリケーションのカナリアバージョンを確認します。
クラスター1にnew-app.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。 サービスと展開の設定を除いて、元の設定を保持します。
apiVersion: v1 kind: Service metadata: name: service1-canary-1 namespace: gateway-demo spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: web-demo-canary-1 sessionAffinity: None type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: web-demo-canary-1 namespace: gateway-demo spec: replicas: 1 selector: matchLabels: app: web-demo-canary-1 template: metadata: labels: app: web-demo-canary-1 spec: containers: - env: - name: ENV_NAME value: cluster-demo-1-canary image: 'registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.6.0' imagePullPolicy: Always name: web-demo
次のコマンドを実行して、canaryバージョンをクラスター1にデプロイします。
kubectl apply -f new-app.yaml
new-ingress.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
ACK One FleetインスタンスにIngressを作成し、リクエストヘッダーに基づいてリクエストをルーティングします。 アノテーションを追加してcanary機能を有効にし、
canary-dest: cluster1
ヘッダーを指定して、このヘッダーをcanaryバージョンに運ぶリクエストをルーティングできます。nginx.ingress.kubernetes.io/canary
: カナリア機能を有効にするには、値を"true"
に設定します。nginx.ingress.kubernetes.io/canary-by-header
: カナリアバージョンにルーティングされたリクエストのヘッダーキー。nginx.ingress.kubernetes.io/canary-by-header-value
: カナリアバージョンにルーティングされたリクエストのヘッダー値。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-demo-canary-1 namespace: gateway-demo annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "canary-dest" nginx.ingress.kubernetes.io/canary-by-header-value: "cluster1" spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /svc1 pathType: Exact backend: service: name: service1-canary-1 port: number: 80
次のコマンドを実行して、ACK One FleetインスタンスにIngressをデプロイし、リクエストヘッダーに基づいてリクエストをルーティングします。
kubectl apply -f new-ingress.yaml
アクティブゾーンの冗長性の確認
クラスター1にデプロイされたレプリケートポッドの数を9に変更し、クラスター2にデプロイされたレプリケートポッドの数を1に変更します。 これにより、デフォルトでは、90% トラフィックはクラスタ1にルーティングされ、10% トラフィックはクラスタ2にルーティングされます。 クラスター1のすべてのバックエンドポッドがダウンすると、すべてのトラフィックが自動的にクラスター2にルーティングされます。
次のコマンドを実行して、マルチクラスタゲートウェイのパブリックIPアドレスを照会します。
kubectl get ingress web-demo -n gateway-demo -ojsonpath="{.status.loadBalancer}"
指定された比率に基づいてトラフィックを2つのクラスターにルーティングする
次のコマンドを実行して、トラフィックルーティング情報を照会します。
XX.XX.XX.XX
を、前の手順で取得したマルチクラスターゲートウェイのパブリックIPアドレスに置き換えます。for i in {1..100}; do curl -H "host: example.com" XX.XX.XX.XX done
期待される出力: 出力は、90% トラフィックがクラスタ1にルーティングされ、10% トラフィックがクラスタ2にルーティングされることを示します。
クラスタ1のすべてのバックエンドポッドがダウンしている場合、すべてのトラフィックをクラスタ2にルーティングする
クラスター1のデプロイの
レプリカ
値が0に設定されている場合、次の結果が返されます。 出力は、トラフィックが自動的にクラスタ2にフェールオーバーされることを示します。指定されたヘッダーを持つリクエストをカナリアバージョンにルーティングする
次のコマンドを実行して、トラフィックルーティング情報を照会します。
次のコマンドの
XX.XX.XX.XX
を、[カナリアバージョンの確認] セクションでアプリケーションとIngressをデプロイした後に取得したIPアドレスに置き換えます。for i in {1..100}; do curl -H "host: example.com" -H "canary-dest: cluster1" xx.xx.xx.xx/svc1; sleep 1; done
期待される出力: 出力は、
canary-dest: cluster1
ヘッダーを持つリクエストがクラスター1のカナリアバージョンにルーティングされることを示します。
プライマリ /セカンダリのディザスタリカバリ
ACK One FleetインスタンスにIngressオブジェクトを作成して、プライマリ /セカンダリディザスタリカバリを実装します。
両方のクラスターのバックエンドポッドが正常な場合、トラフィックはクラスター1のバックエンドポッドにのみルーティングされます。 クラスター1のバックエンドポッドがダウンしている場合、ゲートウェイは自動的にトラフィックをクラスター2にルーティングします。 次の図は、トポロジを示しています。
プライマリ /セカンダリディザスタリカバリを実装するためのIngressの作成
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 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 -ngateway-demo
クラスターレベルのカナリアリリース
マルチクラスターゲートウェイを使用すると、Ingressをデプロイして、リクエストヘッダーに基づいてリクエストを特定のクラスターにルーティングできます。 この機能と、[プライマリ /セカンダリディザスタリカバリを実装するためのIngressの作成] セクションで作成されたIngressオブジェクトを使用して、負荷分散のためにすべてのレプリケートされたポッドにトラフィックを均等に分散し、指定されたヘッダーをカナリアバージョンに運ぶリクエストをルーティングできます。
Ingressは、プライマリ /セカンダリディザスタリカバリを実装するためのIngressの作成セクションの手順に従って作成されます。
ACK One Fleetインスタンスにヘッダー関連のアノテーションを含むIngressを作成して、クラスターレベルのカナリアリリースを実装します。 リクエストのヘッダーがIngressルールと一致すると、リクエストはカナリアバージョンのバックエンドポッドにルーティングされます。
ingress-demo-cluster-gray.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
次のIngressオブジェクトのYAMLファイルで、
${cluster1-id}
をターゲットクラスターのIDに置き換えます。mse.ingress.kubernetes.io/service-subset
アノテーションとmse.ingress.kubernetes.io/subset-labels
アノテーションに加えて、ドメイン名example.com
の下にある/service1
Ingressルールを使用して、service1
という名前のバックエンドサービスを公開するには、次のアノテーションを追加する必要があります。nginx.ingress.kubernetes.io/canary
: カナリアリリースを有効にするには、値を"true"
に設定します。nginx.ingress.kubernetes.io/canary-by-header
: クラスターにルーティングされるリクエストのヘッダーキー。nginx.ingress.kubernetes.io/canary-by-header-value
: クラスターにルーティングされたリクエストのヘッダー値。
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-by-header: "app-web-demo-version" nginx.ingress.kubernetes.io/canary-by-header-value: "gray" name: web-demo-cluster-gray name: 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-gray.yaml -n gateway-demo
プライマリ /セカンダリディザスタリカバリの検証
プライマリ /セカンダリディザスタリカバリを確認するには、クラスター1とクラスター2のレプリケートされたポッドの数を1に設定します。 このようにして、指定されたヘッダーを持つリクエストはクラスター2にルーティングされ、その他のリクエストはデフォルトでクラスター1にルーティングされます。 クラスター1のバックエンドポッドがダウンしている場合、トラフィックはクラスター2にルーティングされます。
次のコマンドを実行して、マルチクラスタゲートウェイのパブリックIPアドレスを照会します。
kubectl get ingress web-demo -n gateway-demo -ojsonpath="{.status.loadBalancer}"
デフォルトでトラフィックをクラスタ1にルーティングする
次のコマンドを実行して、トラフィックがデフォルトでクラスター1にルーティングされているかどうかを確認します。
XX.XX.XX.XX
を、前の手順で取得したマルチクラスターゲートウェイのパブリックIPアドレスに置き換えます。for i in {1..100}; do curl -H "host: example.com" xx.xx.xx.xx/service1; sleep 1; done
期待される出力: 出力は、すべてのトラフィックがデフォルトでクラスター1にルーティングされることを示します。
指定されたヘッダーを持つリクエストをカナリアバージョンにルーティングする
次のコマンドを実行して、指定されたヘッダーを持つリクエストがカナリアバージョンにルーティングされるかどうかを確認します。
XX.XX.XX.XX
を、前の手順で取得したマルチクラスターゲートウェイのパブリックIPアドレスに置き換えます。for i in {1..50}; do curl -H "host: example.com" -H "app-web-demo-version: gray" xx.xx.xx.xx/service1; sleep 1; done
期待される出力: 出力は、
app-web-demo-version: gray
ヘッダーを持つリクエストがクラスター2のカナリアバージョンにルーティングされることを示します。クラスター1がダウンしているときにトラフィックをクラスター2にルーティングする
クラスター1のデプロイの
レプリカ
値が0に設定されている場合、次の結果が返されます。 出力は、トラフィックが自動的にクラスタ2にフェールオーバーされることを示します。
関連ドキュメント
ACK One が提供するマルチクラスタゲートウェイを使用して南北トラフィックを管理する方法の詳細については、「南北トラフィックの管理」をご参照ください。
ACK One GitOpsを使用してアプリケーションを配布する方法の詳細については、「GitOpsの使い方」をご参照ください。