地域故障转移

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

在开始之前,一定要完成开始之前这一节包含的步骤。

在此任务中,您将使用 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/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

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

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

下一步

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

这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!