Gateway API — современная альтернатива Ingress
Что нужно знать перед уроком
- M1.08 — Ingress — нужен запущенный Gitea из прошлого урока — мы переводим его на Gateway API
- M1.11 — RBAC (забегая вперёд по смыслу) — ролевая модель Gateway API методически параллельна разделению прав в RBAC
Что нужно знать перед уроком
M1 урок 8 — Ingress, IngressClass, pathType, TLS-терминация, ловушка use-regex. У вас должен быть развёрнут Gitea с Ingress из прошлого урока — мы переведём его на HTTPRoute.
Теория
Ролевая модель — три персоны
Официальная документация Gateway API вводит ролевую модель из трёх персон, которая явно разделяет ответственность:
| Персона | Роль | Создаёт |
|---|---|---|
| Ian (infrastructure provider) | владеет физической инфраструктурой балансировки | GatewayClass (cluster-scoped) |
| Chihiro (cluster operator) | настраивает точки входа для команд разработки | Gateway (обычно тоже администратор кластера) |
| Ana (application developer) | разрабатывает конкретный сервис | только HTTPRoute/GRPCRoute в своём namespace |
GatewayClass/Gateway — cluster-wide инфраструктура (как Module), HTTPRoute — namespaced объект, который вправе создавать сам разработчик (как Application). Тот же принцип разделения прав будет формализован в M1 уроке 11 (RBAC) и в M2 уроке 1.Три ключевых ресурса
| |
Матчинг и фильтры HTTPRoute
Матчинг задаётся в rules[].matches[] и может комбинировать несколько условий (логическое И внутри одного matches, ИЛИ между элементами списка matches):
| |
Три типа path-матчинга: Exact, PathPrefix (аналог Prefix у Ingress, по сегментам) — оба относятся к Core conformance (обязательны для всех реализаций); RegularExpression — штатное поле схемы API (в отличие от Ingress, где нужна отдельная аннотация конкретного контроллера с побочными эффектами на соседние правила, как use-regex у ingress-nginx), но при этом у него официально custom conformance: спецификация explicitly разрешает разным реализациям использовать разные regex-движки (POSIX, PCRE, RE2 и т. д.), поэтому поведение одного и того же выражения между разными контроллерами не гарантировано идентичным — портируем сам факт наличия поля в API, а не гарантированную семантику конкретного regex.
Фильтры трансформируют запрос/ответ до отправки на backend:
| |
Traffic splitting по весу — то, чего нет у обычного Ingress
Одна из главных практических причин выбирать Gateway API — нативная поддержка канареечных релизов через несколько backendRefs с разными весами, без сторонних CRD (Ingress для этого требует расширений конкретного контроллера, например аннотаций canary у ingress-nginx):
| |
ReferenceGrant — устранение неявной «дыры доверия» Ingress
У обычного Ingress есть скрытая проблема: Ingress в namespace A может сослаться на Service в namespace B без какого-либо явного разрешения со стороны B (если версия/контроллер это позволяет) — то есть namespace B не может проконтролировать, кто на него ссылается. Gateway API решает это через обязательный (Core conformance) механизм ReferenceGrant, ресурс на apiVersion: gateway.networking.k8s.io/v1 (графован в GA вместе с остальными переходами на Standard channel в Gateway API v1.5.0, релиз 27 февраля 2026 — до этого релиза ресурс был на v1beta1):
| |
Без соответствующего ReferenceGrant в namespace-получателе cross-namespace ссылка (Gateway→HTTPRoute из другого namespace, Gateway→Secret с TLS-сертификатом в другом namespace) будет отклонена — namespace явно контролирует, кто может на него ссылаться, а не наоборот.
Терминология при миграции: host → hostnames
| Ingress | Gateway API | Нюанс |
|---|---|---|
spec.rules[].host (одно правило — один host) | spec.hostnames (список) | правила HTTPRoute применяются ко всем hostnames Route одновременно, а не по одному, как у Ingress |
pathType: Prefix | path.type: PathPrefix | семантика идентична |
| аннотации конкретного контроллера | штатные filters | портируемость между реализациями |
Где заканчивается L7 и начинается L4
HTTPRoute/GRPCRoute — HTTP/HTTPS terminate (L7). TLSRoute — TLS terminate или passthrough (пограничный случай). TCPRoute/UDPRoute — чистый L4, без осведомлённости о содержимом трафика вообще. Application-разработчику в подавляющем большинстве случаев нужен только HTTPRoute.
Deckhouse-практика: модуль alb
В Deckhouse Gateway API реализован модулем alb. Административная часть (GatewayClass+Gateway в терминах ванильного Gateway API) объединена в один cluster-wide ресурс ClusterALBInstance, который создаёт администратор кластера. Но ListenerSet и HTTPRoute — уже namespaced-ресурсы, которые Application-разработчик создаёт сам, в своём namespace, ссылаясь на Gateway, доступный через status ClusterALBInstance. ListenerSet — не экспериментальная фича: ресурс графован в Standard channel (GA) начиная с Gateway API v1.5.0 (релиз 27 февраля 2026), то есть это такая же стабильная часть API, как HTTPRoute, а не alpha/beta-надстройка Deckhouse:
| |
Документация Deckhouse по модулю ALB перечисляет три равноправных способа L7-балансировки в Deckhouse: модуль ingress-nginx (классический Ingress), Gateway API через модуль alb, и istio (сервис-меш с собственной моделью). Официальная позиция платформы (FAQ по Ingress): ingress-nginx поддерживается весь жизненный цикл платформы независимо от статуса апстрима — это не «устаревающая технология под давлением», а осознанный путь миграции для тех, кому нужны traffic splitting и cross-namespace-безопасность из коробки.
Частые ошибки и подводные камни
- Пытаться создать
Gatewayсамостоятельно как Application-разработчик. По ролевой модели это ресурс администратора (Chihiro) — вам, как Ana, доступен толькоHTTPRoute(и в Deckhouse —ListenerSet), ссылающийся на существующийGateway/ClusterALBInstance. - Забыть про
ReferenceGrantпри cross-namespace ссылках. Без негоGatewayиз инфраструктурного namespace не сможет легитимно принятьHTTPRouteиз вашего namespace, если контроллер строго следует Core conformance. - Ожидать поведение host-специфичных правил Ingress.
hostnamesHTTPRoute— список, и правила применяются к каждому имени из списка одинаково — в отличие от Ingress, где можно было явно завязать разные правила на разныеhostв одном объекте.
Практика в кластере
Переводим уже развёрнутый в прошлом уроке Gitea с Ingress на пару ListenerSet+HTTPRoute (в терминах модуля alb — упрощаем до ванильного API Gateway API, если alb не включён на вашем CE-кластере, синтаксис ресурсов совпадает).
- Проверьте, что в кластере включён Gateway API CRD и (если используете Deckhouse) модуль
alb:
| |
- Создайте
HTTPRoute, ссылающийся на существующийGateway/ClusterALBInstance(или на тестовыйGateway, если ставите ванильный контроллер отдельно):
| |
- Проверьте статус привязки
HTTPRouteкGateway(условиеAccepted/ResolvedRefsвstatus.parents):
| |
- Добавьте canary-роут с весовым сплитом на вторую (тестовую) версию Gitea:
| |
- Удалите старый
Ingressиз M1.08, оставив только Gateway API-путь:
| |
Практика разработки
Ресурсы Gateway API — чистые манифесты Kubernetes, отдельной сборки в этом уроке нет.
Шпаргалка команд урока
| |
Вопросы для самопроверки
HTTPRoute — единственный из трёх ключевых ресурсов, который по модели вправе создавать сам разработчик приложения в своём namespace.
Источник: Gateway API — Roles and personas
weight — часть штатной спецификации backendRefs у HTTPRoute; для canary в Ingress нужны нестандартные аннотации, специфичные для каждого контроллера.
Источник: Gateway API — HTTPRoute
ReferenceGrant — Core conformance механизм, который получатель ссылки (namespace) явно выставляет, разрешая конкретные типы cross-namespace ссылок.
Источник: Gateway API — ReferenceGrant
ClusterALBInstance — cluster-wide ресурс alb, аналог связки GatewayClass+Gateway ванильного API, создаётся администратором; ListenerSet и HTTPRoute — namespaced, доступны разработчику.
Источник: Deckhouse — Alb gateway api
Официальная FAQ-позиция: команда Deckhouse продолжает поддерживать ingress-nginx на всём жизненном цикле платформы и предоставляет путь миграции на Gateway API для тех, кому нужны его возможности.
Источник: Deckhouse — Ingress support
Рекомендуемая литература
Официальная документация
- Gateway API — документация
- Gateway API — HTTPRoute
- Gateway API — ReferenceGrant
- Gateway API — миграция с Ingress
- Deckhouse — ALB и Gateway API
- Deckhouse — ALB Ingress
- Deckhouse — Поддержка ingress-nginx
- gateway-api.sigs.k8s.io.
Статьи и блоги
- Что такое API-шлюзы и Gateway API — Flant на Habr.
- Основное про API-шлюз в Kubernetes — Habr.
- Kubernetes для начинающих: что такое Pod и как с ним работать — Flant на Habr.
- Основные концепции сетевой архитектуры Kubernetes — Habr.
- Миграция с ingress-nginx: выбор нового контроллера — Habr.
Книги
- Marko Lukša. Kubernetes in Action. 2nd ed., 2022. ISBN 978-1617297618.
- Kelsey Hightower, Brendan Burns, Joe Beda. Kubernetes: Up and Running. 3rd ed., 2022. ISBN 978-1098110201.
- Michael Hausenblas, Stefan Schimanski. Programming Kubernetes. 2019. ISBN 978-1492047107.
Связанные материалы
- Предыдущий урок: M1.08 — Ingress.
- Следующий урок: M1.10 — Jobs/CronJobs.
- Забегая вперёд: M1.11 — RBAC (та же логика разделения прав); M2 урок 1 (граница Application/Module).
✓ Урок пройден — все вопросы самопроверки отвечены верно