В Deckhouse Kubernetes Platform механизм Circuit Breaker реализуется средствами Istio (модуль istio) и обеспечивает следующие возможности:

  • временное исключение эндпоинта из балансировки, если превышен лимит ошибок;
  • настройка лимитов на количество TCP-соединений и количество запросов в сторону одного эндпоинта;
  • выявление зависших запросов и обрывание их с кодом ошибки (HTTP request timeout).

Пример настройки Circuit Breaker

Для выявления проблемных эндпоинтов используются настройки outlierDetection в кастомном ресурсе DestinationRule. Более подробно алгоритм Outlier Detection описан в документации Envoy.

Пример:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: reviews-cb-policy
spec:
  host: reviews.prod.svc.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100 # Максимальное число соединений в сторону host, суммарно для всех эндпоинтов.
      http:
        maxRequestsPerConnection: 10 # Каждые 10 запросов соединение будет пересоздаваться.
    outlierDetection:
      consecutive5xxErrors: 7 # Допускается 7 ошибок (включая `5xx`, TCP-таймауты и HTTP-таймауты)
      interval: 5m            # в течение 5 минут,
      baseEjectionTime: 15m   # после которых эндпоинт будет исключен из балансировки на 15 минут.

Также для настройки HTTP-таймаутов используется ресурс VirtualService. Эти таймауты учитываются и при подсчёте статистики ошибок на эндпоинтах.

Пример:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: my-productpage-rule
  namespace: myns
spec:
  hosts:
  - productpage
  http:
  - timeout: 5s
    route:
    - destination:
        host: productpage