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

:MSEマルチクラスタゲートウェイを使用してACK Oneでゾーンディザスタリカバリを実装する

最終更新日:Nov 20, 2024

マルチクラスターゲートウェイは、マルチクラウドおよびマルチクラスターシナリオで南北トラフィックを管理するために、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アプリケーションです。 マルチクラスタゲートウェイは、次の図に示すように、アクティブゾーンの冗長性とプライマリ /セカンダリのディザスタリカバリを実装するために使用されます。image.png

  • ACK One FleetインスタンスでMseIngressConfigオブジェクトを使用して、MSEゲートウェイを作成します。

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

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

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

前提条件

手順1: GitOpsを使用してアプリケーションを複数のクラスターに配布

Argo CD UIを使用したアプリケーションのデプロイ

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

  2. フリートインスタンスのGitOpsページで、GitOpsコンソールをクリックしてGitOpsコンソールに移動します。

    説明
    • GitOpsがACK One フリートインスタンスで有効になっていない場合は、[GitOpsの有効化] をクリックしてGitOpsコンソールにログインします。

    • GitOpsへのインターネットアクセスを有効にする方法の詳細については、「Argo CDへのパブリックアクセスの有効化」をご参照ください。

  3. アプリケーションリポジトリを追加します。

    1. ArgoCD UIの左側のナビゲーションウィンドウで、[設定] をクリックし、[リポジトリ] > [レポ接続] を選択します。

    2. 表示されるパネルで、次のパラメーターを設定し、[接続] をクリックします。

      セクション

      パラメーター

      Choose your connection method

      VIA HTTPS

      HTTPSを使用したCONNECT REPO

      タイプ

      git

      プロジェクト

      default

      リポジトリURL

      https://github.com/AliyunContainerService/gitops-demo.git

      [サーバー検証のスキップ]

      チェックボックスをオンにします。

      image.png

      Gitリポジトリが接続されると、[CONNECTION STATUS][Successful] が表示されます。

      image.png

  4. アプリケーションを作成します。

    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を使用しています。 アプリケーションリソース (サービスとデプロイメント) は、この名前空間に作成されます。

    ヘルム

    パラメーター

    リクエストを処理するクラスター内のバックエンドポッドを指定するには、envClustercluster-demo-1またはcluster-demo-2に設定します。

Argo CD CLIを使用したアプリケーションのデプロイ

  1. ACK One FleetインスタンスでGitOpsを有効にします。 詳細については、「フリートインスタンスのGitOpsの有効化」をご参照ください。

  2. Argo CDにアクセスします。 詳細については、「Argo CD CLIを使用したArgo CDへのログオン」をご参照ください。

  3. アプリケーションを作成してデプロイします。

    1. 次のコマンドを実行してGitリポジトリを追加します。

      argocd repo add https://github.com/AliyunContainerService/gitops-demo.git --name ackone-gitops-demos

      期待される出力:

      Repository 'https://github.com/AliyunContainerService/gitops-demo.git' added
    2. 次のコマンドを実行して、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
    3. 次のコマンドを実行してクラスターを照会します。

      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.
    4. アプリケーションモードを使用して、アプリケーションを作成し、移行先クラスターにデプロイします。

      1. apps-web-demo.yamlという名前のファイルを作成し、次のコンテンツをファイルに追加します。

        repoURLを実際のリポジトリURLに置き換えます。

        apps-web-demo.yamlを表示

        apiVersion: argoproj.io/v1alpha1
        kind: Application
        metadata:
          name: app-demo-cluster1
          namespace: argocd
        spec:
          destination:
            namespace: gateway-demo
            # https://1.1.XX.XX:6443
            server: ${cluster1_url}
          project: default
          source:
            helm:
              releaseName: "web-demo"
              parameters:
              - name: envCluster
                value: cluster-demo-1
              valueFiles:
              - values.yaml
            path: manifests/helm/web-demo
            repoURL: https://github.com/AliyunContainerService/gitops-demo.git
            targetRevision: gateway-demo
          syncPolicy:
            syncOptions:
            - CreateNamespace=true
        ---
        apiVersion: argoproj.io/v1alpha1
        kind: Application
        metadata:
          name: app-demo-cluster1
          namespace: argocd
        spec:
          destination:
            namespace: gateway-demo
            server: ${cluster2_url}
          project: default
          source:
            helm:
              releaseName: "web-demo"
              parameters:
              - name: envCluster
                value: cluster-demo-2
              valueFiles:
              - values.yaml
            path: manifests/helm/web-demo
            repoURL: https://github.com/AliyunContainerService/gitops-demo.git
            targetRevision: gateway-demo
          syncPolicy:
            syncOptions:
            - CreateNamespace=true
      2. 次のコマンドを実行して、アプリケーションをデプロイします。

        kubectl apply -f apps-web-demo.yaml
      3. 次のコマンドを実行して、アプリケーションを照会します。

        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オブジェクトを作成してマルチクラスタゲートウェイをデプロイし、関連付けられたクラスタをゲートウェイに接続します。

  1. ACK One FleetインスタンスのvSwitch IDを取得して記録します。 詳細については、「vSwitch IDの取得」をご参照ください。

  2. 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の名前。 この例では、マルチクラスタゲートウェイは、IngressClassesmseであるすべてのIngressをリッスンします。

  3. 次のコマンドを実行して、マルチクラスタゲートウェイをデプロイします。

    kubectl apply -f gateway.yaml
  4. 次のコマンドを実行して、マルチクラスタゲートウェイが作成され、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: クラウドネイティブゲートウェイが無効です。 [ステータス] フィールドのメッセージを確認して、問題をトラブルシューティングできます。

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

    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に自動的にルーティングします。 次の図は、トポロジを示しています。image.png

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

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

カナリアバージョンの確認

アクティブなゾーン冗長性のシナリオでは、次の方法を使用して、ビジネスに影響を与えずにアプリケーションのカナリアバージョンを確認できます。

既存のクラスターにアプリケーションを作成します。 サービスと展開の名前セレクターを指定します。 名前とセレクターが元のアプリケーション用に設定されたものと異なることを確認します。 次に、リクエストヘッダーに基づいてアプリケーションのカナリアバージョンを確認します。

  1. クラスター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
  2. 次のコマンドを実行して、canaryバージョンをクラスター1にデプロイします。

    kubectl apply -f new-app.yaml
  3. 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
  4. 次のコマンドを実行して、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

    期待される出力: image.png出力は、90% トラフィックがクラスタ1にルーティングされ、10% トラフィックがクラスタ2にルーティングされることを示します。

  • クラスタ1のすべてのバックエンドポッドがダウンしている場合、すべてのトラフィックをクラスタ2にルーティングする

    クラスター1のデプロイのレプリカ値が0に設定されている場合、次の結果が返されます。 出力は、トラフィックが自動的にクラスタ2にフェールオーバーされることを示します。image.png

  • 指定されたヘッダーを持つリクエストをカナリアバージョンにルーティングする

    次のコマンドを実行して、トラフィックルーティング情報を照会します。

    次のコマンドの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  

    期待される出力: image.png出力は、canary-dest: cluster1ヘッダーを持つリクエストがクラスター1のカナリアバージョンにルーティングされることを示します。

プライマリ /セカンダリのディザスタリカバリ

ACK One FleetインスタンスにIngressオブジェクトを作成して、プライマリ /セカンダリディザスタリカバリを実装します。

両方のクラスターのバックエンドポッドが正常な場合、トラフィックはクラスター1のバックエンドポッドにのみルーティングされます。 クラスター1のバックエンドポッドがダウンしている場合、ゲートウェイは自動的にトラフィックをクラスター2にルーティングします。 次の図は、トポロジを示しています。image.png

プライマリ /セカンダリディザスタリカバリを実装するためのIngressの作成

  1. ingress-demo-cluster-one.yamlという名前のファイルを作成し、次の内容をファイルに追加します。

    mse.ingress.kubernetes.io/service-subsetおよびmse.ingress.kubernetes.io/subset-labelsアノテーションをIngressオブジェクトのYAMLファイルに追加し、バックエンドのService service1を公開するために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
  2. 次のコマンドを実行して、ACK OneフリートインスタンスにIngressをデプロイします。

    kubectl apply -f ingress-demo-cluster-one.yaml -ngateway-demo

クラスターレベルのカナリアリリース

マルチクラスターゲートウェイを使用すると、Ingressをデプロイして、リクエストヘッダーに基づいてリクエストを特定のクラスターにルーティングできます。 この機能と、[プライマリ /セカンダリディザスタリカバリを実装するためのIngressの作成] セクションで作成されたIngressオブジェクトを使用して、負荷分散のためにすべてのレプリケートされたポッドにトラフィックを均等に分散し、指定されたヘッダーをカナリアバージョンに運ぶリクエストをルーティングできます。

  1. Ingressは、プライマリ /セカンダリディザスタリカバリを実装するためのIngressの作成セクションの手順に従って作成されます。

  2. ACK One Fleetインスタンスにヘッダー関連のアノテーションを含むIngressを作成して、クラスターレベルのカナリアリリースを実装します。 リクエストのヘッダーがIngressルールと一致すると、リクエストはカナリアバージョンのバックエンドポッドにルーティングされます。

    1. 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
    2. 次のコマンドを実行して、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

    期待される出力: image.png出力は、すべてのトラフィックがデフォルトでクラスター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

    期待される出力: image.png出力は、app-web-demo-version: grayヘッダーを持つリクエストがクラスター2のカナリアバージョンにルーティングされることを示します。

  • クラスター1がダウンしているときにトラフィックをクラスター2にルーティングする

    クラスター1のデプロイのレプリカ値が0に設定されている場合、次の結果が返されます。 出力は、トラフィックが自動的にクラスタ2にフェールオーバーされることを示します。image.png

関連ドキュメント

  • ACK One が提供するマルチクラスタゲートウェイを使用して南北トラフィックを管理する方法の詳細については、「南北トラフィックの管理」をご参照ください。

  • ACK One GitOpsを使用してアプリケーションを配布する方法の詳細については、「GitOpsの使い方」をご参照ください。