Istio — Примеры

Пример 1 — Десятая часть трафика на новую версию

Новая версия checkout развёрнута рядом со старой, и команда хочет, чтобы фиксированная доля живых запросов попадала в неё, с мгновенным путём назад. Изменение доли не должно требовать развёртывания. Ниже правило, которое сейчас в силе.

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata: { name: checkout }
spec:
  hosts: ["checkout"]
  http:
    - route:
        - destination: { host: checkout, subset: old }

Решение

  http:
    - route:
        - destination: { host: checkout, subset: old }
          weight: 90
        - destination: { host: checkout, subset: new }
          weight: 10
запрос к checkout после изменения: GET /checkout/quote
направлен прокси рядом с каждой рабочей нагрузкой — код приложения не менялся, нагрузка не перезапускалась
откат: верните веса обратно на старый subset

Поскольку прокси рядом с каждой рабочей нагрузкой несёт вызовы, доля — это изменение конфигурации, а не релиз, и возврат обоих весов назад — это весь откат. То же правило может маршрутизировать по заголовку, чтобы тестировщики попадали на новый subset, а все остальные — нет. Обычная ошибка — развернуть новую версию под существующим именем сервиса, из-за чего выбрать между ними становится нечем.

Пример 2 — Повторы, умножающие нагрузку

Checkout стал медленным, и на каждый неудачный вызов к нему настроили пять повторов. Теперь он падает сильнее под нагрузкой, и одна медленная зависимость тянет вниз каждого вызывающего. Ниже правило, которое сейчас в силе. Ограничьте повторы и задайте вызову срок.

  http:
    - route:
        - destination: { host: checkout }
      retries: { attempts: 5 }

Решение

  http:
    - route:
        - destination: { host: checkout }
      timeout: 2s
      retries:
        attempts: 2
        perTryTimeout: 800ms
        retryOn: 5xx

Каждый переход через прокси добавляет компонент, который может отказать, и место, где теперь живёт конфигурация, а повторы, выданные сеткой, усиливают нагрузку на сервис, который и так борется. Ограниченное число попыток с тайм-аутом на попытку — это то, что не даёт одной медленной зависимости стать сбоем для всех. Эта политика принадлежит сетке только потому, что каждый вызов уже проходит через прокси; для одного сервиса хватило бы собственной маршрутизации платформы. Обычная ошибка — добавлять попытки без тайм-аута на попытку, из-за чего каждый повтор ждёт столько же, сколько исходный запрос.