Вибір протоколу
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 |
---|---|---|
http | Plaintext HTTP/1.1 трафік | Plaintext HTTP (1.1 або 2) трафік |
http2 | Plaintext 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, сучасні клієнти часто вибирають його.