ローカリティフェイルオーバー
このガイドに従って、メッシュのローカリティフェイルオーバーを構成します。
続行する前に、始める前にのステップを完了してください。
このタスクでは、`region1.zone1`内の`curl`ポッドを、`HelloWorld`サービスへのリクエストの送信元として使用します。その後、以下の順序でローカリティ間のフェイルオーバーを引き起こす障害を発生させます。
内部的には、Envoyの優先順位を使用してフェイルオーバーを制御します。`curl`ポッド(`region1` `zone1`内)から発信されるトラフィックには、以下の優先順位が割り当てられます。
優先順位 | ローカリティ | 詳細 |
---|---|---|
0 | region1.zone1 | リージョン、ゾーン、サブゾーンがすべて一致。 |
1 | なし | このタスクではサブゾーンを使用しないため、異なるサブゾーンとの一致はありません。 |
2 | region1.zone2 | 同じリージョン内の異なるゾーン。 |
3 | region2.zone3 | 一致しませんが、`region1`->`region2`のフェイルオーバーが定義されています。 |
4 | region3.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
レスポンスのversion
がregion1.zone
であることを確認します。
この操作を数回繰り返し、レスポンスが常に同じであることを確認します。
`region1.zone2`へのフェイルオーバー
次に、region1.zone2
へのフェイルオーバーをトリガーします。そのためには、region1.zone1
内のHelloWorld
のEnvoyサイドカープロキシをドレインします。
$ 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.zone2
のHelloWorld
を設定します。
$ 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.zone3
のHelloWorld
を設定します。
$ 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
であることを確認します。
おめでとうございます! ローカリティフェイルオーバーの設定に成功しました!
次のステップ
このタスクで使用したリソースとファイルをクリーンアップします。