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アプリケーションは、配置とサービスで構成されます。 次の図は、ゾーン災害復旧システムのアーキテクチャを示しています。
中国 (香港) リージョンの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クラスターに関連付けられています。 詳細については、「関連クラスターの管理」をご参照ください。
フリートインスタンスのkubeconfigファイルはACK Oneコンソールで取得され、kubectlクライアントはフリートインスタンスに接続されています。
Alibaba Cloud CLIの最新バージョンがインストールされ、Alibaba Cloud CLIが設定されています。
手順1: GitOpsまたはアプリケーション配布機能を使用して、アプリケーションを複数のクラスターに配布する
ACK Oneを使用すると、GitOpsまたはアプリケーション配布機能を使用して、アプリケーションを複数のクラスターに配布できます。 詳細については、「GitOpsの使用を開始する」、「マルチクラスタアプリケーションの作成」、および「アプリケーションの配布を開始する」をご参照ください。 このステップでは、GitOpsが使用されます。
ACK Oneコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[マルチクラスターアプリケーション] ページの左上隅で、フリートインスタンス名の右側にある
をクリックし、ドロップダウンリストからフリートインスタンスを選択します。
を選択し、[マルチクラスターアプリケーションの作成-GitOps] ページに移動します。
説明GitOpsがACK One Fleetインスタンスで有効になっていない場合は、GitOpsを有効にします。 詳細については、「フリートインスタンスのGitOpsの有効化」をご参照ください。
GitOpsへのインターネットアクセスを有効にする方法の詳細については、「Argo CDへのパブリックアクセスの有効化」をご参照ください。
[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マルチクラスタゲートウェイを作成できます。 クラスターをゲートウェイに関連付けることができます。
ACK One Fleetインスタンスが存在するVPCに属する2つのvSwitchのIDを取得します。
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を使用する前にリスナーを作成する必要があります。
次のコマンドを実行して、
gateway.yaml
ファイルをデプロイし、ALBマルチクラスタゲートウェイとIngressClassを作成します。kubectl apply -f gateway.yaml
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
次のコマンドを実行して、関連付けられているクラスターがゲートウェイに接続されているかどうかを確認します。
kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'
関連付けられたクラスターのIDが出力で返されます。
ステップ3: Ingressを使用してゾーンディザスタリカバリを実装する
マルチクラスターゲートウェイは、Ingressを使用してクラスター間のトラフィックを管理します。 ACK One FleetインスタンスにIngressオブジェクトを作成して、アクティブなゾーン冗長性を実装できます。
gateway-demo
という名前の名前空間を作成します。これは、上記の手順で作成したサービスが存在する名前空間と同じです。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
次のコマンドを実行して、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
次のパラメーターを設定する必要があります。
パラメーター | 説明 |
| 手順2で取得したAlbConfigの詳細の |
| 値を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
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