Вибір протоколу

Istio підтримує проксіювання будь-якого TCP трафіку. Це включає HTTP, HTTPS, gRPC, а також необроблений TCP протоколи. Для надання додаткових можливостей, таких як маршрутизація і розширені метрики, протокол повинен бути визначений. Це можна зробити автоматично або явно вказати.

Протоколи, які не базуються на TCP, такі як UDP, не проксіюються. Ці протоколи продовжать працювати як зазвичай, без будь-якого перехоплення з боку проксі Istio, але не можуть використовуватися в компонентах проксі, таких як шлюзи вхідного або вихідного трафіку.

Автоматичний вибір протоколу

Istio може автоматично виявляти HTTP та HTTP/2 трафік. Якщо протокол не може бути автоматично визначено, трафік буде оброблятися як звичайний TCP трафік.

Явний вибір протоколу

Протоколи можна вказати вручну в визначенні Сервісу.

Це можна налаштувати двома способами:

  • За допомогою назви порту: name: <protocol>[-<suffix>].
  • У Kubernetes 1.18+ за допомогою поля appProtocol: appProtocol: <protocol>.

Якщо обидва визначені, appProtocol має перевагу над назвою порту.

Зверніть увагу, що поведінка у Gateway відрізняється в деяких випадках, оскільки шлюз може термінувати TLS і протокол може бути погоджено.

Підтримуються наступні протоколи:

ПротоколМета SidecarМета Gateway
httpPlaintext HTTP/1.1 трафікPlaintext HTTP (1.1 або 2) трафік
http2Plaintext HTTP/2 трафікPlaintext HTTP (1.1 або 2) трафік
httpsШифровані TLS дані. Оскільки Sidecar не розшифровує TLS трафік, це те ж саме, що і tlsШифрований TLS HTTP (1.1 або 2) трафік
tcpНепрозорий TCP потік данихНепрозорий TCP потік даних
tlsШифровані TLS даніШифровані TLS дані
grpc, grpc-webТе ж саме, що і http2Те ж саме, що і http2
mongo, mysql, redisЕкспериментальна підтримка протоколу застосунків. Щоб увімкнути їх, налаштуйте відповідні змінні середовища. Якщо не увімкнено, обробляються як непрозорий TCP потік данихЕкспериментальна підтримка протоколу застосунків. Щоб увімкнути їх, налаштуйте відповідні змінні середовища. Якщо не увімкнено, обробляються як непрозорий TCP потік даних

Нижче наведено приклад Сервісу, який визначає порт https за допомогою appProtocol і порт http за допомогою назви:

kind: Service
metadata:
  name: myservice
spec:
  ports:
  - port: 3306
    name: database
    appProtocol: https
  - port: 80
    name: http-web

Вибір протоколу HTTP gateway

На відміну від sidecars, шлюзи стандартно не можуть автоматично визначити конкретний HTTP протокол для використання при пересиланні запитів до бекенд-сервісів. Тому, якщо явний вибір протоколу не використовується для вказання HTTP/1.1 (http) або HTTP/2 (http2 або grpc), шлюзи будуть пересилати всі вхідні HTTP запити, використовуючи HTTP/1.1.

Замість використання явного вибору протоколу, ви можете інструктувати шлюзи пересилати запити, використовуючи той самий протокол, як і вхідний запит, налаштувавши useClientProtocol для Сервісу. Зверніть увагу, що використання цієї опції з сервісами, які не підтримують HTTP/2, може бути ризикованим, оскільки HTTPS шлюзи завжди оголошують підтримку для HTTP/1.1 та HTTP/2. Тому навіть коли бекенд сервіс не підтримує HTTP/2, сучасні клієнти часто вибирають його.

Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

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