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

Container Service for Kubernetes:ゾーンディザスタリカバリシステムの構築

最終更新日:Mar 26, 2026

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 つのクラスターにまたがるゾーンディザスタリカバリを実証します。

image

構成の動作は以下のとおりです。

  • クラスター 1 およびクラスター 2 は、中国 (香港) リージョン内の AZ 1 および AZ 2 にデプロイされます。

  • ACK One GitOps により、Web アプリケーションが両方のクラスターに配信されます。

  • ACK One Fleet インスタンス上の AlbConfig により、両方のクラスターを横断する ALB マルチクラスターゲートウェイが作成されます。

  • Fleet インスタンス上の Ingress ルールにより、重み付けに基づいてクラスター間でトラフィックがルーティングされます。いずれかのクラスターが利用不可になると、ゲートウェイが自動的にトラフィックを他方のクラスターにリダイレクトします。

  • クラスター間のデータ同期には ApsaraDB RDS を使用し、ミドルウェアに依存します。

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

ステップ 1:アプリケーションを複数のクラスターに配信

ACK One では、アプリケーションをクラスター間で配信する方法として、GitOps およびマルチクラスター向けアプリケーション配信機能の 2 つがサポートされています。本チュートリアルでは GitOps を使用します。

  1. ACK One コンソールにログインします。左側ナビゲーションウィンドウで、Fleet > マルチクラスター向けアプリケーション を選択します。

  2. マルチクラスター向けアプリケーション ページの左上隅にある Fleet インスタンス名の隣の Dingtalk_20231226104633.jpg をクリックし、ドロップダウンリストから該当の Fleet インスタンスを選択します。

  3. マルチクラスター向けアプリケーションの作成 > GitOps を選択して、マルチクラスター向けアプリケーションの作成 - GitOps ページを開きます。

    ご使用の Fleet インスタンスで GitOps が有効化されていない場合は、まず有効化してください。詳細については、「Fleet インスタンスに対する GitOps の有効化」をご参照ください。GitOps へのインターネットアクセスを許可するには、「Argo CD へのパブリックアクセスの有効化」をご参照ください。
  4. 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 ゲートウェイをプロビジョニングします。

  1. ご使用の Fleet インスタンスが属する VPC 内の 2 つの vSwitch の ID を取得します。

  2. 以下の内容で 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
  3. 構成を適用します。

    kubectl apply -f gateway.yaml
  4. 1~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                           4d9h

    DNSNAME の値をメモしてください。検証ステップで使用します。

  5. 両方のクラスターがゲートウェイに接続されていることを確認します。

    kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'

    出力には、関連付けられたクラスターの ID が表示されます。

ステップ 3:ゾーンディザスタリカバリのための Ingress ルールの構成

マルチクラスターゲートウェイでは、Fleet インスタンス上の Ingress オブジェクトを使用して、クラスター間でトラフィックをルーティングおよび分散します。

  1. Fleet インスタンス上に gateway-demo という名前空間を作成します。これは、アプリケーションの Service がデプロイされる名前空間と一致させる必要があります。

  2. 以下の内容で 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: 80
  3. Ingress を適用します。

    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 で構成した重みと一致します。

image

自動フェイルオーバー

クラスター障害をシミュレートし、シームレスなフェイルオーバーを観察するには、継続的なリクエストループを実行した後、クラスター 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 に自動的に切り替えられます。

image

次のステップ