0

我正在尝试在 Istio 中配置断路器。这是yaml。

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

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

我误解了它是如何工作的吗?有没有办法做到这一点?

4

2 回答 2

1

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

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 

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

另一个可能的问题可能是边车注入。请验证您的 pod 是否确实有一个(您应该会看到 pod 内已准备好 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
于 2021-06-08T11:10:06.950 回答
1

我认为您在outlier detectionand之间感到困惑circuit breaker based on connectionPool settings

您在 connectionPool 中应用的设置将配置一个断路器,如果违反任何限制,则电路将被触发,新请求将从 istio 代理获得即时 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),一旦违反,它将首次将该 pod 从 baseEjectionTime 的负载平衡中移除。也就是说,它将等待baseEjectionTime(在您的情况下为 1m)。到那时,不会向容易出错的 POD 发送新请求。1 分钟后,它会再次将 POD 添加到负载平衡池中。但是,如果这个 POD 再次违反了 Continuous5xxErrors(在您的情况下为 1),那么 istio 会将其从负载平衡中删除2xbaseEjectionTime在您的情况下,这将是 2 分钟。这将一直持续到您的 POD 返回非 5XX 错误为止。

于 2021-06-08T11:12:09.647 回答