【问题标题】:How to make a circuit-breaker in Istio?如何在 Istio 中制作断路器?
【发布时间】:2021-06-07 16:22:11
【问题描述】:

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

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

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

我是否误解了它的工作原理?有什么方法可以实现吗?

【问题讨论】:

  • 您是否启用了 istio sidecar 注入?目标服务中有多少个 pod?你试过documentation的例子吗?

标签: proxy istio envoyproxy servicemesh


【解决方案1】:

我认为您混淆了 outlier detectioncircuit 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 错误为止。

【讨论】:

  • 我不想在极限的基础上断路。我想在 5xx 错误的基础上打破它。是否可以与 connectionPool 设置有关?如果没有,有什么解决办法?
  • 您正在处理 5xx 错误,但在 pod 级别,而不是在服务级别。如果您有一个 pod,那么您将立即看到该行为,否则将在从 LB 中删除所有 pod 之前对其进行尝试。如果将 maxEjectionPercent 设置为 100,则可以删除所有 pod,您将收到服务级别 503 错误。
【解决方案2】:

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

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

由于它默认为 10%,这意味着只有 10% 的部署会被断路器弹出。出于测试目的,您可以尝试将其设置为 100%,类似于 documentiation to demonstrate this

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-10
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2021-08-13
    • 2023-03-20
    • 2016-06-06
    相关资源
    最近更新 更多