Миграция с Ingress на Gateway API
Gateway API — это современная альтернатива Ingress. В Ingress функции балансировщика и управление правилами маршрутизации объединены в одном объекте Service типа Loadbalancer. В Gateway API для этого используются два отдельных объекта:
- Gateway – определяет сетевые точки входа и правила маршрутизации трафика к кластеру;
- HTTPRoute – определяет правила маршрутизации трафика к сервисам.
Такое разделение позволяет сделать инфраструктуру более удобной в обслуживании. Подробнее о различиях Ingress и Gateway API в подразделе Key Differences Between Ingress API и Gateway API инструкции Migrating from Ingress в документации Gateway API.
Принцип миграции
При работе c Ingress и Gateway API используются разные объекты Kubernetes. Основные объекты:
- Ingress — IngressClass и Ingress;
- Gateway API — GatewayClass, Gateway и HTTPRoute.
Для миграции нужно заменить объекты Ingress на объекты Gateway API.
Чтобы упростить миграцию, часть объектов можно преобразовать автоматически с помощью утилиты:
ingress2gateway— официальная утилита. Преобразует объекты Ingress в объекты Gateway API. Например, объект Service типа Loadbalancer в объекты Gateway и HTTPRoute;- или
ingress2eg— неофициальная экспериментальная версия утилитыingress2gateway. Дополнительно из аннотаций NGINX генерирует объекты, которые специфичны для Envoy Gateway CRD (Custom Resource Definition). Например, BackendTrafficPolicy и SecurityPolicy.
Объекты, которые нельзя преобразовать автоматически нужно добавить вручную. Например, объект GatewayClass.
Пример миграции с Ingress NGINX на Envoy Gateway
- Проверьте квоты.
- Установите Envoy Gateway.
- Создайте объект EnvoyProxy.
- Создайте объект GatewayClass.
- Преобразуйте объекты Ingress в Gateway API.
1. Проверить квоты
Убедитесь, что в пуле выделена квота минимум на один публичный IP-адрес и облачный балансировщик нагрузки. Для этого посмотрите потребление квот облачной платформы.
2. Установить Envoy Gateway
Используйте инструкцию Установить Envoy Gateway.
3. Создать объект EnvoyProxy
-
Создайте yaml-файл
envoyproxy.yamlс манифестом для объекта EnvoyProxy.Пример манифеста EnvoyProxy:
apiVersion: gateway.envoyproxy.io/v1alpha1kind: EnvoyProxymetadata:name: custom-proxy-confignamespace: defaultspec:provider:type: Kuberneteskubernetes:envoyDaemonSet: {}envoyService:externalTrafficPolicy: ClusterЗдесь:
externalTrafficPolicy: Clusterуказывает, что все ноды будут принимать участие в балансировке трафика;envoyDaemonSet: {}указывает, что реплики Envoy будут запущены на всех нодах.
-
Примените манифест:
kubectl apply -f envoyproxy.yamlЗдесь
envoyproxy.yaml— имя yaml-файла с манифестом для создания объекта EnvoyProxy. -
Убедитесь, что объект EnvoyProxy создан:
kubectl get envoyproxy -n default
4. Создать объект GatewayClass
Чтобы использовать HTTPRoutes, нужен GatewayClass, который будет связан с контроллером Envoy Gateway.
-
Создайте yaml-файл
gatewayclass.yamlс манифестом для объекта GatewayClass.Пример манифеста GatewayClass:
apiVersion: gateway.networking.k8s.io/v1kind: GatewayClassmetadata:name: egspec:controllerName: gateway.envoyproxy.io/gatewayclass-controllerparametersRef:group: gateway.envoyproxy.iokind: EnvoyProxyname: custom-proxy-confignamespace: default -
Примените манифест:
kubectl apply -f gatewayclass.yamlЗдесь
gatewayclass.yaml— имя yaml-файла с манифестом для создания объекта GatewayClass. -
Убедитесь, что объект GatewayClass создан:
kubectl get gatewayclass
5. Преобразовать объекты Ingress в Gateway API
Если вы используете NGINX с аннотациями, используйте утилиту ingress2eg.
ingress2gateway
ingress2eg
-
Установите утилиту ingress2gateway.
-
Преобразуйте объекты Ingress в объекты Gateway API. Все изменения будут только выведены в консоли и не будут сразу применены. Например:
ingress2gateway print -A --providers ingress-nginx > gateway-resources.yamlЗдесь:
--providers ingress-nginx— флаг для контроллера, с которого вы мигрируете;-A— флаг, который указывает, что смотреть манифесты Ingress нужно во всех пространствах имен (namespace);gateway-resources.yaml— имя yaml-файла с манифестами для новых объектов.
-
Откройте сохраненный файл
gateway-resources.yaml. -
Если был сгенерирован манифест Gateway:
4.1. В поле
gatewayClassNameзаменитеnginxнаeg.4.2. Если вы используете HTTPS, укажите путь до секрета с сертификатом домена.
Пример манифеста Gateway для HTTPS-протокола:
apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata:name: example-gatewaynamespace: defaultspec:gatewayClassName: eglisteners:- name: httpshostname: "*.example.com"port: 443protocol: HTTPSallowedRoutes:namespaces:from: Alltls:mode: TerminatecertificateRefs:- name: wildcard-certname-tlsnamespace: secret-namespacekind: Secret -
Создайте объекты, указанные в манифестах:
kubectl apply -f gateway-resources.yaml -
Убедитесь, что все объекты созданы:
kubectl get gateways -Akubectl get httproutes -A -
Убедитесь, что ваши сервисы доступны по новому IP-адресу, который автоматически назначен новому облачному балансировщику. IP-адрес балансировщика можно посмотреть в панели управления: в верхнем меню нажмите Продукты и выберите Облачные серверы → раздел Балансировщики → вкладка Балансировщики → карточка балансировщика.