ローカリティフェイルオーバー

このガイドに従って、メッシュのローカリティフェイルオーバーを構成します。

続行する前に、始める前にのステップを完了してください。

このタスクでは、`region1.zone1`内の`curl`ポッドを、`HelloWorld`サービスへのリクエストの送信元として使用します。その後、以下の順序でローカリティ間のフェイルオーバーを引き起こす障害を発生させます。

Locality failover sequence
ローカリティフェイルオーバーシーケンス

内部的には、Envoyの優先順位を使用してフェイルオーバーを制御します。`curl`ポッド(`region1` `zone1`内)から発信されるトラフィックには、以下の優先順位が割り当てられます。

優先順位ローカリティ詳細
0region1.zone1リージョン、ゾーン、サブゾーンがすべて一致。
1なしこのタスクではサブゾーンを使用しないため、異なるサブゾーンとの一致はありません。
2region1.zone2同じリージョン内の異なるゾーン。
3region2.zone3一致しませんが、`region1`->`region2`のフェイルオーバーが定義されています。
4region3.zone4一致せず、`region1`->`region3`のフェイルオーバーは定義されていません。

ローカリティフェイルオーバーの構成

以下の設定を行うDestinationRuleを適用します。

  • HelloWorldサービスに対する異常検出の設定を行います。これは、フェイルオーバーが正しく機能するために必要です。具体的には、サービスのエンドポイントが不健康な状態であることをサイドカープロキシに認識させ、最終的に次のロケーションへのフェイルオーバーをトリガーします。

  • リージョン間のフェイルオーバーポリシーを設定します。これにより、リージョン境界を越えたフェイルオーバーが予測可能な動作になります。

  • 各HTTPリクエストが新しい接続を使用するように強制する接続プールポリシーを設定します。このタスクでは、Envoyのドレイン機能を使用して、次のロケーションへのフェイルオーバーを強制します。ドレインされると、Envoyは新しい接続要求を拒否します。各リクエストが新しい接続を使用するため、ドレイン後すぐにフェイルオーバーが発生します。**この設定はデモ目的でのみ使用されます。**

$ kubectl --context="${CTX_PRIMARY}" apply -n sample -f - <<EOF
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: helloworld
spec:
  host: helloworld.sample.svc.cluster.local
  trafficPolicy:
    connectionPool:
      http:
        maxRequestsPerConnection: 1
    loadBalancer:
      simple: ROUND_ROBIN
      localityLbSetting:
        enabled: true
        failover:
          - from: region1
            to: region2
    outlierDetection:
      consecutive5xxErrors: 1
      interval: 1s
      baseEjectionTime: 1m
EOF

トラフィックが`region1.zone1`に残ることを確認する

curl podからHelloWorldサービスを呼び出します。

$ kubectl exec --context="${CTX_R1_Z1}" -n sample -c curl \
  "$(kubectl get pod --context="${CTX_R1_Z1}" -n sample -l \
  app=curl -o jsonpath='{.items[0].metadata.name}')" \
  -- curl -sSL helloworld.sample:5000/hello
Hello version: region1.zone1, instance: helloworld-region1.zone1-86f77cd7b-cpxhv

レスポンスのversionregion1.zoneであることを確認します。

この操作を数回繰り返し、レスポンスが常に同じであることを確認します。

`region1.zone2`へのフェイルオーバー

次に、region1.zone2へのフェイルオーバーをトリガーします。そのためには、region1.zone1内のHelloWorldEnvoyサイドカープロキシをドレインします。

$ kubectl --context="${CTX_R1_Z1}" exec \
  "$(kubectl get pod --context="${CTX_R1_Z1}" -n sample -l app=helloworld \
  -l version=region1.zone1 -o jsonpath='{.items[0].metadata.name}')" \
  -n sample -c istio-proxy -- curl -sSL -X POST 127.0.0.1:15000/drain_listeners

curl podからHelloWorldサービスを呼び出します。

$ kubectl exec --context="${CTX_R1_Z1}" -n sample -c curl \
  "$(kubectl get pod --context="${CTX_R1_Z1}" -n sample -l \
  app=curl -o jsonpath='{.items[0].metadata.name}')" \
  -- curl -sSL helloworld.sample:5000/hello
Hello version: region1.zone2, instance: helloworld-region1.zone2-86f77cd7b-cpxhv

最初の呼び出しは失敗し、フェイルオーバーがトリガーされます。コマンドをさらに数回繰り返し、レスポンスのversionが常にregion1.zone2であることを確認します。

`region2.zone3`へのフェイルオーバー

次に、region2.zone3へのフェイルオーバーをトリガーします。これまでと同様に、呼び出されたときに失敗するようにregion1.zone2HelloWorldを設定します。

$ kubectl --context="${CTX_R1_Z2}" exec \
  "$(kubectl get pod --context="${CTX_R1_Z2}" -n sample -l app=helloworld \
  -l version=region1.zone2 -o jsonpath='{.items[0].metadata.name}')" \
  -n sample -c istio-proxy -- curl -sSL -X POST 127.0.0.1:15000/drain_listeners

curl podからHelloWorldサービスを呼び出します。

$ kubectl exec --context="${CTX_R1_Z1}" -n sample -c curl \
  "$(kubectl get pod --context="${CTX_R1_Z1}" -n sample -l \
  app=curl -o jsonpath='{.items[0].metadata.name}')" \
  -- curl -sSL helloworld.sample:5000/hello
Hello version: region2.zone3, instance: helloworld-region2.zone3-86f77cd7b-cpxhv

最初の呼び出しは失敗し、フェイルオーバーがトリガーされます。コマンドをさらに数回繰り返し、レスポンスのversionが常にregion2.zone3であることを確認します。

`region3.zone4`へのフェイルオーバー

次に、region3.zone4へのフェイルオーバーをトリガーします。これまでと同様に、呼び出されたときに失敗するようにregion2.zone3HelloWorldを設定します。

$ kubectl --context="${CTX_R2_Z3}" exec \
  "$(kubectl get pod --context="${CTX_R2_Z3}" -n sample -l app=helloworld \
  -l version=region2.zone3 -o jsonpath='{.items[0].metadata.name}')" \
  -n sample -c istio-proxy -- curl -sSL -X POST 127.0.0.1:15000/drain_listeners

curl podからHelloWorldサービスを呼び出します。

$ kubectl exec --context="${CTX_R1_Z1}" -n sample -c curl \
  "$(kubectl get pod --context="${CTX_R1_Z1}" -n sample -l \
  app=curl -o jsonpath='{.items[0].metadata.name}')" \
  -- curl -sSL helloworld.sample:5000/hello
Hello version: region3.zone4, instance: helloworld-region3.zone4-86f77cd7b-cpxhv

最初の呼び出しは失敗し、フェイルオーバーがトリガーされます。コマンドをさらに数回繰り返し、レスポンスのversionが常にregion3.zone4であることを確認します。

おめでとうございます! ローカリティフェイルオーバーの設定に成功しました!

次のステップ

このタスクで使用したリソースとファイルをクリーンアップします。

この情報は役に立ちましたか?
改善のための提案はありますか?

ご意見ありがとうございます!