Маршрутизація запитів

Це завдання показує, як налаштувати динамічну маршрутизацію запитів до декількох версій мікросервісу.

Перш ніж почати

Про це завдання

Демонстраційний застосунок Bookinfo від Istio складається з чотирьох окремих мікросервісів, кожен з яких має кілька версій. Три різні версії одного з мікросервісів, reviews, розгорнуті та працюють одночасно. Щоб ілюструвати проблему, яку це створює, відкрийте /productpage застосунку Bookinfo в оглядачі та кілька разів оновіть сторінку. URL-адреса: http://$GATEWAY_URL/productpage, де $GATEWAY_URL — це зовнішня IP-адреса ingress, як описано в документі Bookinfo.

Ви помітите, що іноді результат огляду книги містить оцінки зірочками, а іноді ні. Це відбувається тому, що без явного стандартного маршруту для версії сервісу Istio направляє запити на всі доступні версії за принципом кругового опитування.

Початковою метою цього завдання є застосування правил, які перенаправляють весь трафік на v1 (версія 1) мікросервісів. Пізніше ви застосуєте правило для маршрутизації трафіку на основі значення заголовка HTTP-запиту.

Маршрутизація на версію 1

Щоб спрямовувати маршрути лише на одну версію, налаштуйте правила маршрутизації, які стандартно надсилають трафік на версії сервісів.

  1. Виконайте наступну команду, щоб створити правила маршрутизації:

Istio використовує віртуальні сервіси для визначення правил маршрутизації. Виконайте наступну команду, щоб використовувати віртуальні сервіси, які маршрутизуватимуть увесь трафік на v1 кожного мікросервісу:

Zip
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@

Оскільки поширення конфігурації є зрештою узгодженим, зачекайте кілька секунд, щоб віртуальні сервіси набули чинності.

  1. Перегляньте визначені маршрути за допомогою наступної команди:
$ kubectl get virtualservices -o yaml
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - details
    http:
    - route:
      - destination:
          host: details
          subset: v1
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - productpage
    http:
    - route:
      - destination:
          host: productpage
          subset: v1
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - ratings
    http:
    - route:
      - destination:
          host: ratings
          subset: v1
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - reviews
    http:
    - route:
      - destination:
          host: reviews
          subset: v1

Ви можете також переглянути відповідні визначення subset за допомогою наступної команди:

$ kubectl get destinationrules -o yaml

Ви налаштували Istio для переходу до версії v1 мікросервісів Bookinfo, а саме на сервіс reviews версії 1.

Перевірка нової конфігурації маршрутизації

Ви можете легко перевірити нову конфігурацію, знову оновивши сторінку /productpage застосунку Bookinfo у вашому оглядачі. Зверніть увагу, що частина сторінки, присвячена оглядам, відображається без оцінок зірочками, незалежно від того, скільки разів ви оновлюєте сторінку. Це відбувається тому, що ви налаштували Istio для маршрутизації всього трафіку для сервісу оглядів на версію reviews:v1, і ця версія сервісу не звертається до сервісу оцінок зірочками.

Ви успішно завершили першу частину цього завдання: маршрутизація трафіку на одну версію сервісу.

Маршрутизація на основі ідентичності користувача

Далі ви зміните конфігурацію маршрутизації, щоб увесь трафік від певного користувача маршрутизувався до певної версії сервісу. У цьому випадку весь трафік від користувача на імʼя Jason буде маршрутизований до сервісу reviews:v2.

Цей приклад можливий завдяки тому, що сервіс productpage додає спеціальний заголовок end-user до всіх вихідних HTTP-запитів до сервісу оглядів.

Istio також підтримує маршрутизацію на основі сильно автентифікованого JWT на вхідному шлюзі, детальніше можна ознайомитися в розділі Маршрутизація на основі заявок JWT.

Нагадаємо, reviews:v2 — це версія, яка включає функцію оцінювання зірками.

  1. Виконайте наступну команду, щоб увімкнути маршрутизацію на основі імені користувача:
Zip
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@

Ви можете підтвердити створення правила за допомогою наступної команди:

$ kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1
  1. На сторінці /productpage застосунку Bookinfo увійдіть як користувач jason.

    Оновіть сторінку в браузері. Що ви бачите? Зоряні рейтинги з’являються поруч із кожним відгуком.

  2. Увійдіть як інший користувач (виберіть будь-яке ім’я на ваш вибір).

    Оновіть сторінку в браузері. Тепер зірки зникли. Це тому, що трафік спрямовується до reviews:v1 для всіх користувачів, крім Jason.

Ви успішно налаштували Istio для маршрутизації трафіку на основі ідентичності користувача.

Розуміння того, що сталося

У цьому завданні ви використовували Istio для спрямування 100% трафіку до версії v1 кожного з сервісів Bookinfo. Потім ви встановили правило, щоб вибірково спрямовувати трафік до версії v2 сервісу reviews на основі спеціального заголовка end-user, доданого до запиту сервісом productpage.

Зверніть увагу, що сервіси Kubernetes, як для Bookinfo, використані в цьому завданні, повинні дотримуватись певних обмежень, щоб скористатися перевагами функцій маршрутизації L7 від Istio. Детальніше дивіться в розділі Вимоги до Podʼів та Сервісів.

У завданні перемикання трафіку ви будете слідувати тій самій основній схемі, про яку ви дізнались тут, щоб налаштувати правила маршрутизації для поступового перенаправлення трафіку з однієї версії сервісу на іншу.

Очищення

  1. Видаліть правила маршрутизації застосунків:
Zip
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
  1. Якщо ви не плануєте виконувати подальші завдання, зверніться до інструкції вилучення Bookinfo, щоб завершити роботу застосунку.
Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

Дякуємо за ваш відгук!