如何在Istio中制作断路器



我正在尝试在Istio中配置一个断路器。这是山芋。

trafficPolicy:
connectionPool:
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
tcp:
maxConnections: 1
outlierDetection:
baseEjectionTime: 1m
consecutive5xxErrors: 1
interval: 1s

我在JMeter中有一个线程组列表,这些线程组将不断地访问与上述断路器相关的服务。在收到错误响应后,它应该使服务在1分钟内不可用。但是,这并没有发生。

我是不是误解了它的工作原理?有什么办法做到这一点吗?

我认为您混淆了outlier detectioncircuit breaker based on connectionPool settings

您在connectionPool中应用的设置将配置一个断路器,如果违反任何限制,则电路将跳闸,新请求将从istio-proxy获得immediate 503响应。在中,新的请求将不会发送到应用程序。但是,代理将尽快接受新请求(当接受新请求未违反限制时(。在这种情况下,不存在断路1分钟的情况。

异常值检测不同。这是通过从负载平衡池中跳闸一个特定的易出错POD来实现的。假设您有4个副本pod正在为您的部署运行。假设其中一个POD出现5xx错误(The 503 errors sent by proxy, like in the connection pool breach case, are not counted here.此计数是您的应用程序错误(。在这种情况下,istio将等待连续的5xxErrors(在您的情况下为1(,一旦违反了这一点,它将首次从baseEjectionTime的负载平衡中删除该pod。也就是说,它将等待baseEjectionTime(在您的情况下为1m(。在此之前,不会向出现错误的POD发送新的请求。1分钟后,它将再次将POD添加到负载平衡池中。但是,如果这个POD再次违反了连续的5xxErrors(在您的情况下为1(,那么istio将把它从2xbaseEjectionTime的负载平衡中删除,在您的例子中这将是2分钟。这将一直持续下去,直到您的POD返回非5XX错误。

根据您提供的信息,我认为问题可能是您的DestiationRule:中没有设置参数maxEjectionPercent

maxEjectionPercent-可以弹出的上游服务的负载平衡池中主机的最大百分比。默认为10%。

由于默认为10%,这意味着只有10%的部署将被断路器弹出。出于测试目的,您可能会尝试将其设置为100%,类似于演示这一点的文档:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: httpbin
spec:
host: httpbin
trafficPolicy:
connectionPool:
tcp:
maxConnections: 1
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
outlierDetection:
consecutive5xxErrors: 1
interval: 1s
baseEjectionTime: 3m
maxEjectionPercent: 100 👈

我已经在文档中测试了这个例子,它对我来说很好。

另一个可能的问题可能是sidecar注入。请验证您的吊舱是否真的有一个(您应该看到吊舱内准备好了2个集装箱中的2个(:

~  kgp                                                                                                                                    ✔  cluster-1 ⎈
NAME                             READY   STATUS    RESTARTS   AGE
fortio-deploy-576dbdfbc4-9crcf   2/2     Running   0          46m
httpbin-74fb669cc6-mg9rh         2/2     Running   0          48m

最新更新