Kubernetes Gateway API
Окрім власного API для управління трафіком, Istio підтримує Kubernetes Gateway API6 і має намір зробити його стандартним API для управління трафіком в майбутньому. Цей документ описує відмінності між API Istio та Kubernetes і надає простий приклад, який показує, як налаштувати Istio для експонування сервісу за межі кластера службової мережі, використовуючи Gateway API. Зверніть увагу, що ці API є активно еволюціями API Kubernetes Service7 та Ingress8, що активно розвиваються.
Налаштування
API Gateway не встановлені стандартно ну більшості кластерів Kubernetes. Встановіть CRD для Gateway API, якщо вони відсутні:
Встановіть Istio, використовуючи профіль
minimal
:
Відмінності від API Istio
API Gateway мають багато спільного з API Istio, такими як Gateway та VirtualService. Основний ресурс має ту ж назву, Gateway
, і ресурси служать подібним цілям.
Нові API Gateway прагнуть використати досвід різних реалізацій Kubernetes ingress, включаючи Istio, щоб створити стандартизований нейтральний до постачальника API. Ці API зазвичай виконують ті ж функції, що й Istio Gateway та VirtualService, з кількома ключовими відмінностями:
- В API Istio,
Gateway
конфігурує наявний Deployment/Service шлюзу, який був розгорнутий11. В API Gateway ресурсGateway
конфігурує і розгортає шлюз. Див. Методи розгортання для отримання додаткової інформації. - У
VirtualService
Istio всі протоколи конфігуруються в одному ресурсі. В API Gateway кожен тип протоколу має свій ресурс, наприклад,HTTPRoute
таTCPRoute
. - Хоча API Gateway пропонують багато розширених функцій маршрутизації, вони ще не охоплюють 100% функціональності Istio. Триває робота над розширенням API для покриття цих випадків використання, а також над використанням розширюваності API для кращого відображення функціональності Istio.
Налаштування Gateway
Див. документацію Gateway API12 для отримання інформації про API.
У цьому прикладі ми розгорнемо простий застосунок та експонуємо його назовні за допомогою Gateway
.
Спочатку розгорніть тестовий застосунок
httpbin
:Розгорніть конфігурацію Gateway API, включаючи один експонований маршрут (тобто
/get
):Встановіть змінну оточення Ingress Host:
Зверніться до сервісу
httpbin
за допомогою curl:Зверніть увагу на використання прапорця
-H
для встановлення HTTP-заголовка Host на “httpbin.example.com”. Це необхідно, оскількиHTTPRoute
налаштовано на обробку “httpbin.example.com”, але у вашому тестовому середовищі ви не маєте привʼязки DNS для цього хосту і просто надсилаєте запит на вхідну IP-адресу.Перейдіть за будь-якою іншою URL-адресою, яка не була відкрита явно. Ви побачите помилку HTTP 404:
Оновіть правило маршруту, щоб воно також враховувало
/headers
і додавало заголовок до запиту:Знову зверніться до
/headers
і помітьте, що до запиту було додано заголовокMy-Added-Header
:
Методи розгортання
В наведеному вище прикладі не потрібно було встановлювати Deployment
для ingress gateway перед налаштуванням Gateway
. У стандартній конфігурації Deployment
та Service
для gateway автоматично створюються на основі конфігурації Gateway
.
Для складніших випадків використання також дозволено ручне розгортання.
Автоматизоване розгортання
Стандартно кожен Gateway
автоматично створює Service
та Deployment
з тим самим імʼям. Ці конфігурації автоматично оновлюватимуться, якщо Gateway
зміниться (наприклад, якщо буде додано новий порт).
Ці ресурси можна налаштувати кількома способами:
Анотації та мітки на
Gateway
будуть скопійовані доService
таDeployment
. Це дозволяє налаштовувати такі речі, як Внутрішні балансувальники навантаження, які читають з цих полів.Istio пропонує додаткову анотацію для налаштування створених ресурсів:
Анотація Призначення networking.istio.io/service-type
Контролює поле Service.spec.type
. Наприклад, встановітьClusterIP
, щоб не відкривати сервіс зовні. Стандартне значення —LoadBalancer
.Поле
Service.spec.loadBalancerIP
може бути явно задано шляхом конфігурації поляaddresses
:
Примітка: можна вказати лише одну адресу.
- (Додатково) Згенеровану конфігурацію Pod можна налаштувати за допомогою власних шаблонів інʼєкцій.
Прикріплення ресурсів і масштабування
Ресурси можуть бути прикріплені до Gateway
для його налаштування. Однак більшість ресурсів Kubernetes наразі не підтримують пряме прикріплення до Gateway
, але їх можна прикріпити до відповідних згенерованих Deployment
і Service
замість цього. Це легко зробити, оскільки ресурси генеруються з відомими мітками (gateway.networking.k8s.io/gateway-name: <імʼя шлюзу>
) та іменами:
- Gateway:
<gateway name>-<gateway class name>
- Waypoint:
<gateway name>
Наприклад, щоб розгорнути Gateway
з HorizontalPodAutoscaler
і PodDisruptionBudget
:
Ручне розгортання
Якщо ви не хочете автоматичного розгортання, Deployment
і Service
можна налаштувати вручну11.
При цьому вам буде потрібно вручну зв’язати Gateway
з Service
, а також підтримувати їх конфігурацію портів в актуальному стані.
Для підтримки Policy Attachment, наприклад, коли ви використовуєте поле targetRef
в AuthorizationPolicy, вам також потрібно вказати імʼя вашого Gateway
, додавши наступну мітку до вашого podʼа шлюзу: gateway.networking.k8s.io/gateway-name: <імʼя шлюзу>
.
Щоб зв’язати Gateway
з Service
, налаштуйте поле addresses
, щоб воно вказувало на один Hostname
.
Трафік mesh-мережі
API Gateway також можна використовувати для налаштування трафіку мережі. Це робиться шляхом налаштування parentRef
, щоб вказувати на сервіс, а не на шлюз.
Наприклад, щоб додати заголовок до всіх запитів до сервісу всередині кластера з назвою example
:
Більш детальну інформацію та приклади можна знайти в інших завданнях з управління трафіком3.
Очищення
Видаліть зразок
httpbin
і шлюз:Видаліть Istio:
Видаліть CRD API шлюзу, якщо вони більше не потрібні: