本指南演示了如何为服务网格中的客户端和服务器应用程序配置重试策略。

前置条件

  • Kubernetes 集群版本 v1.22.9 或者更高。
  • 已安装 OSM,版本 >= v1.2.0。
  • 已安装 osm CLI 用于管理服务网格。

演示

  1. 安装 OSM 时开启宽松模式和重试策略。

    1. osm install --set=osm.enablePermissiveTrafficPolicy=true --set=osm.featureFlags.enableRetryPolicy=true
  2. 在将 httpbin 命名空间加入到网格后,部署 httpbin 服务。httpbin 运行在 14001 端口。

    1. kubectl create namespace httpbin
    2. osm namespace add httpbin
    3. kubectl apply -f https://raw.githubusercontent.com/openservicemesh/osm-docs/release-v1.2/manifests/samples/httpbin/httpbin.yaml -n httpbin

    确认 httpbin pod 启动并运行。

    1. kubectl get svc,pod -n httpbin

    类似下面:

    1. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    2. httpbin ClusterIP 10.96.198.23 <none> 14001/TCP 20s
    3. NAME READY STATUS RESTARTS AGE
    4. httpbin-5b8b94b9-lt2vs 2/2 Running 0 20s
  3. 在将 curl 命名空间加入网格后,部署 curl 服务到命名空间下。

    1. kubectl create namespace curl
    2. osm namespace add curl
    3. kubectl apply -f https://raw.githubusercontent.com/openservicemesh/osm-docs/release-v1.2/manifests/samples/curl/curl.yaml -n curl

    确认 curl pod 启动并运行。

    1. kubectl get pods -n curl

    类似下面:

    1. NAME READY STATUS RESTARTS AGE
    2. curl-54ccc6954c-9rlvp 2/2 Running 0 20s
  4. 应用重试策略,当 curl ServiceAccount 发送请求到 httpbin 服务并收到 5xx 错误码时进行重试。

    1. kubectl apply -f - <<EOF
    2. kind: Retry
    3. apiVersion: policy.openservicemesh.io/v1alpha1
    4. metadata:
    5. name: retry
    6. namespace: curl
    7. spec:
    8. source:
    9. kind: ServiceAccount
    10. name: curl
    11. namespace: curl
    12. destinations:
    13. - kind: Service
    14. name: httpbin
    15. namespace: httpbin
    16. retryPolicy:
    17. retryOn: "5xx"
    18. perTryTimeout: 1s
    19. numRetries: 5
    20. retryBackoffBaseInterval: 1s
    21. EOF
  5. curl pod 发送一个会返回 503 响应的请求到 httpbin 服务。

    1. kubectl exec deploy/curl -n curl -c curl -- curl -sI httpbin.httpbin.svc.cluster.local:14001/status/503
  6. 在新终端会话中,执行下面的命令转发 curl pod 端口。

    1. kubectl port-forward deploy/curl -n curl 15000
  7. 查看 curlhttpbin 间的统计数据。

    1. curl -s localhost:15000/stats | grep "cluster.httpbin/httpbin|14001.upstream_rq_retry"

    curl pod 到 httpbin pod 的请求使用指数退避重试的次数应等于重试策略中的 numRetries 字段。 upstream_rq_retry_limit_exceeded 统计数据显示未重试的请求数,因为它超过了允许的最大重试次数 - numRetries

    1. cluster.httpbin/httpbin|14001.upstream_rq_retry: 5
    2. cluster.httpbin/httpbin|14001.upstream_rq_retry_backoff_exponential: 5
    3. cluster.httpbin/httpbin|14001.upstream_rq_retry_backoff_ratelimited: 0
    4. cluster.httpbin/httpbin|14001.upstream_rq_retry_limit_exceeded: 1
    5. cluster.httpbin/httpbin|14001.upstream_rq_retry_overflow: 0
    6. cluster.httpbin/httpbin|14001.upstream_rq_retry_success: 0
  8. curl pod 向 httpbin 服务发送一个返回非 5xx 状态码的 HTTP 请求。

    1. kubectl exec deploy/curl -n curl -c curl -- curl -sI httpbin.httpbin.svc.cluster.local:14001/status/404
  9. 指标不会增加,因为重试策略设置为在 5xx 时重试