Учебное пособие по Kubernetes Gateway API: замена Ingress на Cilium Gateway для HTTP-трафика
Введение
Управление трафиком в Kubernetes значительно изменилось с момента появления контроллеров Ingress. Хотя Ingress в Kubernetes послужил основой для маршрутизации HTTP-трафика, он быстро выявил ограничения в сложных, многопользовательских средах.
Представьте, что вы работаете над растущей платформой Kubernetes, где вам необходимо:
- Безопасно предоставляйте услуги между несколькими командами
- Реализовать продвинутую маршрутизацию на основе заголовков и параметров запроса
- Управляйте политиками трафика без аннотаций, специфичных для поставщика.
- Масштабируйте управление трафиком без операционной сложности
Здесь Kubernetes Gateway API меняет ваш подход к сетевому взаимодействию сервисов. Являясь следующим этапом развития после Ingress, Gateway API предоставляет ориентированный на роли, расширяемый и нейтральный к производителям способ управления HTTP и HTTPS трафиком в кластерах Kubernetes.
Вы изучите Gateway API, используя Cilium Gateway на DigitalOcean Kubernetes (DOKS), что означает отсутствие необходимости в развертывании дополнительных контроллеров и нативную интеграцию CNI.
В этом обширном руководстве вы узнаете о основах Gateway API и реализуете готовый к производству HTTP-сервис с расширенными возможностями маршрутизации, используя нативную поддержку Gateway от Cilium.
Ключевые выводы
Этот всесторонний учебник по API шлюза Kubernetes охватывает все, от основных понятий до развертывания в производственной среде:
Основные концепции и архитектура
- Gateway API против Ingress Controller: Поймите основные различия и когда переходить от традиционного Ingress
- Реализация Cilium Gateway: Используйте нативную поддержку Cilium в DOKS для развертывания API Gateway с нулевыми затратами.
- Модель Ресурсов на Основе Ролей: Разделение Master GatewayClass, Gateway и HTTPRoute для улучшения сотрудничества в команде
Практическая реализация
- Маршрутизация HTTP-трафика: Настройте маршрутизацию на основе пути, соответствие заголовкам и фильтрацию параметров запроса
- Современное управление трафиком: Реализация разделения трафика, балансировки нагрузки и маршрутизации между пространствами имен
- Запуск производства: Настройка интеграции DNS с ExternalDNS и правильное обнаружение сервисов
Лучшие практики и оптимизация
- Многоарендные среды: Разработайте масштабируемые конфигурации шлюзов для нескольких команд
- Соображения безопасности: Реализуйте надлежащие контроль доступа и политики трафика
- Мониторинг и наблюдаемость: Интеграция с решениями для мониторинга, предназначенными для Kubernetes
Предварительные требования: Базовые знания Kubernetes и работающий кластер DOKS. Новичок в Kubernetes? Начните с нашего руководства по основам Kubernetes.
Предварительные условия
Перед началом этого руководства убедитесь, что у вас есть:
- Работающий VPC Native кластер DigitalOcean Kubernetes (версия 1.33+)
kubectlустановлен и настроен для общения с вашим кластером- Установлены CRD API шлюза (DOKS включает Cilium, который поддерживает это по умолчанию)
- Зарегистрированное имя домена и доступ к DNS
Примечание: Нужна помощь с предварительными требованиями? Ознакомьтесь с этими руководствами:
- Создайте кластер DOKS
- Установите и настройте kubectl
- Настройте DNS с помощью DigitalOcean
Обратите внимание, что в домене dolearn.xyz используются в примерах, обязательно замените эти ссылки на ваш собственный домен.
Почему Gateway API? Лучший способ обработки HTTP маршрутизации
Если вы работали с Kubernetes Ingress, вы, вероятно, ощутили его ограничения. Хотя Ingress открыл путь для экспонирования HTTP(S) нагрузок, он быстро проявил свои недостатки:
- Полагание на аннотации, специфичные для контроллера, для расширенных функций
- Борьба с многоарендными настройками
- Размывание границ ответственности между инфраструктурными командами и разработчиками
По мере усложнения платформ, подумайте о многокомандных средах, канарейках и тонкой настройке трафика, использование только Ingress начинает ощущаться как решение на скорую руку.
Здесь вступает в дело Gateway API. Разработанный Kubernetes SIG-Network как следующая эволюция сетевого сервиса, он предлагает ориентированную на роли, портативную и расширяемую модель для маршрутизации трафика.
Если вы новичок в сетевом взаимодействии Kubernetes, сначала ознакомьтесь с нашим руководством по основам сетевого взаимодействия Kubernetes, чтобы понять базовые принципы.
Ключевые преимущества Gateway API над Ingress**
1. Богатая, выразительная маршрутизация
Перейдите за простое соответствие хост/путь. Gateway API поддерживает условия заголовков, параметры запроса и взвешенное разделение трафика из коробки, что делает канарейные релизы, A/B тесты и развертывания blue-green полноценными гражданами, а не хаками, спрятанными в аннотациях.
2. Четкое разделение ролей
API шлюза вводит четкое разделение обязанностей с использованием трех видов ресурсов:
- Поставщики инфраструктуры определяют GatewayClass
- Кластерные операторы развертывают Шлюз
- Разработчики определяют HTTPRoute (или другие ресурсы маршрутов, такие как GRPCRoute)
Мы более подробно рассмотрим каждый ресурс позже в этом учебном пособии.
Эти ресурсы предотвращают наложение разрешений, упрощают управление и естественным образом вписываются в рабочие процессы нескольких команд.
3. Готовность к перекрёстным пространствам имен и многопользовательской среде
API Gateway изначально поддерживает маршрутизацию между разными пространствами имен, что идеально подходит для крупных платформ или организаций, где службы и команды охватывают несколько пространств имен.
4. Независимый от поставщика и портативный
Больше не будет зависимости от поставщиков. Gateway API определяет стандартные CRD, так что ваша логика маршрутизации может беспрепятственно перемещаться между контроллерами от разных поставщиков.
5. Продвинутое управление движением, без аннотационного хаоса
Попытки, зеркалирование, фильтры и политики трафика являются первоклассными конструкциями или четко определенными расширениями. Нет необходимости полагаться на недокументированные аннотации или специфические для поставщика хаки.
Интеграция DOKS и Cilium
В DigitalOcean Kubernetes (DOKS) Cilium является реализацией CNI по умолчанию. Это имеет важные последствия для команд, выбирающих между Ingress и Gateway API:
Если вы продолжите использовать Ingress, вы будете нести ответственность за управление собственным контроллером входящего трафика (NGINX, HAProxy, Traefik и т. д.). Это означает дополнительные затраты — развертывание, поддержание его работоспособности и отслеживание обновлений.
С Gateway API эта проблема исчезает. Поскольку DOKS поставляется с Cilium по умолчанию, поддержка Gateway API уже встроена. HTTP-маршрутизация становится родной, полностью управляемой функцией контрольной плоскости, без дополнительных компонентов, которые вам нужно поддерживать.
Для получения дополнительной информации смотрите наши руководство по настройке кластера DOKS и функциям сетевой связи Cilium.
Структурные элементы API шлюза
GatewayClass
Класс шлюза определяет тип шлюза, который может использовать ваш кластер. Think of it as a шаблон, который говорит Kubernetes как должны вести себя шлюзы. В нашем случае класс шлюза — это Cilium. Класс шлюза создается и управляется DigitalOcean.
Шлюз
Ворота — это экземпляр класса GatewayClass. Они представляют собой фактическую точку входа в ваш кластер, поддерживаемую балансировщиком нагрузки в облачной настройке. Ворота создаются кем-то из команды DevOps или на платформе, обычно это команда, которая управляет кластерами Kubernetes и общей инфраструктурой.
Врата объединяют три основных вещи:
-
ИмяКлассаШлюза
- Привязывает шлюз к конкретной реализации.
-
Слушатели
- Это похоже на “пункты въезда” в кластер.
-
Слушатель указывает:
- Протокол (например, HTTP, HTTPS, TCP, gRPC).
- Порт (например, 80 или 443).
- Имя(на) хоста(ов) (например,
example.com,*.app.io). - TLS терминция (если шлюз должен обрабатывать сертификаты).
- Правила привязки маршрутов — какие виды маршрутов могут быть связаны здесь.
- По сути, слушатели — это то, как вы определяете какой тип трафика этот шлюз готов принимать и обрабатывать.
-
Адреса
- Фактические IP-адреса или фронтенды балансировщика нагрузки, которые предоставляет контроллер Gateway.
- Это может быть облачный балансировщик нагрузки, кластерный IP или даже просто настройка узлового порта, в зависимости от вашей среды.
HTTP маршруты
Определяет правила маршрутизации HTTP для одного или нескольких сервисов в вашем кластере. HTTPRoutes обычно создаются разработчиками.
HTTPRoute состоит из:
- Ссылки на родителей
Они определяют, к каким Шлюзам и каким конкретным слушателям на этих Шлюзах данный маршрут может быть прикреплен. -
Имена хостов
- HTTP маршруты могут сузить круг соответствующих им имен хостов (например, api.example.com, shop.example.com).
- Если несколько маршрутов используют шлюз, имена хостов гарантируют, что трафик направляется к правильному бэкенду.
Правила
- Где происходит совпадение и маршрутизация. Вы можете сопоставлять на основе:
/api, /shop)X-Canary: true).Давайте развернем образец приложения и откроем его с помощью Шлюза и HTTPRoute.
Шаг 1 — Разверните пример приложения
Выполните эту команду из вашего терминала (убедитесь, что у вас настроен kubectl для подключения к вашему кластеру Kubernetes на DigitalOcean):
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/bookinfo/platform/kube/bookinfo.yaml
Применение манифеста bookinfo.yaml запускает четыре микросервиса Bookinfo: productpage, details, reviews и ratings — с ядром
- Сервисы на порту
9080, чтобы сделать каждый микросервис доступным для обнаружения. - Развертывания для запуска Pods (подробности и оценки имеют v1, productpage имеет v1, а reviews имеют v1, v2 и v3).
- Служебные аккаунты, чтобы дать каждой службе свою собственную личность.
Шаг 2 — Разверните шлюз Cilium
Когда вы создаете Шлюз, вы также решаете, как он будет разделяться:
-
Выделенный шлюз: Развернут в том же пространстве имен, что и приложение и его HTTPRoutes. Эта модель хорошо работает, когда каждая команда или приложение владеет своим собственным шлюзом.
-
Общий шлюз: Развернут в другом пространстве имен и используется несколькими приложениями. В этом случае владелец шлюза должен явно разрешить другим пространствам имен прикреплять маршруты, используя поле allowedRoutes.
Для нашего варианта использования давайте создадим выделенный шлюз.
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: cilium-gateway-http spec: gatewayClassName: cilium listeners: - protocol: HTTP port: 80 name: web-gw allowedRoutes: namespaces: from: Same
шлюз и HTTP Routes приложения находятся в одном пространстве имен. Только команда sample-app может прикреплять маршруты к нему, что обеспечивает изоляцию маршрутизации и предотвращает использование этой точки входа другими командами/пространствами имен.
После применения вышеуказанного манифеста будут созданы два ресурса: шлюз и служба типа LoadBalancer. Обратите внимание, что создание балансировщика нагрузки и отображение его IP-адреса может занять несколько минут.
kubectl get gateways
NAME CLASS ADDRESS PROGRAMMED AGE cilium-gateway-http cilium 134.209.130.13 True 47m
kubectl get svc -o wide | grep LoadBalancer
cilium-gateway-cilium-gateway-http LoadBalancer 10.108.72.44 138.197.230.74 80:32015/TCP 50m <none>
Шаг 3 — Создайте HTTPRoute
Как только у вас будет настроен Gateway, следующим шагом будет определение HTTPRoutes. Они указывают Gateway, как направлять входящие запросы к вашим сервисам приложения.
apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: http-app-test spec: parentRefs: - name: cilium-gateway-http hostnames: - "httptest.dolearn.xyz" rules: - matches: - path: type: PathPrefix value: /details backendRefs: - name: details port: 9080 - matches: - headers: - type: Exact name: magic value: foo queryParams: - type: Exact name: great value: example path: type: PathPrefix value: / method: GET backendRefs: - name: productpage port: 9080
Что это делает?
-
Ссылки на шлюз
parentRefsуказывает на шлюзcilium-gateway-httpвтаком жепространстве имен.
- Это говорит кластеру, какой шлюз должен обрабатывать эти маршруты.
-
Определяет имена хостов
- Запросы к
httptest.dolearn.xyzбудут соответствовать этому HTTPRoute.
- Запросы к
-
Устанавливает правила маршрутизации
Первое правило: Запросы с путями, начинающимися с/details, отправляются в сервисdetailsна порту 9080.-
Второе правило: Запросы с
- Заголовок
magic: foo
- Заголовок
-
- Параметр запроса
great=example - Путь, начинающийся с
/ - Метод
GET
направляется на сервисproductpageна порту 9080.
Шаг 4 — Настройка ExternalDNS с DigitalOcean (необязательно)
ExternalDNS автоматизирует управление записями DNS у вашего провайдера (в данном случае, DigitalOcean) на основе ресурсов Kubernetes, таких как Сервисы, Ingress и маршруты Gateway API.
1. Создайте токен API DigitalOcean
Вам понадобится персональный токен доступа с правами на запись для управления записями DNS.
2. Сохраните токен как секрет Kubernetes
Создайте секрет Kubernetes, который ExternalDNS будет использовать для аутентификации с DigitalOcean:
kubectl create secret generic digitalocean-dns --from-literal=access-token=<YOUR_DIGITALOCEAN_TOKEN>
3. Добавьте репозиторий Helm ExternalDNS
helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/ helm repo update
4. Настройка значений для развертывания Helm
env: # Passes the DigitalOcean token from the secret - name: DO_TOKEN valueFrom: secretKeyRef: name: digitalocean-dns key: access-token provider: # ExternalDNS provider configuration name: digitalocean policy: sync # Ensures ExternalDNS continuously reconciles DNS records txtOwnerId: gateway-api # Ensures ExternalDNS does not conflict others using this domain sources: # Kubernetes resources to watch and create DNS records for - service - ingress - gateway-grpcroute - gateway-httproute
5. Установите ExternalDNS
Разверните ExternalDNS с помощью Helm:
helm install external-dns external-dns/external-dns -f values.yaml
6. Проверьте DNS записи
После развертывания ExternalDNS должен автоматически создавать записи DNS для ваших Сервисов/Ingress.
Вы можете проверить по следующим данным:
dig +short httptest.dolearn.xyz 138.197.230.74
Ссылка: https://kubernetes-sigs.github.io/external-dns/latest/
В качестве альтернативы, вы можете вручную добавить записи DNS: https://docs.linux-console.net/products/networking/dns/how-to/manage-records/
Шаг 5 — Выполнение HTTP-запросов
Теперь, когда шлюз готов, вы можете отправлять HTTP-запросы к приложению, используя сервис.
curl --fail -s http://httptest.dolearn.xyz/details/1 | jq
{ "id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890" }
curl -v -H 'magic: foo' http://httptest.dolearn.xyz?great=example
* Host httptest.dolearn.xyz:80 was resolved. * IPv6: (none) * IPv4: 134.209.130.13 * Trying 134.209.130.13:80... * Connected to httptest.dolearn.xyz (134.209.130.13) port 80 > GET /?great=example HTTP/1.1 > Host: httptest.dolearn.xyz > User-Agent: curl/8.7.1 > Accept: */* > magic: foo > * Request completely sent off < HTTP/1.1 200 OK < content-type: text/html; charset=utf-8 < content-length: 1683 < server: envoy < date: Mon, 25 Aug 2025 13:21:59 GMT < x-envoy-upstream-service-time: 8 < <!DOCTYPE html> <html> <head> <title>Simple Bookstore App</title> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="static/bootstrap/css/bootstrap.min.css"> <!-- Optional theme --> <link rel="stylesheet" href="static/bootstrap/css/bootstrap-theme.min.css"> </head> <body> <p> <h3>Hello! This is a simple bookstore application consisting of three services as shown below</h3> </p> <table class="table table-condensed table-bordered table-hover"><tr><th>name</th><td>http://details:9080</td></tr><tr><th>endpoint</th><td>details</td></tr><tr><th>children</th><td><table class="table table-condensed table-bordered table-hover"><tr><th>name</th><th>endpoint</th><th>children</th></tr><tr><td>http://details:9080</td><td>details</td><td></td></tr><tr><td>http://reviews:9080</td><td>reviews</td><td><table class="table table-condensed table-bordered table-hover"><tr><th>name</th><th>endpoint</th><th>children</th></tr><tr><td>http://ratings:9080</td><td>ratings</td><td></td></tr></table></td></tr></table></td></tr></table> <p> <h4>Click on one of the links below to auto generate a request to the backend as a real user or a tester </h4> </p> <p><a href="/productpage?u=normal">Normal user</a></p> <p><a href="/productpage?u=test">Test user</a></p> <!-- Latest compiled and minified JavaScript --> <script src="static/jquery.min.js"></script> <!-- Latest compiled and minified JavaScript --> <script src="static/bootstrap/js/bootstrap.min.js"></script> </body> </html> * Connection #0 to host httptest.dolearn.xyz left intact
И это всё! Вы успешно развернули образец приложения и выставили его с помощью шлюза и HTTPRoute.
Часто задаваемые вопросы
1. Как использовать Gateway API в Kubernetes?
Чтобы использовать Gateway API в Kubernetes, выполните следующие шаги:
- Установите CRD API шлюза (автоматически включается в DOKS с Cilium)
- Разверните контроллер шлюза (Cilium Gateway предустановлен на DOKS)
- Создайте ресурс GatewayClass (управляемый DigitalOcean)
- Определите шлюз для точки входа вашего трафика
- Настроить ресурсы HTTPRoute для маршрутизации, специфичной для приложения
DOKS Advantage: С Cilium в качестве стандартного CNI поддержка Gateway API встроена — дополнительная развертка контроллера не требуется.
2. В чем разница между Gateway API и контроллером Ingress?
Gateway API — это современная эволюция управления трафиком в Kubernetes:
Ограничения входа:
- Аннотации, специфичные для контроллера, для расширенных функций
- Модель единственного ресурса, смешивающая инфраструктурные и прикладные аспекты
- Ограниченная поддержка многопользовательского режима
Преимущества API шлюза:
- Ролевой дизайн: Отдельные ресурсы для инфраструктурных команд ( шлюз) и разработчиков (HTTPRoute)
- Поддержка местных функций: Разделение трафика, сопоставление заголовков, маршрутизация между пространствами имен без аннотаций
- Переносимость поставщиков: Стандартизировано для различных реализаций
3. Могу ли я перейти с Ingress на Gateway API без простоя?
Да! API Gateway поддерживает стратегии постепенной миграции:
- Параллельное развертывание: Запуск API Gateway вместе с существующими контроллерами Ingress
- Миграция по сервисам: Перемещайте приложения постепенно
- Голубо-зеленая миграция: Сначала протестируйте API шлюза с непроизводственным трафиком
- Разделение трафика: Используйте нативное разделение трафика API Gateway для канареечных развертываний.
Узнайте больше в нашем руководстве по миграции Kubernetes.
4. Как Cilium Gateway сравнивается с другими реализациями API шлюза?
Cilium Gateway предлагает уникальные преимущества на DOKS:
- Нативная интеграция CNI: Нет отдельных контроллеров или дополнительных затрат ресурсов
- Производительность на основе eBPF: Аппаратное ускорение обработки трафика
- Встроенная наблюдаемость: Интегрирована с возможностями мониторинга Cilium
- Автоматическое масштабирование: Масштабируется вместе с узлами вашего кластера без ручной настройки
5. Каковы примеры Gateway API для распространенных случаев использования?
Общие шаблоны реализации API шлюза:
Маршрутная маршрутизация на основе пути:
rules: - matches: - path: type: PathPrefix value: /api backendRefs: - name: api-service
Маршрутизация на основе заголовков:
rules: - matches: - headers: - name: "version" value: "v2" backendRefs: - name: api-v2-service
Разделение трафика:
backendRefs: - name: service-v1 weight: 80 - name: service-v2 weight: 20
6. Готов ли Gateway API для производственных сред?
Абсолютно! Gateway API получил статус GA и готов к использованию в производстве:
- Стабильное API: v1 API гарантирует обратную совместимость
- Широкое применение: Используется крупнейшими облачными провайдерами и предприятиями
- Активная разработка: Непрерывные улучшения и добавление новых функций
- Сильная экосистема: Увеличивающееся количество реализаций и инструментов
На DOKS: Cilium Gateway полностью поддерживается и рекомендуется для производственных нагрузок.
Заключение
Поздравляю! Вы успешно реализовали готовую к производству настройку Kubernetes Gateway API с Cilium. Вот что вы достигли:
- Развернуты микросервисы Bookinfo с правильным обнаружением службы
- Создан шлюз Cilium, использующий нативную интеграцию CNI DOKS
- Настроенные продвинутые правила HTTPRoute с маршрутизацией на основе пути и заголовков
- Настройте автоматизированное управление DNS с интеграцией ExternalDNS
- Тестировались реальные сценарии движения с несколькими условиями маршрутизации
Следующие шаги
Теперь, когда у вас есть прочная основа API Gateway, подумайте о следующих расширенных реализациях:
- Готовность DOKS к эксплуатации, Часть 2: Включение HTTPS
- Настройте аутентификацию OAuth с внешними провайдерами
- Настройте мониторинг Prometheus для метрик Gateway
Изучите нашу обширную библиотеку учебников по Kubernetes, охватывающую все, от основ до корпоративных паттернов.
Присоединяйтесь к сообществу DigitalOcean, чтобы делиться своими реализациями Gateway API и учиться у других разработчиков.



Добавить комментарий