Distributed Cloud Container Platform for Kubernetes (ACK One) の Application Load Balancer (ALB) マルチクラスターゲートウェイを使用すると、障害発生時にトラフィックを自動的にクラスター間で切り替えるゾーンディザスタリカバリシステムを構築できます。本トピックでは、2 つの可用性ゾーン (AZ) にアプリケーションをデプロイし、ALB マルチクラスターゲートウェイを構成して、シームレスなフェイルオーバーを検証する手順について説明します。
ディザスタリカバリモデル
クラウドにおけるディザスタリカバリは、以下の 3 つのモデルに分類されます。復元目標および運用の複雑さに応じて、適切なモデルを選択してください。
| モデル | 防止対象 | トレードオフ |
|---|---|---|
| ゾーンディザスタリカバリ | ゾーンレベルの事象:火災、ネットワーク障害、停電 | 同一リージョン内のデータセンター間で低遅延を実現可能。実装が比較的容易 |
| アクティブな地理的冗長性 | リージョンレベルの災害:洪水、地震 | データセンター間の遅延がやや高くなるが、より強固な保護を提供 |
| 2 ゾーンにまたがる 3 つのデータセンター | ゾーンレベルおよびリージョンレベルの両方の障害 | 上記 2 つのモデルを組み合わせたもの。最も高い複雑さを要する |
ゾーンディザスタリカバリには、以下の 2 つのサブモードがあります。
アクティブなゾーン冗長性:両方のクラスターが同時にライブトラフィックを処理します。
プライマリ/セカンダリディザスタリカバリ:1 つのクラスターがトラフィックを処理し、もう 1 つのクラスターはスタンバイ状態で待機します。
アーキテクチャレイヤー
典型的なエンタープライズアプリケーションは、それぞれ独自のディザスタリカバリ戦略を必要とする 3 つのレイヤーで構成されます。
| レイヤー | 役割 | ACK One の対応範囲 |
|---|---|---|
| アクセスレイヤー | イングレストラフィックのエントリポイント。転送ルールに基づき、リクエストをバックエンドにルーティング | マルチクラスターゲートウェイ。ゾーンディザスタリカバリはデフォルトでサポート |
| アプリケーションレイヤー | アプリケーションワークロードをホストおよび処理 | マルチクラスターゲートウェイ。アクティブなゾーン冗長性、プライマリ/セカンダリディザスタリカバリ、地理的冗長性をサポート |
| データレイヤー | アプリケーションレイヤーへデータを保存および提供 | ミドルウェア依存(例:ApsaraDB RDS) |
マルチクラスターゲートウェイを採用する理由
マルチクラスターゲートウェイは、DNS を使用したトラフィック分散方式と比較して、以下のような利点があります。
リージョンごとに単一の IP アドレス:DNS 方式では、各クラスターごとにロードバランサーの IP アドレスが必要です。一方、マルチクラスターゲートウェイでは、単一のロードバランサー IP アドレスを用い、リージョン内の複数のゾーンに展開することで、組み込みの高可用性を実現します。
レイヤー 7 リクエスト転送:マルチクラスターゲートウェイはレイヤー 7 でトラフィックをルーティングするため、ホスト名およびパスに基づくルールを設定できます。DNS 方式では、レイヤー 7 リクエスト転送はサポートされません。
シームレスフェイルオーバー:クラスターがダウンした場合、トラフィックは即座に別のクラスター内の健全な Pod に切り替えられます。DNS 方式では、IP アドレスの切り替え時にクライアントが DNS クエリ結果をキャッシュするため、一時的なサービス中断が発生します。
集中管理:マルチクラスターゲートウェイは、Fleet インスタンスから管理されるリージョンレベルのリソースです。各 Container Service for Kubernetes (ACK) クラスターに Ingress コントローラーをインストールしたり、Ingress を作成したりする必要はありません。
アーキテクチャ
本チュートリアルでは、Web アプリケーション(Deployment および Service)を用いて、2 つのクラスターにまたがるゾーンディザスタリカバリを実証します。
構成の動作は以下のとおりです。
クラスター 1 およびクラスター 2 は、中国 (香港) リージョン内の AZ 1 および AZ 2 にデプロイされます。
ACK One GitOps により、Web アプリケーションが両方のクラスターに配信されます。
ACK One Fleet インスタンス上の AlbConfig により、両方のクラスターを横断する ALB マルチクラスターゲートウェイが作成されます。
Fleet インスタンス上の Ingress ルールにより、重み付けに基づいてクラスター間でトラフィックがルーティングされます。いずれかのクラスターが利用不可になると、ゲートウェイが自動的にトラフィックを他方のクラスターにリダイレクトします。
クラスター間のデータ同期には ApsaraDB RDS を使用し、ミドルウェアに依存します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
ALB が有効化されていること。有効化するには、ALB コンソールに移動してください。
Fleet 管理機能が有効化されていること。詳細については、「マルチクラスター管理の有効化」をご参照ください。
同一仮想プライベートクラウド (VPC) 内にデプロイされた 2 つの ACK クラスターと関連付けられた ACK One Fleet インスタンスが存在すること。詳細については、「関連クラスターの管理」をご参照ください。
ACK One コンソールから Fleet インスタンスの kubeconfig ファイルをダウンロード済みであり、kubectl が Fleet インスタンスに接続済みであること。
ステップ 1:アプリケーションを複数のクラスターに配信
ACK One では、アプリケーションをクラスター間で配信する方法として、GitOps およびマルチクラスター向けアプリケーション配信機能の 2 つがサポートされています。本チュートリアルでは GitOps を使用します。
ACK One コンソールにログインします。左側ナビゲーションウィンドウで、Fleet > マルチクラスター向けアプリケーション を選択します。
マルチクラスター向けアプリケーション ページの左上隅にある Fleet インスタンス名の隣の
をクリックし、ドロップダウンリストから該当の Fleet インスタンスを選択します。マルチクラスター向けアプリケーションの作成 > GitOps を選択して、マルチクラスター向けアプリケーションの作成 - GitOps ページを開きます。
ご使用の Fleet インスタンスで GitOps が有効化されていない場合は、まず有効化してください。詳細については、「Fleet インスタンスに対する GitOps の有効化」をご参照ください。GitOps へのインターネットアクセスを許可するには、「Argo CD へのパブリックアクセスの有効化」をご参照ください。
YAML からの作成 タブで、以下の ApplicationSet テンプレートをコードエディタに貼り付け、OK をクリックします。このテンプレートにより、Fleet インスタンスに関連付けられたすべてのクラスターに
web-demoがデプロイされます。あるいは、クイック作成 タブを使用してクラスターを個別に選択することも可能です。その場合、変更内容は自動的にこの YAML に同期されます。apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: appset-web-demo namespace: argocd spec: template: metadata: name: '{{.metadata.annotations.cluster_id}}-web-demo' namespace: argocd spec: destination: name: '{{.name}}' namespace: gateway-demo project: default source: repoURL: https://github.com/AliyunContainerService/gitops-demo.git path: manifests/helm/web-demo targetRevision: main helm: valueFiles: - values.yaml parameters: - name: envCluster value: '{{.metadata.annotations.cluster_name}}' syncPolicy: automated: {} syncOptions: - CreateNamespace=true generators: - clusters: selector: matchExpressions: - values: - cluster key: argocd.argoproj.io/secret-type operator: In - values: - in-cluster key: name operator: NotIn goTemplateOptions: - missingkey=error syncPolicy: preserveResourcesOnDeletion: false goTemplate: true
その他の配信方法については、「GitOps の概要」「マルチクラスター向けアプリケーションの作成」「アプリケーション配信の概要」をご参照ください。
ステップ 2:ALB マルチクラスターゲートウェイのデプロイ
Fleet インスタンス上で AlbConfig を作成し、両方のクラスターを横断する ALB ゲートウェイをプロビジョニングします。
ご使用の Fleet インスタンスが属する VPC 内の 2 つの vSwitch の ID を取得します。
以下の内容で
gateway.yamlというファイルを作成します。${vsw-id1}および${vsw-id2}を vSwitch の ID に置き換え、${cluster1}および${cluster2}を関連付けられたクラスターの ID に置き換えてください。${cluster1}および${cluster2}については、それぞれのセキュリティグループのインバウンドルールを、vSwitch CIDR ブロック内のすべての IP アドレスおよびポートからのアクセスを許可するように設定してください。パラメーター 必須 説明 metadata.nameはい AlbConfig の名前。 alb.ingress.kubernetes.io/remote-clustersはい ALB ゲートウェイに関連付けるクラスター ID のカンマ区切りリスト。これらのクラスターは、あらかじめ Fleet インスタンスに関連付けられている必要があります。 spec.config.nameいいえ ALB インスタンスの名前。 spec.config.addressTypeいいえ ネットワークタイプ: Internet(デフォルト)はパブリックアクセス用、Intranetは VPC 内部アクセス専用です。インターネット向けインスタンスには、Elastic IP Address(EIP)が必要であり、EIP 料金が発生します。詳細については、「従量課金制」をご参照ください。spec.config.zoneMappingsはい ALB インスタンスの vSwitch ID。高可用性を確保するため、少なくとも 2 つのゾーンの vSwitch を指定してください。vSwitch は、ALB が利用可能なゾーンおよびクラスターと同じ VPC 内に配置する必要があります。詳細については、「ALB が利用可能なリージョンおよびゾーン」および「vSwitch の作成および管理」をご参照ください。 spec.listenersいいえ リスナーのポートおよびプロトコル。本例では、ポート 8001 上の HTTP を構成しています。リスナー構成は必ず保持してください。構成がない場合、ALB Ingress がトラフィックをルーティングする前に、手動でリスナーを作成する必要があります。 apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: ackone-gateway-demo annotations: # ALB インスタンスに関連付けるクラスターの ID を指定します。 alb.ingress.kubernetes.io/remote-clusters: ${cluster1},${cluster2} spec: config: name: one-alb-demo addressType: Internet addressAllocatedMode: Fixed zoneMappings: - vSwitchId: ${vsw-id1} - vSwitchId: ${vsw-id2} listeners: - port: 8001 protocol: HTTP --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: ackone-gateway-demo構成を適用します。
kubectl apply -f gateway.yaml1~3 分待ち、ゲートウェイが作成されたことを確認します。
kubectl get albconfig ackone-gateway-demo期待される出力:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE ackone-gateway-demo alb-xxxx alb-xxxx.<regionid>.alb.aliyuncs.com 4d9hDNSNAMEの値をメモしてください。検証ステップで使用します。両方のクラスターがゲートウェイに接続されていることを確認します。
kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'出力には、関連付けられたクラスターの ID が表示されます。
ステップ 3:ゾーンディザスタリカバリのための Ingress ルールの構成
マルチクラスターゲートウェイでは、Fleet インスタンス上の Ingress オブジェクトを使用して、クラスター間でトラフィックをルーティングおよび分散します。
Fleet インスタンス上に
gateway-demoという名前空間を作成します。これは、アプリケーションの Service がデプロイされる名前空間と一致させる必要があります。以下の内容で
ingress-demo.yamlというファイルを作成します。${cluster1-id}および${cluster2-id}を実際のクラスター ID に置き換えてください。すべての
alb.ingress.kubernetes.io/cluster-weightアノテーションの重みの合計は、100 になる必要があります。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: | [{"HTTP": 8001}] alb.ingress.kubernetes.io/cluster-weight.${cluster1-id}: "20" alb.ingress.kubernetes.io/cluster-weight.${cluster2-id}: "80" name: web-demo namespace: gateway-demo spec: ingressClassName: alb rules: - host: alb.ingress.alibaba.com http: paths: - path: /svc1 pathType: Prefix backend: service: name: service1 port: number: 80Ingress を適用します。
kubectl apply -f ingress-demo.yaml -n gateway-demo
ステップ 4:アクティブなゾーン冗長性の検証
重み付きトラフィック分散
次のコマンドを使用してアプリケーションにリクエストを送信します。alb-xxxx.<regionid>.alb.aliyuncs.com をステップ 2 の DNSNAME に置き換えます。
curl -H "host: alb.ingress.alibaba.com" alb-xxxx.<regionid>.alb.aliyuncs.com:8001/svc1リスナーのポートは 8001 であり、AlbConfig および Ingress のアノテーションで設定した値と一致します。
500 件のリクエストに対するトラフィックディストリビューションをテストするには:
for i in {1..500}; do curl -H "host: alb.ingress.alibaba.com" alb-xxxx.cn-beijing.alb.aliyuncs.com:8001/svc1; done > res.txt出力結果には、クラスター 1(poc-ack-1)からの応答が約 20 %、クラスター 2(poc-ack-2)からの応答が約 80 % と表示され、Ingress で構成した重みと一致します。

自動フェイルオーバー
クラスター障害をシミュレートし、シームレスなフェイルオーバーを観察するには、継続的なリクエストループを実行した後、クラスター 2 の Pod を 0 にスケールダウンします。
for i in {1..500}; do curl -H "host: alb.ingress.alibaba.com" alb-xxxx.cn-beijing.alb.aliyuncs.com:8001/svc1; sleep 1; doneクラスター 2 の Pod が削除されると、トラフィックはシームレスにクラスター 1 に自動的に切り替えられます。
