地域故障转移

请按照本指南为您的网格配置地域故障转移。

在开始之前,一定要完成的步骤 开始之前

在此任务中,您将使用 sleep pod 在 region1.zone1 作为请求源发送到 helloWorld 服务。然后,您将触发故障,这些故障将按照以下顺序导致不同地域之间的故障转移:

地域故障转移顺序

地域故障转移顺序

在内部,Envoy 优先级用于控制故障转移。 这些优先级将按照以下方式分配来自 sleep Pod (在 region1 zone1) 的流量:

优先级地域细节
0region1.zone1地区、区域、分区全部匹配。
1None由于此任务不使用分区,因此没有其他分区的匹配项。
2region1.zone2同一个地区内的不同区域。
3region2.zone3没有匹配项,但是为 region1->region2 定义了故障转移。
4region3.zone4没有匹配项并且没有为 region1->region3 定义故障转移。

配置地域故障转移

应用一个 DestinationRule 配置如下:

  • 异常检测 用于 helloWorld 服务。这是故障转移正常运行所必须的。特别是,它可以配置 Sidecar 代理以知道服务的 Endpoint 何时不正常,最终触发故障转移到下一个地域。

  • 故障转移 地区之间的策略,这确保了超出地区边界的故障转移将具有可预测的行为。

  • 连接池 强制每个HTTP请求使用一个新连接的策略。该任务利用 Envoy 的 逐出 功能强制将故障转移到下一个位置。一旦逐出,Envoy 将拒绝所有新的请求。由于每个请求都使用一个新连接,这将导致在耗尽后立即进行故障转移。此配置仅用于演示目的。

  1. $ kubectl --context="${CTX_PRIMARY}" apply -n sample -f - <<EOF
  2. apiVersion: networking.istio.io/v1beta1
  3. kind: DestinationRule
  4. metadata:
  5. name: helloworld
  6. spec:
  7. host: helloworld.sample.svc.cluster.local
  8. trafficPolicy:
  9. connectionPool:
  10. http:
  11. maxRequestsPerConnection: 1
  12. loadBalancer:
  13. simple: ROUND_ROBIN
  14. localityLbSetting:
  15. enabled: true
  16. failover:
  17. - from: region1
  18. to: region2
  19. outlierDetection:
  20. consecutive5xxErrors: 1
  21. interval: 1s
  22. baseEjectionTime: 1m
  23. EOF

验证流量保持在 region1.zone1 {#verify-traffic-stays-in-region1.zone1}

sleep Pod 调用 helloWorld 服务:

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

验证响应中的 versionregion1.zone

重复几次,验证响应总是相同的。

故障转移到 region1.zone2 {#failover-to-region1.zone2}

接下来, 触发故障转移到 region1.zone2。为此,您在 region1.zone1helloWorld 逐出 Envoy Sidecar 代理

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

sleep Pod 调用 helloWorld 服务:

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

第一个调用将失败,这将触发故障转移。多次重复该命令,并验证响应中的 version 始终为 region1.zone2

故障转移到 region2.zone3 {#failover-to-region2.zone3}

现在触发故障转移到 region2.zone3。正如您之前所做的,配置 helloWorldregion1.zone2 中调用失败。

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

sleep Pod 调用 helloWorld 服务:

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

第一个调用将失败,这将触发故障转移。多次重复该命令,并验证响应中的 version 始终为 region2.zone3

故障转移到 region3.zone4 {#failover-to-region3.zone4}

现在触发故障转移到 region3.zone4。正如您之前所做的, 配置 helloWorldregion2.zone3 中调用失败。

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

sleep Pod 调用 helloWorld 服务:

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

第一次调用将失败,这将触发故障转移。多次重复该命令,并验证响应中的 version 始终为 region3.zone4

恭喜! 您成功配置了地域故障转移!

下一步

清除 此任务中的资源和文件。