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

Container Service for Kubernetes:ACK OneでALBマルチクラスタゲートウェイを使用したゾーンディザスタリカバリの実装

最終更新日:Dec 06, 2024

Distributed Cloud Container Platform for Kubernetes (ACK One) のApplication Load Balancer (ALB) マルチクラスターゲートウェイは、ACK One GitOpsまたはマルチクラスターアプリケーション配布機能とともに使用して、ゾーンディザスタリカバリを迅速に実装できます。 これにより、ビジネスの高可用性を確保し、障害発生時にトラフィックをシームレスに自動的に切り替えることができます。 このトピックでは、マルチクラスタゲートウェイを使用してゾーン災害復旧システムを構築する方法について説明します。

ディザスタリカバリの概要

クラウド内のディザスタリカバリソリューションは、次のタイプに分類できます。

  • ゾーンディザスタリカバリ: このソリューションには、アクティブゾーン冗長性とプライマリ /セカンダリディザスタリカバリが含まれます。 同じリージョンにあるデータセンター間のネットワークレイテンシは低くなります。 したがって、ゾーンディザスタリカバリは、火災、ネットワークの中断、停電などのゾーンレベルの危険なイベントからデータを保護するのに適しています。 このソリューションでは、データのバックアップと復元に簡単な方法を使用しますが、一般的なシナリオに適用できます。

  • アクティブな地理的冗長性: アクティブな地理的冗長性ソリューションを使用すると、データセンター間のネットワーク待ち時間が長くなります。 ただし、このソリューションでは、洪水や地震などの地域レベルの災害からデータを効率的に保護できます。

  • 2つのゾーンにまたがる3つのデータセンターに基づくディザスタリカバリ: このソリューションは、ゾーンディザスタリカバリとアクティブな地理的冗長性の利点を提供します。 このソリューションは、アプリケーションの継続性と可用性を確保する必要があるシナリオに適しています。

ほとんどの場合、企業のビジネスアーキテクチャは、上から下にアクセス層、アプリケーション層、およびデータ層の層に分割できます。

  • アクセス層: イングレストラフィックのエントリポイントとして機能します。 このレイヤーは、転送ルールに基づいて、受信トラフィックをバックエンドアプリケーションレイヤーにルーティングします。

  • アプリケーション層: アプリケーションをホストします。 このレイヤは、イングレストラフィックを処理し、その結果を上位レイヤに送り返す。

  • データ層: データを格納します。 このレイヤーは、アプリケーションレイヤーのデータとストレージサービスを提供します。

ビジネスのディザスタリカバリシステムを構築する場合、各レイヤーにリカバリ対策を適用する必要があります。

  • アクセス層: ACKアクセス層を構築するためにマルチクラスタゲートウェイを使用する。 ACK Oneのマルチクラスタゲートウェイは、ゾーンディザスタリカバリをサポートしています。 したがって、ACK One上に構築されたアクセス層は非常に有用である。

  • アプリケーション層: ACKアプリケーション層でディザスタリカバリを実装するためにマルチクラスタゲートウェイを使用します。 ACK Oneのマルチクラスタゲートウェイは、アクティブゾーン冗長性、プライマリ /セカンダリディザスタリカバリ、およびジオ冗長性をサポートします。

  • データレイヤー: データレイヤーでのディザスタリカバリとデータ同期には、ミドルウェアの依存関係があります。

メリット

ACKのマルチクラスタゲートウェイを使用したディザスタリカバリ1には、DNSトラフィック分散を使用したディザスタリカバリよりも次の利点があります。

  • DNSトラフィック分散を使用したディザスタリカバリには、複数のロードバランサーIPアドレス (クラスターごとに1つのIPアドレス) が必要です。 マルチクラスタゲートウェイを使用したディザスタリカバリは、高可用性を確保するために、1つのリージョンで1つのロードバランサーIPアドレスのみを使用し、同じリージョンでのマルチゾーンデプロイメントをデフォルトで使用します。

  • マルチクラスタゲートウェイを使用したディザスタリカバリはレイヤー7でのリクエスト転送をサポートしますが、DNSトラフィック分散を使用したディザスタリカバリはこの機能をサポートしていません。

  • ほとんどの場合、クライアントは、DNSトラフィック分散を使用するディザスタリカバリシステムでIPアドレスの切り替え中にDNSクエリ結果をキャッシュする必要があります。 これは、一時的なサービス中断を引き起こす。 マルチクラスターゲートウェイを使用したディザスタリカバリは、別のクラスターのバックエンドポッドにシームレスにフェールオーバーすることで、この問題を解決できます。

  • マルチクラスタゲートウェイは、リージョンレベルのゲートウェイです。 したがって、Ingressコントローラーをインストールしたり、各Container Service for Kubernetes (ACK) クラスターにIngressを作成したりすることなく、フリートインスタンスですべての操作を完了できます。 これにより、リージョン内のトラフィックを管理し、マルチクラスター管理コストを削減できます。

アーキテクチャ

この例では、webアプリケーションを使用して、ALBマルチクラスタゲートウェイを使用してゾーンディザスタリカバリを実装する方法を示します。 webアプリケーションは、配置とサービスで構成されます。 次の図は、ゾーン災害復旧システムのアーキテクチャを示しています。

image
  • 中国 (香港) リージョンのAZ 1およびAZ 2にクラスター1およびクラスター2を作成します。

  • ACK One GitOpsを使用して、アプリケーションをクラスター1とクラスター2に配布します。

  • AlbConfigを使用して、ACK One FleetインスタンスにALBマルチクラスタゲートウェイを作成します。

  • ALBマルチクラスタゲートウェイの作成後、重みとリクエストヘッダーに基づいてトラフィックをクラスタにルーティングするようにIngressルールを設定できます。 一方のクラスターがダウンすると、トラフィックは自動的に他方のクラスターに切り替えられます。

  • ApsaraDB RDSに基づくデータ同期には、ミドルウェア依存関係があります。

前提条件

  • ALBが活性化される。

  • フリート管理機能が有効になっています。 詳細については、「マルチクラスター管理の有効化」をご参照ください。

  • ACK Oneフリートインスタンスは、ACK Oneフリートインスタンスと同じ仮想プライベートクラウド (VPC) にデプロイされている2つのACKクラスターに関連付けられています。 詳細については、「関連クラスターの管理」をご参照ください。

手順1: GitOpsまたはアプリケーション配布機能を使用して、アプリケーションを複数のクラスターに配布する

ACK Oneを使用すると、GitOpsまたはアプリケーション配布機能を使用して、アプリケーションを複数のクラスターに配布できます。 詳細については、「GitOpsの使用を開始する」、「マルチクラスタアプリケーションの作成」、および「アプリケーションの配布を開始する」をご参照ください。 このステップでは、GitOpsが使用されます。

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

  2. [マルチクラスターアプリケーション] ページの左上隅で、フリートインスタンス名の右側にあるDingtalk_20231226104633.jpgをクリックし、ドロップダウンリストからフリートインスタンスを選択します。

  3. [マルチクラスターアプリケーションの作成] > [GitOps] を選択し、[マルチクラスターアプリケーションの作成-GitOps] ページに移動します。

    説明
  4. [YAMLから作成] タブで、次のYAMLテンプレートをコードエディターにコピーします。 次に、[OK] をクリックしてアプリケーションをデプロイします。

    説明

    次のYAMLテンプレートを使用して、web-demoという名前のアプリケーションを各関連クラスターにデプロイします。 [クイック作成] タブで、アプリケーションをデプロイするクラスターを選択することもできます。 [クイック作成] タブで行った構成の変更は、[YAMLから作成] タブの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

手順2: kubectlを使用してACK One FleetインスタンスからALBマルチクラスタゲートウェイをデプロイする

AlbConfigを使用して、ACK One FleetインスタンスからALBマルチクラスタゲートウェイを作成できます。 クラスターをゲートウェイに関連付けることができます。

  1. ACK One Fleetインスタンスが存在するVPCに属する2つのvSwitchのIDを取得します。

  2. gateway.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。

    説明
    • ${vsw-id1}${vsw-id2} を前の手順で取得したvSwitch IDに置き換え、${cluster1}${cluster2} を追加する関連クラスターのIDに置き換えます。

    • 関連付けられているクラスター ${cluster1} および ${cluster2} の場合、vSwitch CIDRブロックのすべてのIPアドレスとポートからのアクセスを許可するように、セキュリティグループのインバウンドルールを設定する必要があります。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: ackone-gateway-demo
      annotations:
        # Specify the IDs of the clusters that you want to associate with the ALB instance. 
        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

    次のパラメーターを設定する必要があります。

    パラメーター

    必須 / 任意

    説明

    metadata.name

    AlbConfigの名前。

    metadata.annotations:

    alb.ingress.kubernetes.io/remote-clusters

    ALBマルチクラスタゲートウェイに追加される関連クラスタのリスト。 ここにリストされているクラスターIDはフリートインスタンスに関連付けられています。

    spec.config.name

    不可

    ALBインスタンスの名前。

    spec.config.addressType

    不可

    ALBインスタンスのネットワークタイプ。 有効な値:

    • インターネット (デフォルト): パブリックネットワーク。 ALBインスタンスはインターネットにサービスを提供し、インターネット経由でアクセスできます。

      説明

      ALBインスタンスがインターネット接続サービスを提供できるようにするには、ALBインスタンスをelastic IPアドレス (EIP) に関連付ける必要があります。 インターネット接続のALBインスタンスを使用している場合、関連するEIPのインスタンス料金と帯域幅またはデータ転送料金が課金されます。 詳細については、「従量課金」をご参照ください。

      イントラネット: プライベートネットワーク。 ALBインスタンスはVPC内でサービスを提供し、インターネット経由でアクセスすることはできません。

    spec.config.zoneMappings

    ALBインスタンスに関連付けられているvSwitchのID。 vSwitchの作成方法の詳細については、「vSwitchの作成と管理」をご参照ください。

    説明
    • 指定されたvSwitchは、ALBインスタンスでサポートされているゾーンにデプロイし、クラスターと同じVPCにデプロイする必要があります。 ALBでサポートされているリージョンとゾーンの詳細については、「ALBが利用可能なリージョンとゾーン」をご参照ください。

    • ALBはマルチゾーン展開をサポートしています。 現在のリージョンで2つ以上のゾーンがサポートされている場合は、高可用性を確保するために2つ以上のゾーンのvSwitchを選択します。

    spec.listeners

    不可

    ALBインスタンスのリスナーポートとプロトコル。 このトピックの例では、ポート8001でHTTPリスナーを構成します。

    リスナーは、ALBがトラフィックを受信する方法を定義します。 リスナーの構成を保持することを推奨します。 それ以外の場合は、ALB Ingressを使用する前にリスナーを作成する必要があります。

  3. 次のコマンドを実行して、gateway.yamlファイルをデプロイし、ALBマルチクラスタゲートウェイとIngressClassを作成します。

    kubectl apply -f gateway.yaml
  4. 1〜3分待ち、次のコマンドを実行して、ALBマルチクラスタゲートウェイが作成されているかどうかを確認します。

    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
  5. 次のコマンドを実行して、関連付けられているクラスターがゲートウェイに接続されているかどうかを確認します。

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

    関連付けられたクラスターのIDが出力で返されます。

ステップ3: Ingressを使用してゾーンディザスタリカバリを実装する

マルチクラスターゲートウェイは、Ingressを使用してクラスター間のトラフィックを管理します。 ACK One FleetインスタンスにIngressオブジェクトを作成して、アクティブなゾーン冗長性を実装できます。

  1. gateway-demoという名前の名前空間を作成します。これは、上記の手順で作成したサービスが存在する名前空間と同じです。

  2. ingress-demo.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。

    説明
    • alb.ingress.kubernetes.io/cluster-weightアノテーションに指定されているすべての重みの合計を100する必要があります。

    • ドメイン名example.comの下の /svc1転送ルールは、service1という名前のバックエンドサービスを公開するために使用されます。 ${cluster1-id}${cluster2-id} を実際のクラスターIDに置き換えます。

    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. 次のコマンドを実行して、ACK OneフリートインスタンスにIngressをデプロイします。

    kubectl apply -f ingress-demo.yaml -n gateway-demo

ステップ4: アクティブゾーンの冗長性を確認する

比率で異なるクラスターにトラフィックを転送する

次のコマンドを実行して、webアプリケーションにアクセスします。

curl -H "host: alb.ingress.alibaba.com" alb-xxxx.<regionid>.alb.aliyuncs.com:<listeners port>/svc1

次のパラメーターを設定する必要があります。

パラメーター

説明

alb-xxxx.<regioni d>.alb.aliyuncs.com

手順2で取得したAlbConfigの詳細のDNSNAME列のドメイン名に値を設定します。

<リスナーポート>

値を8001に設定します。これは、AlbConfig設定とIngress設定のアノテーションで指定された値です。

次のコマンドを実行します。 出力は、トラフィックの20% がクラスタ1 (poc-ack-1) に転送され、トラフィックの80% がクラスタ2 (poc-ack-2) に転送されることを示しています。

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

image

1つのクラスターで障害が発生すると、自動的かつシームレスにトラフィックを切り替えます

次のコマンドを実行します。 次に、クラスター2のアプリケーションポッドの数を0に減らします。 変更が有効になると、トラフィックは自動的にクラスター1にシームレスに切り替えられます。

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

image