APISIX Service Mesh с использованием Istio и Amesh
June 16, 2023
Apache APISIX в основном используется для обработки трафика "север-юг" и часто находится на границе между клиентскими приложениями и серверными службами.
С помощью APISIX Ingress Controller APISIX также может управлять входящим и исходящим трафиком в кластерах Kubernetes с использованием нативной конфигурации.
Однако по мере того, как организации переходят на микросервисы, возникает новая задача — управление трафиком "восток-запад" между этими микросервисами.
Сервисные сетки, такие как Istio, решают эту проблему, снимая с разработчиков микросервисов ответственность за сетевую часть и предоставляя дополнительный сетевой уровень L4/L7.
С новой библиотекой Amesh и Istio, Apache APISIX также может использоваться как сервисная сетка, а именно как плоскость данных для Istio, предоставляя все свои возможности управления трафиком для взаимодействия между сервисами.
В этой статье мы рассмотрим, что такое Amesh, как она была разработана и как используется для интеграции APISIX в сервисную сетку.
Istio и протокол xDS
Istio — одна из самых популярных сервисных сеток.
Под капотом Istio использует Envoy в качестве обратного прокси в своих sidecar-контейнерах.

Istio управляет трафиком, динамически настраивая sidecar-контейнеры с помощью xDS API Envoy.
xDS API — это способ настройки Envoy с использованием инкрементальных изменений вместо простых конфигураций с использованием статических файлов.
Хотя изначально эти API предназначались для настройки Envoy, они эволюционировали в универсальный API плоскости данных. Любой прокси плоскости данных может реализовать эти API, а любая плоскость управления может использовать этот API для работы с этими прокси плоскости данных.
В Istio это означает, что вы можете заменить стандартную плоскость данных Envoy на любую плоскость данных, которая реализует xDS API. Таким образом, вы можете заменить Envoy на APISIX, чтобы получить его возможности управления трафиком в сервисной сетке.
Однако APISIX не поддерживает xDS API "из коробки". И здесь на помощь приходит Amesh.
Amesh
Amesh — это библиотека, которая преобразует данные из плоскости управления Istio в конфигурацию APISIX.

APISIX заменяет Envoy в качестве плоскости данных для Istio.
Istio взаимодействует с плоскостью данных через xDS API. Amesh поддерживает эти API и затем преобразует их в конфигурацию APISIX.
Это похоже на то, как работают APISIX и APISIX Ingress Controller. Ingress Controller преобразует конфигурации, определенные с использованием Ingress или Gateway API, в формат APISIX.
Поскольку xDS API поддерживаются другими сервисными сетками, такими как Linkerd и Open Service Mesh, APISIX также может работать с ними с помощью библиотеки Amesh. Amesh находится на ранних стадиях разработки и в настоящее время работает с Istio v1.13.1.
С Amesh + APISIX вы можете использовать Istio как обычно. Как только вы настроите правила трафика с помощью виртуального сервиса Istio, APISIX сможет реализовать эти правила.
Расширенные возможности APISIX предоставляются через его 80+ плагинов. Чтобы использовать плагины APISIX с Istio, мы развертываем компонент плоскости управления Amesh, называемый Amesh Controller.
Amesh Controller принимает конфигурацию плагина, определенную с помощью CRD AmeshPluginConfig, и преобразует ее в конфигурацию плагина APISIX.
Все это позволит нам использовать полные возможности APISIX внутри sidecar-контейнеров.
APISIX + Istio Mesh
Давайте применим все, что мы узнали, на практике.
Мы создадим образы Amesh, настроим Istio для использования sidecar-контейнеров APISIX, развернем Istio и протестируем все, запустив пример приложения.
Сборка образов
Мы создадим три образа:
- amesh-iptables: используется для создания init-контейнера, который настраивает правила iptables. Эти правила направляют весь трафик через APISIX.
- amesh-sidecar: используется для создания sidecar-контейнера.
- amesh-controller: используется для создания компонента плоскости управления Amesh Controller. Этот контроллер используется для настройки плагинов APISIX.
Сначала клонируйте репозиторий Amesh:
git clone https://github.com/api7/Amesh.git cd Amesh
Вы можете собрать и отправить эти образы в свой собственный реестр.
Перед запуском сборки добавьте адрес вашего реестра в переменную окружения, как показано ниже:
export REGISTRY="docker.io/navendu" make prepare-images
Если вы не хотите собирать свои собственные образы, вы можете использовать следующие образы:
docker pull navendup/amesh-iptables:dev docker pull navendup/amesh-sidecar:dev docker pull navendup/amesh-controller:latest
Развертывание Amesh Controller и установка CRD
Мы будем использовать Helm для развертывания всего в кластере Kubernetes. В этих примерах я использую minikube.
Сначала создадим новое пространство имен istio-system:
kubectl create namespace istio-system
Чтобы развернуть Amesh Controller, выполните:
helm install amesh-controller -n istio-system \ ./controller/charts/amesh-controller
Также необходимо установить CRD для работы с Amesh Controller:
kubectl apply -k controller/config/crd/
Настройка и развертывание Istio + APISIX
Перед развертыванием сервисной сетки зададим несколько переменных окружения:
export ISTIO_RELEASE=1.13.1 export REGISTRY="docker.io/navendup"
Затем мы используем Helm для развертывания сервисной сетки:
helm install amesh \ --namespace istio-system \ --set pilot.image=istio/pilot:"$ISTIO_RELEASE" \ --set global.proxy.privileged=true \ --set global.proxy_init.image="$REGISTRY"/amesh-iptables:dev \ --set global.proxy.image="$REGISTRY"/amesh-sidecar:dev \ --set global.imagePullPolicy=IfNotPresent \ --set global.hub="docker.io/istio" \ --set global.tag="$ISTIO_RELEASE" \ ./charts/amesh
Теперь у нас развернута сервисная сетка и Amesh Controller. Далее развернем пример приложения для тестирования нашей сервисной сетки.
Развертывание Bookinfo
Мы будем использовать пример приложения Bookinfo от Istio.
Сначала добавим метку в пространство имен по умолчанию, чтобы автоматически внедрять sidecar-контейнеры в любой под в этом пространстве имен:
kubectl label ns default istio-injection=enabled
Затем мы можем развернуть Bookinfo, выполнив:
kubectl apply -f e2e/bookinfo/bookinfo.yaml
Это запустит приложение Bookinfo, и каждый из подов будет иметь sidecar-контейнеры APISIX:
$ kubectl get pods NAME READY STATUS RESTARTS AGE details-v1-79f774bdb9-cbn87 2/2 Running 0 55s productpage-v1-6b746f74dc-tntc8 2/2 Running 0 55s ratings-v1-b6994bb9-r5j45 2/2 Running 0 55s reviews-v1-545db77b95-n657s 2/2 Running 0 55s reviews-v2-7bf8c9648f-zn97s 2/2 Running 0 55s reviews-v3-84779c7bbc-wn8k2 2/2 Running 0 55s
Тестирование сетки
Для доступа к приложению Bookinfo нам понадобится ingress-шлюз.
Вы можете использовать APISIX для этого ingress-шлюза, но это тема для другого раза. Пока что мы можем просто использовать port-forward для доступа к сервису product-page:
kubectl port-forward productpage-v1-6b746f74dc-tntc8 9080:9080
Теперь, если мы откроем localhost:9080, мы сможем увидеть наше примерное приложение.

Каждый раз, когда вы обновляете страницу, отзывы загружаются из разных версий сервиса reviews (мы развернули три версии).
Теперь применим правило с использованием виртуальных сервисов, которое направляет весь трафик на версии v1 сервисов.
Правило самоочевидно, и оно будет выглядеть так:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: productpage spec: hosts: - productpage http: - route: - destination: host: productpage subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - route: - destination: host: ratings subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: details spec: hosts: - details http: - route: - destination: host: details subset: v1 ---
Вы можете применить его к своему кластеру, выполнив:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/bookinfo/networking/virtual-service-all-v1.yaml
Теперь, если мы вернемся к нашему приложению и обновим страницу, оно перестанет переключаться между несколькими версиями сервиса reviews и будет направлять трафик только на версию v1.

Обратите внимание, как изменился вид раздела отзывов. Он останется таким же, даже если вы обновите страницу.
Подводя итог, мы настраиваем правило в Istio, и Istio реализует его с помощью своих sidecar-контейнеров с использованием Apache APISIX. Отлично!
Amesh в будущем
Amesh — это экспериментальный проект, и он все еще находится на ранних стадиях разработки.
Будущие версии проекта направлены на поддержку большего количества функций через виртуальные сервисы.
Вы можете внести свой вклад в улучшение проекта или следить за новыми версиями на GitHub.