【Outlier Detection】离群驱逐检测

通过目标规则配置离群检测,可以使服务网格在给定的一段时间长度内观察服务响应发生错误的次数。如果服务的某个端点的错误次数超过给定阈值,则将此服务端点标记为不健康,并将此端点移出服务的可用端点列表(即驱逐此端点)。后续请求将不再发往此端点,持续一段时间。本文介绍如何配置离群驱逐检测。

前提条件

已完成准备工作,并部署httpbin服务和sleep服务。具体操作,请参见准备工作

功能介绍

服务网格的离群驱逐检测简要过程如下:

  1. 当有请求发往服务时,服务网格会记录一段时间内服务每个端点响应的错误数量(响应码为5xx的HTTP响应被视为错误),这段时间的长度由驱逐检查间隔interval)规定。

  2. 当错误数量超过一定的阈值时,将触发离群驱逐,将此服务端点标记为不健康,并将此端点移出服务的可用端点列表,这个阈值由主机驱逐前连续错误数consecutiveErrors)规定。

    说明

    如果驱逐此端点后,可用的服务端点占总服务端点占比将低于一个给定占比,则不会驱逐此服务端点,这个占比由被驱逐主机的最大占比(maxEjectionPercent)规定。

  3. 服务端点被驱逐后,将在一个给定的基础时长内不会再收到请求,这段时间结束后驱逐结束,服务端点将重新回到可用的服务端点列表。若此服务端点第二次因连续返回5xx错误被驱逐,则第二次被驱逐的时间将是2倍的基础时长(第三次被驱逐时间为3次基础时长,以此类推)。这个基础时长由主机被驱逐的最短时长baseEjectionTime)规定。

操作步骤

  1. 为httpbin服务配置目标规则,实现对httpbin服务的离群驱逐检测。

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择流量管理中心 > 目标规则

    3. 目标规则页面,单击创建,进行如下配置,单击预览,确认YAML内容无误后,单击确认,然后单击创建image.png

      预览的YAML如下。

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: httpbin
        namespace: default
        labels: {}
      spec:
        host: httpbin.default.svc.cluster.local
        trafficPolicy:
          outlierDetection:
            consecutiveErrors: 1
            interval: 1s
            baseEjectionTime: 15s
            maxEjectionPercent: 100
      
  2. 验证离群驱逐是否生效。

    1. 在ACK集群对应的KubeConfig环境下,执行以下命令。

      kubectl -n legacy exec -it deploy/sleep -- curl httpbin.legacy:8000/status/502 -I

      预期输出:

      HTTP/1.1 502 Bad Gateway
      server: envoy
      date: xxx, xx xxx 202x xx:xx:xx GMT
      content-type: text/html; charset=utf-8
      access-control-allow-origin: *
      access-control-allow-credentials: true
      content-length: 0
      x-envoy-upstream-service-time: 4

      由于配置了在1s内产生一次错误响应即判断服务端点被驱逐,且被驱逐主机的最大占比为100%,此时httpbin服务唯一的端点已经被驱逐,再次访问服务将不可用。

    2. 在15s内再次执行以下命令。

      kubectl -n legacy exec -it deploy/sleep -- curl httpbin.legacy:8000/status/502 -I

      预期输出:

      HTTP/1.1 503 Service Unavailable
      content-length: 19
      content-type: text/plain
      date: xxx, xx xxx 202x xx:xx:xx GMT
      server: envoy

      预期输出表明访问httpbin服务的/status/502路径,服务不再返回502错误码,而是返回503 Service Unavailable,表明httpbin服务所有的端点都已被驱逐,离群驱逐生效。