地域故障转移

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

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

在此任务中,您将使用 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 将拒绝所有新的请求。由于每个请求都使用一个新连接,这将导致在耗尽后立即进行故障转移。此配置仅用于演示目的。

$ kubectl --context="${CTX_PRIMARY}" apply -n sample -f - <<EOF
apiVersion: networking.istio.io/v1beta1
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

sleep Pod 调用 helloWorld 服务:

$ kubectl exec --context="${CTX_R1_Z1}" -n sample -c sleep \
  "$(kubectl get pod --context="${CTX_R1_Z1}" -n sample -l \
  app=sleep -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.zone1helloWorld 逐出 Envoy Sidecar 代理

$ 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

sleep Pod 调用 helloWorld 服务:

$ kubectl exec --context="${CTX_R1_Z1}" -n sample -c sleep \
  "$(kubectl get pod --context="${CTX_R1_Z1}" -n sample -l \
  app=sleep -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。正如您之前所做的,配置 helloWorldregion1.zone2 中调用失败。

$ 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

sleep Pod 调用 helloWorld 服务:

$ kubectl exec --context="${CTX_R1_Z1}" -n sample -c sleep \
  "$(kubectl get pod --context="${CTX_R1_Z1}" -n sample -l \
  app=sleep -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。正如您之前所做的, 配置 helloWorldregion2.zone3 中调用失败。

$ 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

sleep Pod 调用 helloWorld 服务:

$ kubectl exec --context="${CTX_R1_Z1}" -n sample -c sleep \
  "$(kubectl get pod --context="${CTX_R1_Z1}" -n sample -l \
  app=sleep -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

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

下一步

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

这些信息有用吗?
Do you have any suggestions for improvement?

Thanks for your feedback!